发现STM32的SPI2有问题(invalid)

原文地址::http://blog.gpjtag.com/?p=643

相关文章

1、STM32 SPI难点浅析----http://www.360doc.com/content/18/0109/13/8706683_720480361.shtml

2、关于MDK优化后STM32F0 SPI口不能正常工作的问题----https://blog.csdn.net/hkhxj/article/details/87856464

3、STM32F4系列单片机使用SPI2的问题----http://www.openedv.com/posts/list/62106.htm

4、关于STM32F103的spi2的调试经验笔记----https://wenku.baidu.com/view/23ad72f3a45177232e60a225.html

5、STM32f103 SPI问题----https://blog.csdn.net/quinn1994/article/details/90243519

6、STM32的SPI2操作Flash----https://bbs.csdn.net/topics/390652078

7、STM32F103C8T6的SPI2问题,求救----https://bbs.21ic.com/icview-175064-1-1.html

8、stm32f103 SPI1和SPI2进行通讯故障 ----http://www.openedv.com/posts/list/20460.htm

扫描二维码关注公众号,回复: 8854481 查看本文章

9、请问GPIO_Mode_AF_PP究竟该如何用----https://www.amobbs.com/thread-3339181-1-1.html

最近需要用到SPI1和SPI2协同工作,想弄个2位的SPI通信:

硬件的接线如下:

SPI1.SCK -> DEV.SCK
SPI1.SCK -> SPI2.SCK
SPI1.MOSI -> DEV.MOSI[0]
SPI1.MISO <- DEV.MISO[0] SPI2.MISO -> DEV.MOSI[1]
SPI2.MOSI <- DEV.MISO[1]

将SPI1设置为Master方式,将SPI2设置为Slave。
设置为CPOL=0,CPHA=0(就是不传输的时候时钟是低电平,上升沿采样,下降沿更新数据)。

具体的配置就不贴了,在stm32fwlib的例子里面有。

注意:官方和网上能用的配置都是SPI1是Slave、SPI2为Master!接下来会说。

介绍遇到的问题:SPI1正确,SPI2得到的数据是乱的……

单独把SPI1设置为Master和FPGA通信,发现在最高速18Mhz也是正常的,开始怀疑SPI2是否有Bug……
于是单独把SPI1和SPI2回环测试:

SPI1.SCK -> SPI2.SCK
SPI1.MOSI -> SPI2.MOSI
SPI1.MISO <- SPI2.MISO

用随机数发送和接收,发现SPI1和SPI2收到的数据都是不正常的,但有区别

  • SPI1的SR发送完之后是0x02(TX空)
  • SPI2的SR却是0x82、0x40(0x80是busy、0x40是overrun)

严重怀疑SPI2有问题,busy说明数据没完全发送完,overrun说明发送完了之后还有时钟导致之前的数据被冲掉了。

试试用GPIO模拟SPI1来和SPI2通信,问题一样的,有点怀疑STM32的SPI是否能做Slave…………

看看官方的代码,突然又发现官方是SPI1为Slave,最后尝试把SPI1设置为Slave、SPI2为Master,正常了!!!

SPI2.SCK -> SPI1.SCK
SPI2.MOSI -> SPI1.MOSI
SPI2.MISO <- SPI1.MISO

之前就听说STM32的片子可能有Bug,难道SPI1和SPI2不一样?毕竟大部分的情况下只用一个SPI1,很少会用到SPI2的。
上网查了一下errata,说了SPI2的Slave模式和USART3会有冲突,和I2S也会有问题,于是第一时间很想换lpc的片子,但同样的功能价格贵一半,算了吧。


修正:今天用逻辑分析仪抓了波形。

这个是SPI2作为Master、SPI1作为Slave。
SPI2-master, SPI1-slave

这个是SPI1作为Master、SPI2作为Slave。
SPI1-master, SPI2-slave

可以看到无论哪个做Master,边沿都是对的,但是SPI2做从的时候有毛刺……
有的时候时钟的IDLE电平不是0,本来还是怀疑STM32的问题,但是突然看到手边还有杜邦线,试着换了一套杜邦线,居然正常了!

测试数据正确了。

(0) M_SR=02, S_SR=02, (MTX) 94ef == 94ef (SRX), (MRX) 53df == 53df (STX)
(1) M_SR=02, S_SR=02, (MTX) e746 == e746 (SRX), (MRX) e4ea == e4ea (STX)
(2) M_SR=02, S_SR=02, (MTX) 02f5 == 02f5 (SRX), (MRX) 006d == 006d (STX)
(3) M_SR=02, S_SR=02, (MTX) a3bc == a3bc (SRX), (MRX) 1728 == 1728 (STX)
(4) M_SR=02, S_SR=02, (MTX) 4b5b == 4b5b (SRX), (MRX) e7db == e7db (STX)
(5) M_SR=02, S_SR=02, (MTX) b192 == b192 (SRX), (MRX) 2f46 == 2f46 (STX)
(6) M_SR=02, S_SR=02, (MTX) b421 == b421 (SRX), (MRX) d829 == d829 (STX)
(7) M_SR=02, S_SR=02, (MTX) c6c8 == c6c8 (SRX), (MRX) ab44 == ab44 (STX)
(8) M_SR=02, S_SR=02, (MTX) e347 == e347 (SRX), (MRX) 7f57 == 7f57 (STX)
(9) M_SR=02, S_SR=02, (MTX) f95e == f95e (SRX), (MRX) e922 == e922 (STX)

但还是不能明白为什么SPI1作为Slave却能通信,我还换过STM32官方的板子和新的杜邦线,当时也是不能用的,到底什么情况……

发布了136 篇原创文章 · 获赞 306 · 访问量 437万+

猜你喜欢

转载自blog.csdn.net/xqhrs232/article/details/103906905