硬汉嵌入式论坛

 找回密码
 立即注册
查看: 841|回复: 25
收起左侧

[技术讨论] STM32F407模拟SPI通讯

[复制链接]

35

主题

106

回帖

211

积分

高级会员

积分
211
发表于 2023-12-19 15:51:35 | 显示全部楼层 |阅读模式
1.png 2.png 3.png 4.png 5.png 在FreeRTOS中,模拟SPI通讯失败,图1中的SCK-SDO输出延时时间是什么意思(单片机是在第一个的上升沿采集从机的数据,还是在下降沿采集数据)?芯片手册里面就给了这2个时序图,就这4根线,怎么不好匹配!!!


回复

使用道具 举报

3

主题

96

回帖

105

积分

初级会员

积分
105
发表于 2023-12-19 17:47:50 | 显示全部楼层
9))3[F42XLQM[N0G~6WS$UR.png 第一个边缘啊
回复

使用道具 举报

3

主题

96

回帖

105

积分

初级会员

积分
105
发表于 2023-12-19 17:54:33 | 显示全部楼层
还有RTOS中模拟spi容易被其他任务打断,不要使用RTOS的延时,加锁保护spi通信
回复

使用道具 举报

35

主题

106

回帖

211

积分

高级会员

积分
211
 楼主| 发表于 2023-12-19 19:40:07 | 显示全部楼层

SDI和SDO都是在第一个边沿,SCK-SDO输出延时时间是不是从机在保持时间到达后,需要在规定的时间内输出?
回复

使用道具 举报

35

主题

106

回帖

211

积分

高级会员

积分
211
 楼主| 发表于 2023-12-19 19:45:56 | 显示全部楼层
2859932063 发表于 2023-12-19 17:54
还有RTOS中模拟spi容易被其他任务打断,不要使用RTOS的延时,加锁保护spi通信

没有使用FreeRTOS的延时,使用的是for循环。加锁我只知道进入临界区或是挂起所有任务这两个,但是二值信号量和互斥锁也用不上
回复

使用道具 举报

75

主题

685

回帖

910

积分

金牌会员

积分
910
发表于 2023-12-19 22:58:39 | 显示全部楼层
SCK拉低之后延时多久可以输出数据
回复

使用道具 举报

35

主题

106

回帖

211

积分

高级会员

积分
211
 楼主| 发表于 2023-12-20 09:06:53 | 显示全部楼层
庄永 发表于 2023-12-19 22:58
SCK拉低之后延时多久可以输出数据

明白了,就是在下降沿的时候从设备需要在规定的时间内准备好数据,这样主设备才可以在下一个上升沿采集到从机输出的设备。奇怪的一点是:昨天在程序里面添加延时时间(保持上升沿和下降沿的维持时间),程序跑不通。今天我把所有的延时函数去掉了,程序反而跑通了。在FreeRTOS的综合大程序里面做的实验。
回复

使用道具 举报

3

主题

96

回帖

105

积分

初级会员

积分
105
发表于 2023-12-20 09:25:25 | 显示全部楼层
坚持再坚持 发表于 2023-12-19 19:40
SDI和SDO都是在第一个边沿,SCK-SDO输出延时时间是不是从机在保持时间到达后,需要在规定的时间内输出?

SCK-SDO输出延时时间是 指的是从机接收到命令之后输出第一个BIT位的最长时间不超过400ns,换句话说就是读取的时候不需要延迟。
回复

使用道具 举报

3

主题

96

回帖

105

积分

初级会员

积分
105
发表于 2023-12-20 09:28:18 | 显示全部楼层
在上升沿的时候采集/发送数据。
回复

使用道具 举报

3

主题

96

回帖

105

积分

初级会员

积分
105
发表于 2023-12-20 09:50:06 | 显示全部楼层
]]1${RCFS@]Y~1%MOY][C{J.png

这里是不是放错了?
回复

使用道具 举报

35

主题

106

回帖

211

积分

高级会员

积分
211
 楼主| 发表于 2023-12-20 10:43:52 | 显示全部楼层
2859932063 发表于 2023-12-20 09:50
这里是不是放错了?

这里已经修改了,我来回在上升沿和下降沿读取从设备的信息,这里更改错了。我把SPI_Delay()延时去掉,再在SPI初始化话的时候提前将SCLK设置成低电平,测试成功了。
for(uint8_t i=0; i<8; i++)
    {
        //        __NOP();
//        SCLK_0;                                 /* 先把SCLK设置成低电平,和这一个没有关系,要不要都可以 */
        (byte & 0x80) ? MOSI_1 : MOSI_0;        /* 主机的MOSI输出数据 */
        byte <<= 1;                             /* 发送数据右移一位 */
        SCLK_1;                                 /* SCLK设置成高电平,上升沿。从设备采集主设备的输出 */
        
        readDate <<= 1;
        if(READ_MISO == 1)                      /* 读取从机输出的电平信号 */
        {
            readDate |= 1;
        }
        
//        SPI_Delay();                            /* 延时50us,使SCLK的高电平保持50us */
        SCLK_0;                                 /* SCLK设置成低电平,下降沿。 */
//        SPI_Delay();                            /* 延时50us,使SCLK的低电平保持50us */
    }瞎猫碰到死耗子了。这样就不符合它定义的高低电平的维持时间了,是不是因为在FreeRTOS的大操作系统里面有很多任务,而且我的SPI时序没有添加保护机制(而且优先级不高),来回切换任务导致有足够的时间间隔。
回复

使用道具 举报

3

主题

96

回帖

105

积分

初级会员

积分
105
发表于 2023-12-20 11:54:18 | 显示全部楼层
坚持再坚持 发表于 2023-12-20 10:43
这里已经修改了,我来回在上升沿和下降沿读取从设备的信息,这里更改错了。我把SPI_Delay()延时去掉,再 ...

高低电平的时间没有错,手册只要求小于500ns。一个循环下来不只这个时间了。你哪个延时都50us太慢了,肯定不行的
回复

使用道具 举报

35

主题

106

回帖

211

积分

高级会员

积分
211
 楼主| 发表于 2023-12-20 14:14:55 | 显示全部楼层
2859932063 发表于 2023-12-20 11:54
高低电平的时间没有错,手册只要求小于500ns。一个循环下来不只这个时间了。你哪个延时都50us太慢了,肯 ...

我连接硬件电路,使用Keil的Debug仿真,看看程序SCLK对应引脚高低电平变化的时间。还有一点比如使通讯协议中的延时时间,使用这两种有什么区别吗?for(i = 75; i > 0; i--);和for(i = 75; i > 0; i--) __NOP();
回复

使用道具 举报

35

主题

106

回帖

211

积分

高级会员

积分
211
 楼主| 发表于 2023-12-20 14:15:57 | 显示全部楼层
2859932063 发表于 2023-12-20 11:54
高低电平的时间没有错,手册只要求小于500ns。一个循环下来不只这个时间了。你哪个延时都50us太慢了,肯 ...

慢为什么不行,这样信号输出和采集不是更稳定吗?
回复

使用道具 举报

3

主题

96

回帖

105

积分

初级会员

积分
105
发表于 2023-12-20 14:41:13 | 显示全部楼层
坚持再坚持 发表于 2023-12-20 14:15
慢为什么不行,这样信号输出和采集不是更稳定吗?

你是太慢......
回复

使用道具 举报

3

主题

96

回帖

105

积分

初级会员

积分
105
发表于 2023-12-20 14:41:40 | 显示全部楼层
坚持再坚持 发表于 2023-12-20 14:14
我连接硬件电路,使用Keil的Debug仿真,看看程序SCLK对应引脚高低电平变化的时间。还有一点比如使通讯协 ...

nop是延迟一个时钟周期
回复

使用道具 举报

3

主题

96

回帖

105

积分

初级会员

积分
105
发表于 2023-12-20 14:44:33 | 显示全部楼层
坚持再坚持 发表于 2023-12-20 14:15
慢为什么不行,这样信号输出和采集不是更稳定吗?

你自己对比手册的时间就知道了
回复

使用道具 举报

0

主题

124

回帖

124

积分

初级会员

积分
124
发表于 2023-12-31 02:22:52 | 显示全部楼层
讨论SPI时序竞然通遍不提系统时钟,连系统时钟都不知道用什么来判断时序对错?
回复

使用道具 举报

0

主题

124

回帖

124

积分

初级会员

积分
124
发表于 2023-12-31 02:50:47 | 显示全部楼层
如果说以168MHz系统时钟来算,大部分的时间都是超出规定的
回复

使用道具 举报

35

主题

106

回帖

211

积分

高级会员

积分
211
 楼主| 发表于 2024-1-3 13:44:49 | 显示全部楼层
Edmund1964 发表于 2023-12-31 02:50
如果说以168MHz系统时钟来算,大部分的时间都是超出规定的

1.png 使用的是STM32F407,时钟频率为168MHz,SCLK之间没有设置延时函数,使用这种方式已经成功与两个设备实现了通讯,但是还没有使用示波器查看通讯质量。因为是第一次接触模拟SPI,很多地方考虑不到,请问有什么需要注意的吗?谢谢。因为已经成功实现通讯了,就没有考虑那么多,后续再慢慢考虑通讯质量。
回复

使用道具 举报

0

主题

124

回帖

124

积分

初级会员

积分
124
发表于 2024-1-4 15:53:56 | 显示全部楼层
坚持再坚持 发表于 2024-1-3 13:44
使用的是STM32F407,时钟频率为168MHz,SCLK之间没有设置延时函数,使用这种方式已经成功与两个设备实现 ...

就简单粗略的估算一下, 时钟168MHz, 一个时钟周期为5.95238ns, 就以你给出SPI的时序要求中最短时间的50ns来研究一下, 50ns/5.95238ns = 8.4时钟。

就以tdis 来说, 要求最小50ns(8.4时钟),

从数据到MOSI 至SCK转为1, 开始算
byte<<=1;     一个指令周期
MLSCLK_1;    三个指令周期

一共才4个指令周期, 当然这还要看编译的版本, 但就是最草包的编译器也编不出9个指令周期出来啊。
能有8.4个指令周期么?
回复

使用道具 举报

0

主题

124

回帖

124

积分

初级会员

积分
124
发表于 2024-1-4 15:57:58 | 显示全部楼层
坚持再坚持 发表于 2024-1-3 13:44
使用的是STM32F407,时钟频率为168MHz,SCLK之间没有设置延时函数,使用这种方式已经成功与两个设备实现 ...

如果说没逻辑分析仪,对汇编不熟悉的话,也对速度没什么要求,就每个动作都给它加500ns延时吧, 又或是直接上硬件SPI, 好好的硬件SPI干嘛不用?
回复

使用道具 举报

0

主题

124

回帖

124

积分

初级会员

积分
124
发表于 2024-1-4 18:35:25 | 显示全部楼层
2859932063 发表于 2023-12-20 11:54
高低电平的时间没有错,手册只要求小于500ns。一个循环下来不只这个时间了。你哪个延时都50us太慢了,肯 ...

服了, ”最小值“是50ns,是指指定的两点之间的时间差最小要50ns, 而不是要小于50ns.
回复

使用道具 举报

35

主题

106

回帖

211

积分

高级会员

积分
211
 楼主| 发表于 2024-1-8 15:16:00 | 显示全部楼层
Edmund1964 发表于 2024-1-4 15:57
如果说没逻辑分析仪,对汇编不熟悉的话,也对速度没什么要求,就每个动作都给它加500ns延时吧, 又或是直 ...

好的,谢谢。接下来我用示波器测试下,带有硬件SPI引脚的被用在其它方面了。我看其它帖子中说“STM32是ARM内核的处理器,采用流水线机制,每条指令的执行时间并不固定也不唯一,不能采用51的思维”。STM32F407是1.25DMIPS/MHz,使用168MHz的主频,那么就是1S执行168*1.25=210MIPS条指令,平均一个指令周期为:4.76ns,不知道对不对!!!
回复

使用道具 举报

0

主题

124

回帖

124

积分

初级会员

积分
124
发表于 2024-1-8 17:44:27 | 显示全部楼层
坚持再坚持 发表于 2024-1-8 15:16
好的,谢谢。接下来我用示波器测试下,带有硬件SPI引脚的被用在其它方面了。我看其它帖子中说“STM32是AR ...

给你一个ARM(M0~M4)指令周期的大略的判断方法
一, 操作寄存器以外的指令(比如读写IO的寄存器, 比如查表) 2周期
二, 跳转指令 4+3+2+1 周期
回复

使用道具 举报

0

主题

124

回帖

124

积分

初级会员

积分
124
发表于 2024-1-8 17:48:51 | 显示全部楼层
坚持再坚持 发表于 2024-1-8 15:16
好的,谢谢。接下来我用示波器测试下,带有硬件SPI引脚的被用在其它方面了。我看其它帖子中说“STM32是AR ...

SPI外置可不管你平均时序的,它只有最小最大的极限要求, 所以不能用MIPS来算。
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-8 00:12 , Processed in 0.386874 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表