坚持再坚持 发表于 2023-12-19 15:51:35

STM32F407模拟SPI通讯

在FreeRTOS中,模拟SPI通讯失败,图1中的SCK-SDO输出延时时间是什么意思(单片机是在第一个的上升沿采集从机的数据,还是在下降沿采集数据)?芯片手册里面就给了这2个时序图,就这4根线,怎么不好匹配!!!


2859932063 发表于 2023-12-19 17:47:50

第一个边缘啊

2859932063 发表于 2023-12-19 17:54:33

还有RTOS中模拟spi容易被其他任务打断,不要使用RTOS的延时,加锁保护spi通信

坚持再坚持 发表于 2023-12-19 19:40:07

2859932063 发表于 2023-12-19 17:47
第一个边缘啊

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

坚持再坚持 发表于 2023-12-19 19:45:56

2859932063 发表于 2023-12-19 17:54
还有RTOS中模拟spi容易被其他任务打断,不要使用RTOS的延时,加锁保护spi通信

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

庄永 发表于 2023-12-19 22:58:39

SCK拉低之后延时多久可以输出数据

坚持再坚持 发表于 2023-12-20 09:06:53

庄永 发表于 2023-12-19 22:58
SCK拉低之后延时多久可以输出数据

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

2859932063 发表于 2023-12-20 09:25:25

坚持再坚持 发表于 2023-12-19 19:40
SDI和SDO都是在第一个边沿,SCK-SDO输出延时时间是不是从机在保持时间到达后,需要在规定的时间内输出?

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

2859932063 发表于 2023-12-20 09:28:18

在上升沿的时候采集/发送数据。

2859932063 发表于 2023-12-20 09:50:06



这里是不是放错了?

坚持再坚持 发表于 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时序没有添加保护机制(而且优先级不高),来回切换任务导致有足够的时间间隔。

2859932063 发表于 2023-12-20 11:54:18

坚持再坚持 发表于 2023-12-20 10:43
这里已经修改了,我来回在上升沿和下降沿读取从设备的信息,这里更改错了。我把SPI_Delay()延时去掉,再 ...

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

坚持再坚持 发表于 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();

坚持再坚持 发表于 2023-12-20 14:15:57

2859932063 发表于 2023-12-20 11:54
高低电平的时间没有错,手册只要求小于500ns。一个循环下来不只这个时间了。你哪个延时都50us太慢了,肯 ...

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

2859932063 发表于 2023-12-20 14:41:13

坚持再坚持 发表于 2023-12-20 14:15
慢为什么不行,这样信号输出和采集不是更稳定吗?

你是太慢......

2859932063 发表于 2023-12-20 14:41:40

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

nop是延迟一个时钟周期

2859932063 发表于 2023-12-20 14:44:33

坚持再坚持 发表于 2023-12-20 14:15
慢为什么不行,这样信号输出和采集不是更稳定吗?

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

Edmund1964 发表于 2023-12-31 02:22:52

讨论SPI时序竞然通遍不提系统时钟,连系统时钟都不知道用什么来判断时序对错?

Edmund1964 发表于 2023-12-31 02:50:47

如果说以168MHz系统时钟来算,大部分的时间都是超出规定的

坚持再坚持 发表于 2024-1-3 13:44:49

Edmund1964 发表于 2023-12-31 02:50
如果说以168MHz系统时钟来算,大部分的时间都是超出规定的

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

Edmund1964 发表于 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个指令周期么?

Edmund1964 发表于 2024-1-4 15:57:58

坚持再坚持 发表于 2024-1-3 13:44
使用的是STM32F407,时钟频率为168MHz,SCLK之间没有设置延时函数,使用这种方式已经成功与两个设备实现 ...

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

Edmund1964 发表于 2024-1-4 18:35:25

2859932063 发表于 2023-12-20 11:54
高低电平的时间没有错,手册只要求小于500ns。一个循环下来不只这个时间了。你哪个延时都50us太慢了,肯 ...

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

坚持再坚持 发表于 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,不知道对不对!!!

Edmund1964 发表于 2024-1-8 17:44:27

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

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

Edmund1964 发表于 2024-1-8 17:48:51

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

SPI外置可不管你平均时序的,它只有最小最大的极限要求, 所以不能用MIPS来算。
页: [1]
查看完整版本: STM32F407模拟SPI通讯