本帖最后由 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一直在发数据, 却是好的..).
有点没头绪了...请高手支招.. 如果有什么不清楚我还可以解释的更详细 |