STM32之SPI应用难题,请ST厂家提供方案

[复制链接]
8254|25
 楼主| yzyang2004 发表于 2011-4-7 22:22 | 显示全部楼层 |阅读模式
使用STM32F103C8的SPI1控制74HC595,因SPI的NSS无法硬控,而如果使用软件控制的话,103C8的程序基本上就停留在这运行,因为我的程序就是把采集的数据不停地向595发送,附上所需要的时序图,LATCH-CS的周期为2US,SCK的周期为250NS,LATCH上升沿有效,SCK上升沿有效,请大侠帮忙,谢谢!file:///e:/1.jpg
 楼主| yzyang2004 发表于 2011-4-7 22:24 | 显示全部楼层

RE: STM32之SPI应用难题,请ST厂家提供方案

1.jpg
 楼主| yzyang2004 发表于 2011-4-7 22:26 | 显示全部楼层
LATCH为595向IO口刷新数据端口,SCK为SPI1的SCK,DAT0为SPI1的MOSI口.
lxyppc 发表于 2011-4-8 08:36 | 显示全部楼层
楼主可以考虑用 SPI触发DMA驱动普通IO产生NSS
lxyppc 发表于 2011-4-8 08:38 | 显示全部楼层
还有STM32的SPI触发好像不是数据发送完成触发的,而是数据寄存器为空触发。也就是说,有可能最后一个时钟上升沿还没来就触发了SPI发送完成标志
最好在SPI和DMA之间加个TIMER,延时一下
不知道我说清楚木有
 楼主| yzyang2004 发表于 2011-4-8 09:13 | 显示全部楼层
没清楚您的意思。
lxyppc 发表于 2011-4-8 09:15 | 显示全部楼层
SPI发送完成后可以触发一个DMA传送
你可以利用这个DMA传送一个数据到IO口,模拟出NSS信号
 楼主| yzyang2004 发表于 2011-4-8 09:16 | 显示全部楼层
如此一来,也就是说我的程序必须停留在SPI发数此处?
 楼主| yzyang2004 发表于 2011-4-8 09:22 | 显示全部楼层
跟我贴出的时序图一致的想法吗?我想这些事情让硬件去处理,不想占用CPU执行时间性
heuyck 发表于 2011-4-8 09:27 | 显示全部楼层
本来我也想用DMA,但是用了DMA主模式没法自动拉高NSS,头疼啊。
如果可以设置NSS在传输前提前1个CLK有效,传输完延后1各CLK无效,然后这个提前延后的时间可以按N*CLK来设置,就完全解决了各种SPI从芯片的时序要求了。
可惜设计者不为用户着想 哎
lxyppc 发表于 2011-4-8 09:35 | 显示全部楼层
如此一来,也就是说我的程序必须停留在SPI发数此处?
yzyang2004 发表于 2011-4-8 09:16

你的程序没有停留,DMA是硬件去实现的,不会影响你的程序
 楼主| yzyang2004 发表于 2011-4-8 09:45 | 显示全部楼层
但DMA已经去管控NSS脚的触发了啊,程序不是停留在循环SPI发数此处吗?
10楼你现在是怎么解决这个问题的
lxyppc 发表于 2011-4-8 09:48 | 显示全部楼层
STM32的timer可以设置成one pluse的模式,也就是上溢之后就不再计数了,除非下一次有东西触发它
我们可以用SPI来触发这个Timer开始计数,这样当SPI发送完成,Timer就开始计数
当timer计数溢出之后,就会停止,等待SPI的再一次发送完成
 楼主| yzyang2004 发表于 2011-4-8 09:49 | 显示全部楼层
我现在是这样做的,但这样做时序偏差很大,不稳定
        SPI1->DR = TxData;                               //发送一个byte                
        while((SPI1->SR & (1 << 1)) == 0)        ;        //等待发送区空               
        LATCH= 0;
        //等待数据发完         
        __nop();        ............
        LATCH = 1;       
        __nop();        ............
lxyppc 发表于 2011-4-8 09:49 | 显示全部楼层

  1.         A                B             A            
  2.          ________________               _________
  3. NSS    _|                |_____________|         
  4.          0   1   2   3   4   5   6   7   0   1   
  5.          _   _   _   _   _   _   _   _   _   _   
  6. Clk    _| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_|

  7. DATA   XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

  8. NSS 实际上是timer的一个输出

  9. A点,SPI发送数据完成,触发timer开始计数
  10. B点,Timer计数结束,等待下一次SPI完成的事件来触发
  11.     A与B的间距通过Timer的计数值来调整
janeslee 发表于 2011-4-8 12:01 | 显示全部楼层
上面的LATCH在SPI发送完成中断里面实现不行吗
lxyppc 发表于 2011-4-8 12:46 | 显示全部楼层
如果在中断中实现有可能在处理时下个数据的第一位已经发出去了
lyn3210 发表于 2011-4-8 16:29 | 显示全部楼层
用模似IO比较好,因为高速的SPI应节约用。
john_light 发表于 2011-4-8 16:46 | 显示全部楼层
硬件在完善的前提下就优先使用,利用中断方式驱动可以解放CPU。

以常用的UART为例,有了硬件的UART,谁还劳神伤脑用I/O去模拟一个?
xjwbh 发表于 2011-4-8 18:44 | 显示全部楼层
NSS的这个问题是比较闹心的,也不知道ST一直将NSS置低有什么意义,那我还不如直接在初始化的时候就用一个IO置一下呢,另外我更但心这个片选一直有效,我用SPI将显存中的数据不停的送往LCD,如果中途sclk线上有个干扰什么的,那不是完全乱套啦,对应的地址都错位了!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

14

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部