lqs0905 发表于 2019-5-17 10:45:54

SPI 主机半双工SPI 时钟错位

在使用SPI主机半双工通信时,如果我在接收完成数据后没有及时的切换成发送状态,在结尾会多出几个时钟。如果这个时候再发送数据,时钟整好就少子之前多的那几个时钟信号。我尝试差在发送前关闭SPI再初始化还是会少几个时钟。请问有什么方法去清除发送之后SPI里上次残留的时钟信号,以避免下次再发送或接收时导致数据不完整

lqs0905 发表于 2019-5-17 10:53:27

我实限发送的数据是0x42 因为少了一个时钟所以看起来像0xA1

lqs0905 发表于 2019-5-17 11:12:11

我这里的了SPI 接收和发送都使用了DMA的方式,因为我程序里有需要时实响应的中断。所以我在死等接收最后一组数据完成立即关闭SPI 不现实。接收完成时可能随时被更高优先级的中断打段等待SPI接收完成的函数。所以我无法保证在接收完后及时关断SPI

yllqabz 发表于 2019-5-17 16:43:08

既然要收要发,为何不全双工?操作起来不是更方便吗?

lqs0905 发表于 2019-5-18 11:42:05

yllqabz 发表于 2019-5-17 16:43
既然要收要发,为何不全双工?操作起来不是更方便吗?

外挂芯片,接收和发送在一个脚上。不支持全双工

lqs0905 发表于 2019-5-18 11:56:09

本帖最后由 lqs0905 于 2019-5-18 12:01 编辑

这里是我的发送的函数
//      LL_SPI_Disable(SPI2);// 清除多余的CLK 以防止下次CLK错误
      LL_DMA_DisableChannel(DMA1,5);
      DMA1_Channel5->CMAR = (u32)TM1620B_fifo.data.add;
      DMA1_Channel5->CNDTR = TM1620B_fifo.data.len;   
      SPI2_CS_L();
                SET_BIT(SPI2->CR1, LL_SPI_HALF_DUPLEX_TX);
//      LL_SPI_Enable(SPI2);
      LL_DMA_EnableChannel(DMA1,5);//发送时要先设SPI为发送再开DMA传数据

重新打开或关闭都不能让SPI 的移位寄存器和时钟计数器复位导致下一次SPI传输错误。
上面的现像不是100% 存在的,有时候可能是赶巧SPI发送的时钟是正确的。
但是我感觉这应该是stm32 SPI的一个BUG

kstwork 发表于 2019-5-19 22:25:23

建议从官方例程开始调起,一步步修改出自己需要的功能

天臆弄人 发表于 2019-5-20 09:41:08

不用DMA试试看,
页: [1]
查看完整版本: SPI 主机半双工SPI 时钟错位