TI中文支持网
TI专业的中文技术问题搜集分享网站

cc2650作为中转设备,同时使用spi和rf的问题,请指点

设备连接如下:

主设备 <—-spi—-> cc2650(简称A) <—-2.4gRF—-> 传感器cc2650(简称B)

与主设备连接的2650,即A,使用spi从模式,主设备随时可能有数据过来,此时A需要通过2.4g将数据发给B;B随时有数据上报到A上,此时A需要及时通过spi发给主设备。

当前处理方式:

1、A上电后使用SPI_transfer进入spi异步接收,同时使用EasyLink_receiveAsync接收rf数据;

2、在spi和rf的回调函数中,发出事件;

3、在事件处理任务中,一旦收到spi传输完毕事件,则调用SPI_transfer异步接收下一帧spi数据,再调用EasyLink_abort撤销rf接收状态,调用EasyLink_transmit发送数据给B,完成后再使用EasyLink_receiveAsync进入rf异步接收状态;

4、事件处理任务中,一旦收到rf传输完毕事件,则使用EasyLink_receiveAsync开始新的rf接收,再调用SPI_transferCancel取消spi接收,使用SPI_transfer发送数据,成功后再使用SPI_transfer进入spi异步接收状态。

上述流程能运行一段时间,时间长了之后,就无法工作,不知道问题出在哪里,哪位能指点一二,不胜感激。

my wu:

另外,如果想用SPI_transfer接收变长数据,有没有好的办法?
目前是先用SPI_transfer接收一个固定长度的帧头,从帧头获知后续长度,再调用SPI_transfer接收后续数据。
有更合理的方式吗?

Alvin Chen:

为什么不用多任务去做呢,此外你SPI和RF互相不影响没必要用SPI_transferCancel和EasyLink_abort。
先参考mutex的demo用多任务去做一下。
C:\ti\simplelink_cc13x0_sdk_3_10_00_11\examples\rtos\CC1310_LAUNCHXL\sysbios\mutex

my wu:

回复 Alvin Chen:

非常感谢,是这样的:spi收到的数据,要通过rf发出去;同理,rf接收到的数据,要通过spi发出去。

两者有关联,这是用SPI_transferCancel和EasyLink_abort的原因。

Alvin Chen:

回复 my wu:

你好,我推荐你用callback去做
SPI_Params_init(&spiParams);spiParams.frameFormat = SPI_POL0_PHA1;spiParams.mode = SPI_SLAVE;spiParams.transferCallbackFxn = transferCompleteFxn;spiParams.transferMode = SPI_MODE_CALLBACK;slaveSpi = SPI_open(Board_SPI_SLAVE, &spiParams);

你可以使用SPI_transferCancel取消spi接收,使用SPI_transfer在SPI 的callback函数,
同理上传给你的HOST一样在RF的callback 里面去做。

Alvin Chen:

回复 Alvin Chen:

这个其中可能存在收发切换的问题,可以看一下下面的例子,RF的操作是一样的。、
e2echina.ti.com/…/106253

my wu:

回复 Alvin Chen:

我琢磨下这个例子,参照参照。
目前spi使用的代码与您前面提到的差不多,唯一的差别是frameFormat我用的是SPI_POL1_PHA1。
在spi的回调函数中,post一个事件给任务,任务中调用EasyLink_abort取消当前rf操作,再调用EasyLink_transmit发出去;
在rf的回调函数中,post一个事件给任务,任务中调用SPI_transferCancel取消当前spi操作,再使用SPI_transfer发出去。

另外,用spi接收变长帧,有好的建议吗?SPI_transfer似乎只能接收固定长度帧。

Alvin Chen:

回复 my wu:

我们提供那个RX/TX的参考是通过UART 任务去选择切换RX/TX 然后去使用,你可以把UART切换成SPI即可。关于不定长SPI 传输应该是做不了的。

Alvin Chen:

回复 my wu:

不定长的帧预计做不了的。根据手册可知:

my wu:

回复 Alvin Chen:

之前用过st的片子,使用dma接收spi数据,虽然也是定长接收,但可以指定一个较大的长度。
启动dma后,在另一个任务中,随时读取dma当前已经接收了多少字节,再根据帧格式可以知道传输是否完成,比较方便。

Alvin Chen:

回复 my wu:

我们的SPI也是走的DMA,你可以看一下C:\ti\simplelink_cc13x0_sdk_3_10_00_11\source\ti\drivers\spi里面的SPICC26XXDMA.c 

在DMAconfig 时已经配置了定长bool ***(SPI_Handle handle, SPI_Transaction *transaction)

赞(0)
未经允许不得转载:TI中文支持网 » cc2650作为中转设备,同时使用spi和rf的问题,请指点
分享到: 更多 (0)