打印
[STM32F4]

STM32F4系列芯片SPI接口问题求助

[复制链接]
1831|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
njit_dndxjyz|  楼主 | 2015-7-30 11:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    问题1:目前网上大多数使用STM32 spi接口都将SPI 的 cs信号配置成软件nss管理。根据STM32的编程手册发现,也可以将cs片选信号配置成Hardware NSS management,我们尝试将该片选信号配置成Hardware NSS management方式,但是发现无法将CS信号拉高,该CS信号一直保持低电平。
    问题2:将SPI接口的CS配置成软件nss管理,以下代码可以执行过去。
    u8 SPI1_ReadWriteByte(u8 TxData)
    {               
      while((SPI1->SR&1<<1)==0);                  
        SPI1->DR=TxData;                                  
      while((SPI1->SR&1<<0)==0);                  
        return SPI1->DR;  
     }   
也就是说程序不会死在 while((SPI1->SR&1<<0)==0);这个地方。
    但是如果将片选信号配置成 Hardware NSS management,那么程序就会死在 while((SPI1->SR&1<<0)==0);这个地方。
    我们理解SPI主设备读取数据线上的值,实际与片选是没有关系的,只要这个时候有SCK信号就可以了,配置成 Hardware NSS management的时候,SCK使能正常发出来的。
    问题3:SPI接口可以支持DMA模式,但是如果配置成DMA模式,那么这个时候CS是应该用软件nss管理,还是使用  Hardware NSS management?                                            


    操作:配置该CS信号为Hardware NSS management时,我们做了如下操作:
    1、使能SPI接口时钟、复用GPIO接口时钟。
    2、将相关的GPIO口复用设置为SPI的SCK MOSI MISO CS接口。
    3、将SPI CR1寄存器的第9bit ssm设置为0。Software slave management disabled
    4、将SPI CR2寄存器的第2bit ssoe设置为1.SS output is enabled in master mode and when the cell is enabled.
    5、将STM32的SPI接口设置成主设备。
    6、将SPI接口设置成双向数据模式。
    7、数据帧格式是8bit。
    8、使能SPI 接口。
   
沙发
songchenping| | 2015-7-30 13:00 | 只看该作者
你并没有说明你连接的是什么设备啊。还要根据时序图来确定一下为什么过不去。
我前段时间就遇到类似的问题。

使用特权

评论回复
板凳
njit_dndxjyz|  楼主 | 2015-7-30 13:59 | 只看该作者
你好,我连接的是SPI FLASH

使用特权

评论回复
地板
amanda_s| | 2015-7-30 14:31 | 只看该作者
在硬件NSS下,主设备发起通信后,NSS一直为低,除非DISABLE SPI。
https://bbs.21ic.com/forum.php?mo ... 1&highlight=NSS

使用特权

评论回复
5
njit_dndxjyz|  楼主 | 2015-7-30 15:23 | 只看该作者
谢谢大家的回复,但是还有个疑问一直没有解决。
  问题2:将SPI接口的CS配置成软件nss管理,以下代码可以执行过去。
    u8 SPI1_ReadWriteByte(u8 TxData)
    {               
      while((SPI1->SR&1<<1)==0);                  
        SPI1->DR=TxData;                                   
      while((SPI1->SR&1<<0)==0);                  
        return SPI1->DR;  
     }   
也就是说程序不会死在 while((SPI1->SR&1<<0)==0);这个地方。
    但是如果将片选信号配置成 Hardware NSS management,那么程序就会死在 while((SPI1->SR&1<<0)==0);这个地方。
    我们理解SPI主设备读取数据线上的值,实际与片选是没有关系的,只要这个时候有SCK信号就可以了,配置成 Hardware NSS management的时候,SCK使能正常发出来的。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

11

帖子

0

粉丝