设备连接如下:
主设备 <—-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)