打印

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

[复制链接]
6052|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Swd21ic|  楼主 | 2010-11-1 15:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 Swd21ic 于 2010-11-1 16:04 编辑

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

在一个系统内部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一直在发数据, 却是好的..).

有点没头绪了...请高手支招.. 如果有什么不清楚我还可以解释的更详细
沙发
香水城| | 2010-11-1 16:16 | 只看该作者
这个问题有可能是在发出第一个时钟脉冲之前,时钟线上是低电平,导致开启时钟之后到发出第一个时钟的下降沿之前有一个电平的跳变(你要求的是空闲高电平,但初始化前线路上是低电平),这会不会是错误的原因呢?

你可以用示波器看看,是否有我说的电平跳变? 也可以考虑在时钟线上加一个上拉电阻,在MCU驱动时钟线之前,把时钟线拉到高电平。

使用特权

评论回复
板凳
Swd21ic|  楼主 | 2010-11-1 22:32 | 只看该作者
明天去试一下..

另外今天做了一个实验.  把STM32那端延时10s再初始化SPI.  这样直接上电后..也能发出正确的数据..

使用特权

评论回复
地板
Swd21ic|  楼主 | 2010-11-1 22:35 | 只看该作者
如果按香主的说法的话...能够说通...

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

先碎了..明儿继续debug..

使用特权

评论回复
5
torsten| | 2011-1-6 10:54 | 只看该作者
4# Swd21ic
楼主这个问题解决了么,我准备要搞一个spi通讯,也是主机是2440,从机是stm32f103

使用特权

评论回复
6
mailiang98| | 2017-2-21 21:41 | 只看该作者
你好,我遇到了同样的问题,请问你是怎么解决的,我的只要再NRST引脚用电平复位一下STM8,数据也会正常

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

71

主题

781

帖子

1

粉丝