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

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
kstwork 回答时间:2019-5-19 22:25:23
建议从官方例程开始调起,一步步修改出自己需要的功能

评分

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

查看全部评分

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

评分

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

查看全部评分

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版