SPI 主机半双工SPI 时钟错位
在使用SPI主机半双工通信时,如果我在接收完成数据后没有及时的切换成发送状态,在结尾会多出几个时钟。如果这个时候再发送数据,时钟整好就少子之前多的那几个时钟信号。我尝试差在发送前关闭SPI再初始化还是会少几个时钟。请问有什么方法去清除发送之后SPI里上次残留的时钟信号,以避免下次再发送或接收时导致数据不完整我实限发送的数据是0x42 因为少了一个时钟所以看起来像0xA1
我这里的了SPI 接收和发送都使用了DMA的方式,因为我程序里有需要时实响应的中断。所以我在死等接收最后一组数据完成立即关闭SPI 不现实。接收完成时可能随时被更高优先级的中断打段等待SPI接收完成的函数。所以我无法保证在接收完后及时关断SPI 既然要收要发,为何不全双工?操作起来不是更方便吗? yllqabz 发表于 2019-5-17 16:43
既然要收要发,为何不全双工?操作起来不是更方便吗?
外挂芯片,接收和发送在一个脚上。不支持全双工 本帖最后由 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
建议从官方例程开始调起,一步步修改出自己需要的功能 不用DMA试试看,
页:
[1]