[STM32L0] 数据不对

[复制链接]
 楼主| huangchui 发表于 2021-8-14 22:09 | 显示全部楼层
没正常,我吧hal库里的函数重写了才好,但是还是不知道原因。
jiajs 发表于 2021-8-14 22:10 | 显示全部楼层
你是 先发 HAL_SPI_Receive(&hspi1,&temp1[0],1,1000);+HAL_SPI_Receive(&hspi1,&temp1[0],1,1000);是两个时种  还是 只发 HAL_SPI_Receive(&hspi1,&temp1[0],1,1000);就会出现两个时钟
 楼主| huangchui 发表于 2021-8-14 22:18 | 显示全部楼层
只用一次就是两个时钟,所以才奇怪。用两次就是3个时钟。比想要的多一个
songqian17 发表于 2021-8-14 22:22 | 显示全部楼层
兄弟,我用L4也碰到这个问题了,bug吧
yinxiangh 发表于 2021-8-14 22:24 | 显示全部楼层
一般来说多发时钟脉冲是不影响接收数据的,本身接收函数中有接收数据个数判断。
jiajs 发表于 2021-8-14 22:29 | 显示全部楼层
如果修改函数库要慎重,不推荐这种方式。
 楼主| huangchui 发表于 2021-8-14 22:34 | 显示全部楼层
 楼主| huangchui 发表于 2021-8-14 22:38 | 显示全部楼层

嗯,我再好好缕一缕吧,有了好消息及时通知大家
呐咯密密 发表于 2021-8-16 09:46 | 显示全部楼层
给楼主一个考虑的方向,SPI是个全双工的接口,如果要接收数据必须先要发送数据吧,你在接收时多了一个CLOCK,有没有想过发送的时候多了一个CLOCK,关于SPI的发送,这里是有个大坑的。我们从寄存器的角度来考虑,在发送SPI的时候我们会操作SPI的DR寄存器。
因为DR寄存器是16位的,如果你直接SPI1->DR = 0x9F ;
这样的操作是不正确的,你的数据会变成0x009F之后赋值给DR寄存器,
也就是操作了16位,所以STM32会输出16个时钟脉冲

解决方法
我们先找到DR寄存器的地址,再用一个八位的指针指向这个地址,
现在指向的是DR寄存器的开头,那么指针+1,指针指向了DR寄存器的低八位
这时候给指针指向的地址赋值0x9F,那么这个字节就会放入DR低八位的空间内,
而不是操作整个16位DR寄存器


537316119c34a94e45.png
给你个链接,我的帖子,跳转
842346119c34be5aa9.png
zljiu 发表于 2021-9-6 14:12 | 显示全部楼层
每次都会多一组吗
gwsan 发表于 2021-9-6 14:15 | 显示全部楼层
软件有问题 导致发送重复?
labasi 发表于 2021-9-9 11:28 | 显示全部楼层
是在什么部分多呀
paotangsan 发表于 2021-9-9 12:10 | 显示全部楼层
无所谓强制不强制
tpgf 发表于 2021-9-9 12:12 | 显示全部楼层
跟发送的数据吻合吗
renzheshengui 发表于 2021-9-9 13:25 | 显示全部楼层
修改成8位之后正常了么
wakayi 发表于 2021-9-9 13:29 | 显示全部楼层
我倒是觉得有可能漏收
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部