STM32的SPI使用注意

7 篇文章 0 订阅
5 篇文章 2 订阅

         今天写OLED屏SSD1309的驱动,用的是SPI2。屏只接收数据,不给单片机单片机发送数据,所以在硬件上连接的只有CS、SCK、MOSI,没有用到单片机的MISO引脚,片选引脚设置为软件管理模式,SPI的方向设置为双向全双工。

         对IO的时钟、SPI2等初始化完成后将程序下载到片子上发现屏没有任何反应,如果在调用发送函数之前判断发送的标志,第一次发送可以成功,第二个数据就会死在这里,debug发现数据第一次发送之后,TXE标志不会置1,即发送缓冲区一直没有清空,这是什么情况???感觉很奇怪,仔细看状态寄存器发现,RXE标志置1了,即接收到数据了。

数据手册上对错误标志位部分的说明:上溢标志位,如果还没有读出前一个接收到的数据时,又接收新的数据即产生上溢,上溢标志置1,这时接收缓存的内容不会刷新为从发送设备送来的数据。对寄存器SPI_DR的读操作返回最后一个接收到的数据,其他所有在上溢后由设备发送的16位数据都会丢失。

虽然我没有用到接收引脚接收数据,因为设置的是全双工,所以在发送数据产生时钟信号的时候同时会读取接收引脚上的电平保存到缓冲区,如果不对接收进行读取操作将会产生溢出,将使以后发送出的数据全部无效。所以即使只用接收或者发送也需要对接收标志进行判断和后续操作。

二、SPI 驱动JF24D

       JF24D原来是用51单片机使用IO模拟SPI的方式驱动,现在改为使用STM32的SPI1来驱动。注意根据模式手册修改SPI 的时钟频率,时钟、片选信号在空闲时的极性。

片选信号没有使用SPI外设的片选,用的是手动置低和拉高。用SPI驱动后发现一个问题:2.4G的发送信号有时候会丢。我尝试在每次片选拉低或者拉高之前增加5ms的延时,现在试了试感觉信号不丢了,时序很重要。

再次测试,5ms的延时有点长,对发送数据比较可靠,但是如果差不多同时来几个信号,会造成信号的丢失,因为射频速度比较快,发射完成也就在零点几毫秒之内,所以延时不宜太长,会造成接收数据的丢失,将片选信号拉低后的延时时间改为了20us,目前测试情况发送和接收都还可以。

     今天调的SPI驱动JF24D发现一个问题,发送字节数小于6的数据包会丢失,但是51单片机模拟SPI发送4字节的包就不丢失。SPI的时钟我已经分频到最低速度了,原因目前不详。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值