你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

关于STM32F103的SPI主机的NSS硬件控制问题

[复制链接]
shipeng1989 提问时间:2019-6-13 20:29 /
#ifdef        SPI3_NSS_HARD
#define SPI3_CS_ENABLE             SPI_Cmd(SPI3, ENABLE)
#define SPI3_CS_DISABLE            SPI_Cmd(SPI3, DISABLE)
#else
#define SPI3_CS_ENABLE             PAout(15)=0
#define SPI3_CS_DISABLE            PAout(15)=1
#endif

void SPI3_Configuration(void)
{
        SPI_InitTypeDef  SPI_InitStructure;
        GPIO_InitTypeDef GPIO_InitStructure;

       
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3, ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);

        GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);//JTAG Disable SWDP Enable

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3  |  GPIO_Pin_4  | GPIO_Pin_5;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
        /* SPI: CS推挽输出 */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        #ifdef        SPI3_NSS_HARD
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
        #else
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        #endif
  GPIO_Init(GPIOA, &GPIO_InitStructure);

        /* SPI 初始化定义 */
  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //SPI设置为双线双向全双工
  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;                      //设置为主 SPI
  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;                  //SPI发送接收 8 位帧结构
  SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;                        //时钟悬空高
  SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;                       //数据捕获于第二个时钟沿
  #ifdef        SPI3_NSS_HARD
        SPI_InitStructure.SPI_NSS = SPI_NSS_Hard;                          //硬件控制 NSS 信号
  #else
        SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;                          //软件控制 NSS 信号
        #endif
        SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2; //波特率预分频值为2
  SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;                 //数据传输从 MSB 位开始
  SPI_InitStructure.SPI_CRCPolynomial = 7;                           //定义了用于 CRC值计算的多项式
  SPI_Init(SPI3, &SPI_InitStructure);
        #ifdef        SPI3_NSS_HARD
        SPI_SSOutputCmd(SPI3, ENABLE);
        SPI_Cmd(SPI3, DISABLE);
        #else
        SPI_Cmd(SPI3, ENABLE);
        #endif
       
        DMA_Config();
}

如上定义宏SPI3_NSS_HARD配置为硬件控制NSS输出,现烧录两个硬件:一个是采用HSI+PLL时钟64MHz,另一个采用HSE+PLL时钟72MHz。


测试如下代码:

void SFLASH_FastReadNByte(uint8_t* pBuffer, uint32_t ReadAddr, uint16_t nByte)
{
  while (PAin(15)==0);//Wait CS Disable
        SFLASH_WaitForNoBusy();
        SPI3_CS_ENABLE;                                 //使能器件
  SPI3_WriteByte(SFLASH_FAST_READ);               //《快读数据》指令
  SPI3_WriteByte((uint8_t)((ReadAddr)>>16));      //发送24bit地址
  SPI3_WriteByte((uint8_t)((ReadAddr)>>8));
  SPI3_WriteByte((uint8_t)ReadAddr);
  SPI3_WriteByte(0xFF);                           //等待8个时钟

  while(nByte--)                                 //循环读数
  {
    *pBuffer = SPI3_ReadByte();
    pBuffer++;
  }

  SPI3_CS_DISABLE;                                //失能器件
}

uint8_t SPI3_WriteByte(uint8_t TxData)
{
  while((SPI3->SR & SPI_I2S_FLAG_TXE) == (uint16_t)RESET);
  SPI3->DR = TxData;

  while((SPI3->SR & SPI_I2S_FLAG_RXNE) == (uint16_t)RESET);//发现程序会卡在此处
  return SPI3->DR;
}

发现64MHz硬件运行正常,但72MHz时钟硬件程序会卡在“while((SPI3->SR & SPI_I2S_FLAG_RXNE) == (uint16_t)RESET);”导致异常复位,而如果不采用硬件控制NSS信号输出(即不定义宏SPI3_NSS_HARD)则都不会有此问题。到底是我的代码有bug还是在运行SPI_Cmd(SPI3, ENABLE)使能SPI后到SPI正常工作有延迟。请高人指教。

收藏 评论0 发布时间:2019-6-13 20:29

举报

0个回答

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版