isakura 发表于 2014-9-30 14:09:31

MSP430的SPI通讯问题

现在调试MSP430的SPI,发现数据无法立即发出来,不知道是哪里出现问题的

硬件环境,
SPI主机:STM32F103
SPI从机:MSP430F5438

现在MSP430接收没问题,就是不能够立即发出去,
例如:STM32发送 0x11 0x22 0x33 3个数据
假设我想在MSP430收到0x11的时候应答0x55

我是这样做的,430一收到0x11数据,就 UCA0TXBUF = 0x55; 那么当STM32发送0x22时0x55也发送过去了

可是现在看到的是每次都是当STM32发送0x33的时候,0x55才传送完,0x22传送的是上一次填充到 UCA0TXBUF 的值

这样跟自己想的不一样,要怎么办?

isakura 发表于 2014-9-30 14:13:32

有没有人知道怎么弄?请指点下?

sdkw 发表于 2014-9-30 14:22:59

主机端多发一个无效数据就可以了

sdkw 发表于 2014-9-30 14:31:30

看样一下资料,接收数据应该是先在Receive Shift Register缓存了,再接收一个字节才会到RXBUF

rainyuoko 发表于 2014-9-30 14:39:51

ti给的例程是发送有效数据之前先发一字节空白数据

isakura 发表于 2014-9-30 14:59:58

rainyuoko 发表于 2014-9-30 14:39
ti给的例程是发送有效数据之前先发一字节空白数据

没看到过,我这里的例程是很简单的,就一个初始化加一个中断发送

isakura 发表于 2014-9-30 15:26:28

sdkw 发表于 2014-9-30 14:31
看样一下资料,接收数据应该是先在Receive Shift Register缓存了,再接收一个字节才会到RXBUF ...

STM32应该没这个机制吧,不是直接读SPIx->DR ?用的是库函数应该不会有问题啊

isakura 发表于 2014-9-30 15:30:15

sdkw 发表于 2014-9-30 14:22
主机端多发一个无效数据就可以了

不是多发一个,我是想弄明白为什么会这样

sdkw 发表于 2014-9-30 15:38:09

isakura 发表于 2014-9-30 15:26
STM32应该没这个机制吧,不是直接读SPIx->DR ?用的是库函数应该不会有问题啊 ...

刚才没看太清楚,5438发的时候也是通过Transmit Shift Register移位出去的,UCA0TXBUF赋值后需要主机再发两个字节才能到主机接收端,你看一下5438的SPI硬件框图就明白了

isakura 发表于 2014-9-30 16:10:29

sdkw 发表于 2014-9-30 15:38
刚才没看太清楚,5438发的时候也是通过Transmit Shift Register移位出去的,UCA0TXBUF赋值后需要主机再发 ...

两个字节?也就是和我现在的现象时一样的???

isakura 发表于 2014-9-30 16:31:17

sdkw 发表于 2014-9-30 15:38
刚才没看太清楚,5438发的时候也是通过Transmit Shift Register移位出去的,UCA0TXBUF赋值后需要主机再发 ...

看了下文档,没说要两个字节的时钟啊,感觉这样有点不对

sdkw 发表于 2014-9-30 16:41:54

本帖最后由 sdkw 于 2014-9-30 16:44 编辑

并不是每个字节都要两个字节的时钟,只是由于移位寄存器的存在,接收端滞后了一个字节而已,解决这个问题只需在主机端通信数据前或后增加一个无用字节就可以,通信协议最好有特殊的起始标志字节,这样方便解析

sdkw 发表于 2014-9-30 17:01:20

isakura 发表于 2014-9-30 16:31
看了下文档,没说要两个字节的时钟啊,感觉这样有点不对

我的理解是这样的,比如要把0X55发出去,第一个中断来时,将UCA0TXBUF赋值为0X55,此时移位寄存器的数据是UCA0TXBUF赋值之前的,第二个中断来时,移位寄存器将原来的数据发送完毕,此时UCA0TXBUF的0X55转移至移位寄存器,UCA0TXBUF可以再赋新数据,第三个中断,0X55由移位寄存器发送我完毕。

divineliu 发表于 2014-9-30 21:53:38

收到11的时候写55,这个时候22己经发送中了,当然只能下个字节发送了。我的理解而已,没试验。

isakura 发表于 2014-10-1 01:58:47

divineliu 发表于 2014-9-30 21:53 收到11的时候写55,这个时候22己经发送中了,当然只能下个字节发送了。我的理解而已,没试验。 ...

还真有这个可能,我用stm32做主机,是用for来连发的…

主机的cpu频率应该是72M(库默认的),msp430用的主频是16M用中断接收…

isakura 发表于 2014-10-9 17:46:21

divineliu 发表于 2014-9-30 21:53
收到11的时候写55,这个时候22己经发送中了,当然只能下个字节发送了。我的理解而已,没试验。 ...

确认是这个问题引起的,测试发现MSP的SPI进入中断,出中断的时间太久达到4、5us

divineliu 发表于 2014-10-9 20:09:14

解决了来坛子分享结果,赞了。
页: [1]
查看完整版本: MSP430的SPI通讯问题