打印

spi help

[复制链接]
4247|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
静默|  楼主 | 2008-8-7 15:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STM32的SPI做为从设备,SCK接2M时钟。
STM32跑在32MHz上,现象:当用EXTI检测到一同步信号后,用SPI_I2S_SendData(新版的库)发送数据时看到MISO比EXTI有7--8us的延后。(EXTI中断服务程序中就一个函数SPI_I2S_SendData,EXTI设为上升沿触发)。
问1:这个现象是否正常?
问2:能否快速启动SPI的发送,以上述环境为例,检测到EXTI上升沿后最快多长时间能发出SPI数据的第一位?

谢谢!
沙发
静默|  楼主 | 2008-8-7 16:07 | 只看该作者

写错,STM32跑在36MHz上。

使用特权

评论回复
板凳
armtft| | 2008-8-7 16:23 | 只看该作者

SPI_I2S_SendData 只有一句

SPIx->DR = Data;

如果没有 assert_param(IS_SPI_ALL_PERIPH(SPIx)); 调试 的话。




呵呵。


感觉,1-2us 才是正常的。

检查一下 生成的汇编。 
看看中断、函数调用有多少指令。

如果要求速度,建议不调用SPI_I2S_SendData
直接 SPI 2 ->DR = Data;

使用特权

评论回复
地板
香水城| | 2008-8-7 16:26 | 只看该作者

你的程序中是否有其它中断?

请做下面2个测试:

1)直接操作DR寄存器,避免调用SPI_I2S_SendData()和执行函数中的参数检查。

2)在操作DR寄存器发送数据前,输出一个脉冲到某个管脚并用示波器观察,看看这个脉冲与外部触发信号的距离,如果太长则说明中断没有及时响应,系统中还有其它高级别中断。

使用特权

评论回复
5
静默|  楼主 | 2008-8-7 17:03 | 只看该作者

谢谢各位

想问一下,当STM32做为从设备时,当SCK时钟有效时,是否MISO是否会发送数据?(此时不管是否调用了发送函数)

使用特权

评论回复
6
香水城| | 2008-8-7 17:16 | 只看该作者

STM32做为从设备,当SCK时钟有效时,MISO始终会发送数据

发送函数是向移位寄存器更新数据,如果不调用发送函数则重复发送移位寄存器里原有的数据。

使用特权

评论回复
7
静默|  楼主 | 2008-8-7 17:37 | 只看该作者

谢谢版版

我做了试验,大家可参考下,另帮我解决以下问题。
         打开时钟
    SPI1->DR = 0x8000;
    GPIOA->BSRR = GPIO_Pin_1;
    GPIOA->BRR = GPIO_Pin_1;
用上述代码,MISO输出的脉冲比用PA1输出的脉冲慢400ns左右.
    GPIOA->BSRR = GPIO_Pin_1;
    GPIOA->BRR = GPIO_Pin_1;
    SPI1->DR = 0x8000;
用上述代码,MISO输出的脉冲比用PA1输出的脉冲慢600ns左右.


我原来的问题在于: EXTI检测到一同步信号(同步信号的产生是基于主设备的SCK的产生)时, 此时SPI口会在发数中..., 故会出现延后问题. 

现在的问题好象无解了??? -- 同步信号的产生是基于主设备的SCK的产生后过一段时间才产生,而这同步信号是周期性的.

使用特权

评论回复
8
香水城| | 2008-8-7 17:49 | 只看该作者

你的SPI速率是多少?

请画个图解释一下你的同步信号,搞不明白你的同步信号是如何产生的。

你在一楼提到的“MISO比EXTI有7--8us的延后”,这个问题有答案了吗?

使用特权

评论回复
9
静默|  楼主 | 2008-8-7 22:20 | 只看该作者

spi help

一楼提到的“MISO比EXTI有7--8us的延后”,已经有答案了, 即SCK打开后,STM32的SPI一直在发数据. 同步信号到来时, SPI一次16位的数据移位还没移完, 此时SPI的发送缓冲区为空, 但写SPI1->DR时, 其不马上发送DR的数据,而是把移位寄存器中的余下的几位数据发完后才再发送SPI1->DR中的数据.

主设备的缺省SCK时钟为2M, SPI 最快的发送速率小等于2Mbit.
时序图中: 
当同步信号到来时, STM32检测到同步信号后, MISO必须在紧接的16个时钟连续给出16位完整的u16类型数据.(不能是上一次的SPI1 DR中的后几位和本次SPI1 DR中的前几位组成的16位数据).

同步信号及SCK信号由主设备提供. 筒子们帮帮忙啊. 

使用特权

评论回复
10
香水城| | 2008-8-7 23:56 | 只看该作者

比较好的,也是比较可行的办法是用你的同步信号触发一次DM

先初始化好SPI的所有寄存器,包括SPI_DR,但不使能SPI模块,利用DMA向SPI_CR1进行一次传送,使能SPI模块从而在同步信号之后的时钟周期SPI发送一次数据,一次SPI发送结束后产生中断,在中断中关闭SPI;然后再从新初始化SPI准备下一次传送,下一个同步信号再次通过DMA使能SPI发送下一个数据,如此直到所有数据发送完毕。

SCK时钟为2MHz,半个周期为250ns,同步信号的上升沿至下一个时钟的上升沿这么短的时间(约250ns)必须启动SPI准备发送,只有DMA操作能够在这么短的时间中完成这个工作。

使用特权

评论回复
11
armtft| | 2008-8-8 10:53 | 只看该作者

不使能SPI模块,当同步信号到来时,

使能SPI模块从而在同步信号之后的时钟周期SPI发送一次数据,一次SPI发送结束后产生中断,在中断中关闭SPI

使用特权

评论回复
12
静默|  楼主 | 2008-8-8 13:21 | 只看该作者

启动SPI发送有点慢

偶做的试验
  STM32F101核运行在36MHz下, STM32做为从设备。
 
当同步信号到来时,外部中断用同步上升沿进行触发,在外部中断服务程序中的第一条语句为打开SPI, 那么SPI发送出的第1位会在同步信号上升沿后的1700ns左右才开始出现。

使用特权

评论回复
13
香水城| | 2008-8-8 18:09 | 只看该作者

使用EXTI触发中断再使能SPI,时间肯定来不及,所以我建议用D

使用DMA,时间应该刚好够用。

使用特权

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

本版积分规则

15

主题

171

帖子

1

粉丝