原文地址::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
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收到的数据都是不正常的,但有区别
严重怀疑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的片子,但同样的功能价格贵一半,算了吧。
修正:今天用逻辑分析仪抓了波形。
可以看到无论哪个做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官方的板子和新的杜邦线,当时也是不能用的,到底什么情况……