SPI从机模式发送数据移位的问题~求解

tianxueqing08   2010-11-1 15:58 楼主


问题比较奇怪也复杂, 先大致描述一下..

在一个系统内部2个MCU之间用了SPI通讯.

SPI 主机是ARM9, 固定每100ms. 连续发送64个时钟和数据, 即使没有数据也发送dummy数据. 以保证从机准备的上传的数据有SCK时钟.

从机是STM32F101, 用SPI2. 用DMA接受与发送.  

两个边配成同样的模式, 空闲高电平. 第二个时钟边沿(也就是上升沿)交换数据.
CPOL = 1, CPHA = 1

出现了一个奇怪的问题, 如果用JTAG调试全速运行STM32(此时ARM9已经在狂发时钟了). 那么从STM32发出去的数据(它的MOSI脚), ARM9接受到的是正确的. 通过示波器看也是对的.
一旦断电后让程序自己跑. 那么ARM9收到的数据就会偏移一个bit. (发0xFF 0x0A, ARM9收到的是0xFE, 0x14(0x15). 最后一个bit取决于之后跟的字节的Bit7). 从示波器上看确实MOSI脚变成了FE..

我分析了一下. 很像是STM32的模式突然自己变成了第一个边沿交换数据.CPHA=0了. 而导致数据刚好移了一位.. 但是实时的printf出SPI2->CR2却发现没有变. 仍是11...

另外做了一些排除试验, 可以证明与DMA无关, 与上电后ARM9初始化的时间无关, (ARM9上电后要5秒才会开始发送SCK. STM32基本上电就可以立刻交换数据. 也就是说发送SCK前, STM32早就准备好了, 反倒是调试STM32的时候, ARM9一直在发数据, 却是好的..).

有点没头绪了...请高手支招.. 如果有什么不清楚我还可以解释的更详细

回复评论 (6)

这个问题有可能是在发出第一个时钟脉冲之前,时钟线上是低电平,导致开启时钟之后到发出第一个时钟的下降沿之前有一个电平的跳变(你要求的是空闲高电平,但初始化前线路上是低电平),这会不会是错误的原因呢?

你可以用示波器看看,是否有我说的电平跳变? 也可以考虑在时钟线上加一个上拉电阻,在MCU驱动时钟线之前,把时钟线拉到高电平。
点赞  2010-11-1 16:16
明天去试一下..

另外今天做了一个实验.  把STM32那端延时10s再初始化SPI.  这样直接上电后..也能发出正确的数据..
点赞  2010-11-1 22:32
如果按版主的说法的话...能够说通...

因为SCK   L->H 的跳变时.. 由于延时了10s才初始化. 不会对SPI从机造成影响..

先碎了..明儿继续debug..
点赞  2010-11-1 22:35

楼主这个问题解决了么,我准备要搞一个spi通讯,也是主机是2440,从机是stm32f103
点赞  2011-1-6 10:54
我的那个也是这个问题,加了延时还是不正确啊?请问楼主具体怎么解决的?
点赞  2011-10-7 10:38
我的好像解决了,发送延时一下,还有先初始化时钟,再配置端口,在配置SPI
点赞  2011-10-7 15:20
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复