6224|12

77

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

spihelp [复制链接]

STM32的SPI做为从设备,SCK接2M时钟。
STM32跑在32MHz上,现象:当用EXTI检测到一同步信号后,用SPI_I2S_SendData(新版的库)发送数据时看到MISO比EXTI有7--8us的延后。(EXTI中断服务程序中就一个函数SPI_I2S_SendData,EXTI设为上升沿触发)。
问1:这个现象是否正常?
问2:能否快速启动SPI的发送,以上述环境为例,检测到EXTI上升沿后最快多长时间能发出SPI数据的第一位?

谢谢!
此帖出自stm32/stm8论坛

最新回复

                                 使用DMA,时间应该刚好够用。   详情 回复 发表于 2008-8-8 18:09
点赞 关注
 

回复
举报

83

帖子

0

TA的资源

一粒金砂(初级)

沙发
 

写错,STM32跑在36MHz上。

                                  
此帖出自stm32/stm8论坛
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

板凳
 

SPI_I2S_SendData 只有一句

SPIx->DR = Data;

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




呵呵。


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

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

如果要求速度,建议不调用SPI_I2S_SendData
直接 SPI 2 ->DR = Data;
此帖出自stm32/stm8论坛
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

4
 

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

请做下面2个测试:

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

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

回复

74

帖子

0

TA的资源

一粒金砂(初级)

5
 

谢谢各位

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

回复

69

帖子

0

TA的资源

一粒金砂(初级)

6
 

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

                                 发送函数是向移位寄存器更新数据,如果不调用发送函数则重复发送移位寄存器里原有的数据。
此帖出自stm32/stm8论坛
 
 
 

回复

52

帖子

0

TA的资源

一粒金砂(初级)

7
 

谢谢版版

我做了试验,大家可参考下,另帮我解决以下问题。
         打开时钟
    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的产生后过一段时间才产生,而这同步信号是周期性的.
此帖出自stm32/stm8论坛
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

8
 

你的SPI速率是多少?

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

你在一楼提到的“MISO比EXTI有7--8us的延后”,这个问题有答案了吗?
此帖出自stm32/stm8论坛
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

9
 

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信号由主设备提供. 筒子们帮帮忙啊. 
此帖出自stm32/stm8论坛
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

10
 

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

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

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

回复

64

帖子

0

TA的资源

一粒金砂(初级)

11
 

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

                                 使能SPI模块从而在同步信号之后的时钟周期SPI发送一次数据,一次SPI发送结束后产生中断,在中断中关闭SPI
此帖出自stm32/stm8论坛
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

12
 

启动SPI发送有点慢

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

回复

60

帖子

0

TA的资源

一粒金砂(初级)

13
 

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

                                 使用DMA,时间应该刚好够用。
此帖出自stm32/stm8论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表