STM32F0系列芯片SPI发送一字节数据却输出16个CLK时钟的解决办法

在STM32F0项目中,通过寄存器操作SPI_DR发送一字节数据时,发现数据输出后额外跟了8个时钟脉冲,导致时序错误。经查阅手册和HAL库代码,问题在于直接赋值16位的SPI_DR寄存器。解决方法是使用8位指针仅操作DR寄存器的低八位,从而确保只输出8个时钟脉冲。
摘要由CSDN通过智能技术生成

问题

上一个项目在用寄存器操作STM32F0芯片的SPI_DR寄存器的时候,发现一个问题:

我给DR寄存器赋值一个uint8_t一字节大小的数据,SPI引脚能正确输出数据和时钟,但前面八位正确的数据输出完成后,时钟CLK没有停下来,又紧接着输出了八个时钟脉冲

也就是原数据0xfe 变成了十六位的 0xfe00 , 导致时序错误,使用逻辑分析才得以检查出来

 

为什么

去国外的st论坛转了一圈,发现有几个老外也是遇到了相同的问题,但他们是使用正确的固件库函数解决的,这并不是我想要找到的寄存器解决方法

后来又认真阅读了一次F030的数据手册,又仔细看了很久的HAL库底层代码,终于找到了问题所在:

如果你要spi输出一个字节八个时钟的数据,应该只操作SPI_DR寄存器的低八位,什么意思呢?

DR寄存器是16位的,如果你直接SPI1->DR = 0x85 ; 这样的操作是不正确的,你的数据会变成0x0085之后赋值给DR寄存器,也就是操作了16位,所以STM32会输出16个时钟脉冲

 

怎么办

那么看看我是怎么改的:

1 void SPI_WriteByte(uint8_t BYTE)
2 {
3     //
  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值