你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

SPI 主机半双工SPI 时钟错位

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

举报

7个回答
lqs0905 回答时间:2019-5-17 10:53:27
我实限发送的数据是0x42 因为少了一个时钟所以看起来像0xA1
捕获.PNG
lqs0905 回答时间:2019-5-17 11:12:11
我这里的了SPI 接收和发送都使用了DMA的方式,因为我程序里有需要时实响应的中断。所以我在死等接收最后一组数据完成立即关闭SPI 不现实。接收完成时可能随时被更高优先级的中断打段等待SPI接收完成的函数。所以我无法保证在接收完后及时关断SPI
yllqabz 回答时间:2019-5-17 16:43:08
既然要收要发,为何不全双工?操作起来不是更方便吗?

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

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[TM1620B_fifo.rear].add;
        DMA1_Channel5->CNDTR = TM1620B_fifo.data[TM1620B_fifo.rear].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
静静开发 回答时间:2019-5-19 22:25:23
建议从官方例程开始调起,一步步修改出自己需要的功能

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

天臆弄人 回答时间:2019-5-20 09:41:08
不用DMA试试看,

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版