刚算是了解清楚了SPI的原理,动手做个实验。在SPI主从通信中。我想让主机跟从机交换一次数据。从机程序里直接往SPI-DR里赋值了,那么在主机时钟信号到来的时候通信就自动开始了不是吗?
然后我接上了逻辑分析仪观察。发现主机输出的数据是正确的,但主机接收回来的返回值并不是0xf0;而是00111100..但我现在没有JLINK,我只能观察到IO的变换。麻烦朋友们看看程序是不是有问题呢?
Hi Jonny
这两段代码是同一个程序的吗?我假设你是准备用同一块MCU的两个SPI,分别做主从。
但你主从都是用的SPI1,这里就有问题。还有GPIO的初始化,这里也没看到。也没有读SPI数据的代码。
另外SPI1_ReadWriteByte是你自己写的函数吗?
STM32F1的标准外设库里有相应的例程(STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Examples\SPI\FullDuplex_SoftNSS),建议你去参考一下。
下载地址: STSW-STM32054 STM32F10x standard peripheral library - STMicroelectronics
您好amanda,我是用两片STM32进行spi通信。目的很简单的,就是让主机跟从机相互交换一个字节的数据。但现在呢,主机发送的数据用逻辑分析仪看是正确的,时钟信号也有。就是从机给主机返回的值,在MISO引脚上那个,用逻辑分析仪看到的是错误的。我看了SPI的资料,说是从机的DR寄存器里面有值了,主机的时钟一来通信就自动开始了。那我在从机配置好之后就直接SPI1->DR=0X32。这样随意的附上一个值。我也检查过了主机跟从机的时序都是一样的,都是空闲状态高电平,在第二个边沿采集信号。而且我已经将两块板子共地了。我看了ST提供的函数了,它在实现收发的时候也是SPI1->DR=data的。
另外我在网上看到有人说stm32的SPI有bug。有些人说是时序要一样、有些人说时序不能一样。那按照SPI协议,主从的时序一致就对了的啊。还有的说主机的波特率要比从机的高,我也试了,是不行的,比如说主机4分频,从机32分频,输出是一些乱码。。。。众说纷纭,我都不知道哪个是真的,就是没有一个有效的解决办法。我才学了2个月,而且是自学的。那我更拿它没办法了。。。唉我就这么一直的试,但是它就那样。您也是做技术的,平时一定也很忙的,麻烦您有空的时候再帮我看一下吧。我不急的,主要就是想知道个究竟。谢谢您
这是主机的程序,这个RCC的配置也是可以的,我用它来点过LED灯的
这是从机的程序,我在最后加上while(1)不让程序跑飞,但这应该不影响啊
另外我将那个SPI读写的程序也贴上吧
hello,jonny.x:
不知道你的问题是否已经解决。你这个问题我也遇到过,但不知道是否与我的一样。你可以尝试主机在初始化完成后,延迟1S再向从机发送数据。详细原因可以具体讨论。
多谢出手相助