搜索
bottom↓
回复: 16

MSP430的SPI通讯问题

[复制链接]
(230421975)

出0入14汤圆

发表于 2014-9-30 14:09:31 | 显示全部楼层 |阅读模式
现在调试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 的值

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

出0入14汤圆

 楼主| 发表于 2014-9-30 14:13:32 | 显示全部楼层
有没有人知道怎么弄?请指点下?
(230421167)

出0入0汤圆

发表于 2014-9-30 14:22:59 | 显示全部楼层
主机端多发一个无效数据就可以了
(230420656)

出0入0汤圆

发表于 2014-9-30 14:31:30 | 显示全部楼层
看样一下资料,接收数据应该是先在Receive Shift Register缓存了,再接收一个字节才会到RXBUF
(230420155)

出400入0汤圆

发表于 2014-9-30 14:39:51 | 显示全部楼层
ti给的例程是发送有效数据之前先发一字节空白数据
(230418948)

出0入14汤圆

 楼主| 发表于 2014-9-30 14:59:58 | 显示全部楼层
rainyuoko 发表于 2014-9-30 14:39
ti给的例程是发送有效数据之前先发一字节空白数据

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

出0入14汤圆

 楼主| 发表于 2014-9-30 15:26:28 | 显示全部楼层
sdkw 发表于 2014-9-30 14:31
看样一下资料,接收数据应该是先在Receive Shift Register缓存了,再接收一个字节才会到RXBUF ...

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

出0入14汤圆

 楼主| 发表于 2014-9-30 15:30:15 | 显示全部楼层
sdkw 发表于 2014-9-30 14:22
主机端多发一个无效数据就可以了

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

出0入0汤圆

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

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

出0入14汤圆

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

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

出0入14汤圆

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

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

出0入0汤圆

发表于 2014-9-30 16:41:54 | 显示全部楼层
本帖最后由 sdkw 于 2014-9-30 16:44 编辑

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

出0入0汤圆

发表于 2014-9-30 17:01:20 | 显示全部楼层
isakura 发表于 2014-9-30 16:31
看了下文档,没说要两个字节的时钟啊,感觉这样有点不对

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

出0入0汤圆

发表于 2014-9-30 21:53:38 来自手机 | 显示全部楼层
收到11的时候写55,这个时候22己经发送中了,当然只能下个字节发送了。我的理解而已,没试验。
(230379419)

出0入14汤圆

 楼主| 发表于 2014-10-1 01:58:47 来自手机 | 显示全部楼层
divineliu 发表于 2014-9-30 21:53 收到11的时候写55,这个时候22己经发送中了,当然只能下个字节发送了。我的理解而已,没试验。 ...

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

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

出0入14汤圆

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

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

出0入0汤圆

发表于 2014-10-9 20:09:14 | 显示全部楼层
解决了来坛子分享结果,赞了。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子论坛 ( 公安交互式论坛备案:44190002001997 粤ICP备09047143号 )

GMT+8, 2022-1-18 12:15

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表