打印

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

[复制链接]
7508|25
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
使用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厂家提供方案

使用特权

评论回复
板凳
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

使用特权

评论回复
5
lxyppc| | 2011-4-8 08:38 | 只看该作者
还有STM32的SPI触发好像不是数据发送完成触发的,而是数据寄存器为空触发。也就是说,有可能最后一个时钟上升沿还没来就触发了SPI发送完成标志
最好在SPI和DMA之间加个TIMER,延时一下
不知道我说清楚木有

使用特权

评论回复
6
yzyang2004|  楼主 | 2011-4-8 09:13 | 只看该作者
没清楚您的意思。

使用特权

评论回复
7
lxyppc| | 2011-4-8 09:15 | 只看该作者
SPI发送完成后可以触发一个DMA传送
你可以利用这个DMA传送一个数据到IO口,模拟出NSS信号

使用特权

评论回复
8
yzyang2004|  楼主 | 2011-4-8 09:16 | 只看该作者
如此一来,也就是说我的程序必须停留在SPI发数此处?

使用特权

评论回复
9
yzyang2004|  楼主 | 2011-4-8 09:22 | 只看该作者
跟我贴出的时序图一致的想法吗?我想这些事情让硬件去处理,不想占用CPU执行时间性

使用特权

评论回复
10
heuyck| | 2011-4-8 09:27 | 只看该作者
本来我也想用DMA,但是用了DMA主模式没法自动拉高NSS,头疼啊。
如果可以设置NSS在传输前提前1个CLK有效,传输完延后1各CLK无效,然后这个提前延后的时间可以按N*CLK来设置,就完全解决了各种SPI从芯片的时序要求了。
可惜设计者不为用户着想 哎

使用特权

评论回复
11
lxyppc| | 2011-4-8 09:35 | 只看该作者
如此一来,也就是说我的程序必须停留在SPI发数此处?
yzyang2004 发表于 2011-4-8 09:16

你的程序没有停留,DMA是硬件去实现的,不会影响你的程序

使用特权

评论回复
12
yzyang2004|  楼主 | 2011-4-8 09:45 | 只看该作者
但DMA已经去管控NSS脚的触发了啊,程序不是停留在循环SPI发数此处吗?
10楼你现在是怎么解决这个问题的

使用特权

评论回复
13
lxyppc| | 2011-4-8 09:48 | 只看该作者
STM32的timer可以设置成one pluse的模式,也就是上溢之后就不再计数了,除非下一次有东西触发它
我们可以用SPI来触发这个Timer开始计数,这样当SPI发送完成,Timer就开始计数
当timer计数溢出之后,就会停止,等待SPI的再一次发送完成

使用特权

评论回复
14
yzyang2004|  楼主 | 2011-4-8 09:49 | 只看该作者
我现在是这样做的,但这样做时序偏差很大,不稳定
        SPI1->DR = TxData;                               //发送一个byte                
        while((SPI1->SR & (1 << 1)) == 0)        ;        //等待发送区空               
        LATCH= 0;
        //等待数据发完         
        __nop();        ............
        LATCH = 1;       
        __nop();        ............

使用特权

评论回复
15
lxyppc| | 2011-4-8 09:49 | 只看该作者

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

DATA   XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

NSS 实际上是timer的一个输出

A点,SPI发送数据完成,触发timer开始计数
B点,Timer计数结束,等待下一次SPI完成的事件来触发
    A与B的间距通过Timer的计数值来调整

使用特权

评论回复
16
janeslee| | 2011-4-8 12:01 | 只看该作者
上面的LATCH在SPI发送完成中断里面实现不行吗

使用特权

评论回复
17
lxyppc| | 2011-4-8 12:46 | 只看该作者
如果在中断中实现有可能在处理时下个数据的第一位已经发出去了

使用特权

评论回复
18
lyn3210| | 2011-4-8 16:29 | 只看该作者
用模似IO比较好,因为高速的SPI应节约用。

使用特权

评论回复
19
john_light| | 2011-4-8 16:46 | 只看该作者
硬件在完善的前提下就优先使用,利用中断方式驱动可以解放CPU。

以常用的UART为例,有了硬件的UART,谁还劳神伤脑用I/O去模拟一个?

使用特权

评论回复
20
xjwbh| | 2011-4-8 18:44 | 只看该作者
NSS的这个问题是比较闹心的,也不知道ST一直将NSS置低有什么意义,那我还不如直接在初始化的时候就用一个IO置一下呢,另外我更但心这个片选一直有效,我用SPI将显存中的数据不停的送往LCD,如果中途sclk线上有个干扰什么的,那不是完全乱套啦,对应的地址都错位了!

使用特权

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

本版积分规则

2

主题

14

帖子

0

粉丝