完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我将TX和RX整合在一起,利用按钮做切换,但程式却丝毫没有动作,可以麻烦帮我看下问题出在哪?谢谢~
//TX + RX // //接收-LED0亮 (常态) //发送-LED1亮 // //BUTTON0-切换为TX模式,传送数据包,传送完再转为RX模式 #include #include #include #include #include #include #include #include #include #include "Board.h" #include "easylink/EasyLink.h" #define RFEASYLINKTX_ASYNC bool TXmode = FALSE; //预设为RX模式 uint8_t txBurstSize = 0; EasyLink_TxPacket txPacket = [0]; //*****RX #define RFEASYLINKRX_ASYNC #define RFEASYLINKRX_ADDR_FILTER #define RFEASYLINKEX_TASK_STACK_SIZE 1024 #define RFEASYLINKEX_TASK_PRIORITY 2 //*****TX #define RFEASYLINKTX_ASYNC #define RFEASYLINKTX_TASK_STACK_SIZE 1024 #define RFEASYLINKTX_TASK_PRIORITY 2 #define RFEASYLINKTX_BURST_SIZE 10 #define RFEASYLINKTXPAYLOAD_LENGTH 30 //*********RX static Task_Params rxTaskParams; Task_Struct rxTask; static uint8_t rxTaskStack[RFEASYLINKEX_TASK_STACK_SIZE]; static PIN_Handle ledHandle; static PIN_State ledState; static PIN_Handle btnHandle; static PIN_State btnState; PIN_Config ledTable[] = [ Board_PIN_LED1 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX, Board_PIN_LED2 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX, PIN_TERMINATE ]; PIN_Config btnTable[] = [ Board_PIN_BUTTON0 | PIN_INPUT_EN | PIN_PULLUP | PIN_IRQ_NEGEDGE, PIN_TERMINATE ]; //*******TX static uint16_t seqNumber; //*************RX #ifdef RFEASYLINKRX_ASYNC static Semaphore_Handle rxDoneSem; #endif //*************TX #ifdef RFEASYLINKTX_ASYNC static Semaphore_Handle txDoneSem; #endif void buttonCallbackFxn(PIN_Handle handle, PIN_Id pinId) [ if(!PIN_getInputValue(pinId))[ TXmode = TRUE; //button切换RX、TX模式 ] ] //***************RX //紅燈長亮-RX 紅燈一閃-RX中止 紅黃燈一閃-RX(TX)不正常 #ifdef RFEASYLINKRX_ASYNC void rxDoneCb(EasyLink_RxPacket * rxPacket, EasyLink_Status status) [ if (status == EasyLink_Status_Success) [ PIN_setOutputValue(ledHandle, Board_PIN_LED1, 1); ] else if(status == EasyLink_Status_Aborted) [ PIN_setOutputValue(ledHandle, Board_PIN_LED1,!PIN_getOutputValue(Board_PIN_LED1)); ] else [ PIN_setOutputValue(ledHandle, Board_PIN_LED1,!PIN_getOutputValue(Board_PIN_LED1)); PIN_setOutputValue(ledHandle, Board_PIN_LED2,!PIN_getOutputValue(Board_PIN_LED2)); ] Semaphore_post(rxDoneSem); ] #endif //***************TX //黃燈長亮-TX 黃燈一閃-TX中止 紅黃燈一閃-TX(RX)不正常 #ifdef RFEASYLINKTX_ASYNC void txDoneCb(EasyLink_Status status) [ if (status == EasyLink_Status_Success) [ PIN_setOutputValue(ledHandle, Board_PIN_LED2, 1); ] else if(status == EasyLink_Status_Aborted) [ PIN_setOutputValue(ledHandle, Board_PIN_LED2,!PIN_getOutputValue(Board_PIN_LED2)); ] else [ PIN_setOutputValue(ledHandle, Board_PIN_LED1,!PIN_getOutputValue(Board_PIN_LED1)); PIN_setOutputValue(ledHandle, Board_PIN_LED2,!PIN_getOutputValue(Board_PIN_LED2)); ] Semaphore_post(txDoneSem); ] #endif //**************RX static void rfEasyLinkRxFnx(UArg arg0, UArg arg1) [ #ifndef RFEASYLINKRX_ASYNC EasyLink_RxPacket rxPacket = [0]; #endif #ifdef RFEASYLINKRX_ASYNC Semaphore_Params params; Error_Block eb; Semaphore_Params_init(¶ms); Error_init(&eb); rxDoneSem = Semaphore_create(0, ¶ms, &eb); #endif //RFEASYLINKRX_ASYNC EasyLink_init(EasyLink_Phy_Custom); #ifdef RFEASYLINKRX_ADDR_FILTER uint8_t addrFilter = 0xaa; EasyLink_enableRxAddrFilter(&addrFilter, 1, 1); #endif //RFEASYLINKRX_ADDR_FILTER while(1) [ #ifdef RFEASYLINKRX_ASYNC //RX模式 if(TXmode == FALSE)[ EasyLink_receiveAsync(rxDoneCb, 0); /* Wait 300ms for Rx */ if(Semaphore_pend(rxDoneSem, (300000 / Clock_tickPeriod)) == FALSE) [ /* RX timed out abort */ if(EasyLink_abort() == EasyLink_Status_Success) [ /* Wait for the abort */ Semaphore_pend(rxDoneSem, BIOS_WAIT_FOREVER); ] ] ] //TX模式 else[ txPacket.payload[0] = (uint8_t)(seqNumber >> 8); txPacket.payload[1] = (uint8_t)(seqNumber++); uint8_t i; for (i = 2; i < RFEASYLINKTXPAYLOAD_LENGTH; i++) [ txPacket.payload = i+2; ] txPacket.len = RFEASYLINKTXPAYLOAD_LENGTH; txPacket.dstAddr[0] = 0xaa; if(txBurstSize++ >= RFEASYLINKTX_BURST_SIZE) [ txPacket.absTime = EasyLink_getAbsTime() + EasyLink_ms_To_RadioTime(50); //50->1000 txBurstSize = 0; ] else [ txPacket.absTime = EasyLink_getAbsTime() + EasyLink_ms_To_RadioTime(5); ] EasyLink_transmitAsync(&txPacket, txDoneCb); if(Semaphore_pend(txDoneSem, (15000 / Clock_tickPeriod)) == FALSE) [ if(EasyLink_abort() == EasyLink_Status_Success) [ Semaphore_pend(txDoneSem, BIOS_WAIT_FOREVER); ] TXmode = FALSE; ] ] #else if(TXmode == FALSE) [ rxPacket.absTime = 0; EasyLink_Status result = EasyLink_receive(&rxPacket); if (result == EasyLink_Status_Success) [ PIN_setOutputValue(ledHandle, Board_PIN_LED2,!PIN_getOutputValue(Board_PIN_LED2)); ] else [ PIN_setOutputValue(ledHandle, Board_PIN_LED1,!PIN_getOutputValue(Board_PIN_LED1)); PIN_setOutputValue(ledHandle, Board_PIN_LED2,!PIN_getOutputValue(Board_PIN_LED2)); ] ] #endif //RX_ASYNC ] ] //*******************RX void rxTask_init(PIN_Handle ledPinHandle) [ ledHandle = ledPinHandle; Task_Params_init(&rxTaskParams); rxTaskParams.stackSize = RFEASYLINKEX_TASK_STACK_SIZE; rxTaskParams.priority = RFEASYLINKEX_TASK_PRIORITY; rxTaskParams.stack = &rxTaskStack; rxTaskParams.arg0 = (UInt)1000000; Task_construct(&rxTask, rfEasyLinkRxFnx, &rxTaskParams, NULL); ] int main(void) [ Board_initGeneral(); ledHandle = PIN_open(&ledState, ledTable); if(!ledHandle) [ System_abort("Error initializing board LED pinsn"); ] btnHandle = PIN_open(&btnState, btnTable); if (!btnHandle) [ System_abort("Error initializing button pinsn"); ] PIN_setOutputValue(ledHandle, Board_PIN_LED1, 0); PIN_setOutputValue(ledHandle, Board_PIN_LED2, 0); rxTask_init(ledHandle); BIOS_start(); return (0); ] |
|
相关推荐
4 个讨论
|
|
个人用户 发表于 2020-3-25 07:59 谢谢你的发现,我补上之后已经可以运作,但现在有个问题: 两块板子CC1310汇入同一个程式,通电并搭配使用SmartRF studio7来看接收的资料, 当我板子A作为接收时,并开启SmartRF studio7里的packet.RX,板子B不开启SmartRF studio7,若B按下按钮,则我可以在SmartRF studio7看见数据; 当我板子A作为接收时,并开启SmartRF studio7里的packet.RX,板子B也开启SmartRF studio7,则不论是从A还是B的SmartRF studio7都看不到数据接收,而板子也没出现任何灯号 另外当我两块板子都不开启SmartRF studio7的话,是可以看到正常的灯号变化,我可以由灯号判断出是否进入TX模式,但我无法判断另一块板子是否接收成功.... 请问是什么原因??? |
|
|
|
|
|
cknz 发表于 2020-3-25 08:09 当你“开启”smartRF studio时,板子直接受studio控制,之前下载到板子Flash里的程序不会运行; 当你“不开启”smartRF studio时,板子才会运行Flash里的程序。 “开启”smartRF studio不会擦除或改写Flash里的程序。 所以, 你描述的第一种情况,A受studio控制,执行packet rx;B运行Flash里的代码,B按下按钮后开始发送,所以你能在A板对应的smartRF studio的packet rx中接收到B发出的数据 你描述的第二种情况,A和B都受studio控制,都在执行packet rx;这时没有设备发送数据,所以在两个studio界面里都看不到接收数据。因为两块板子都没有运行Flash里的程序,因此LED也不会闪烁 你描述的第三种情况,A和B都不受studio控制,都在运行Flash里的程序,具体是处于tx还是rx,取决于你的按钮操作。按照你的代码,在成功接收到数据后,应该会点亮LED_1。 |
|
|
|
|
|
只有小组成员才能发言,加入小组>>
344 浏览 1 评论
539 浏览 2 评论
NA555DR VCC最低电压需要在5V供电,为什么用3.3V供电搭了个单稳态触发器也使用正常?
783 浏览 3 评论
MSP430F249TPMR出现高温存储后失效了的情况,怎么解决?
655 浏览 1 评论
对于多级放大电路板,在PCB布局中,电源摆放的位置应该注意什么?
1138 浏览 1 评论
AT32F407在USART2 DMA发送数据时,接包接到了要发送的数据,程序还是处于等待传输完成的标识判断中,为什么?
73浏览 29评论
241浏览 23评论
请问下tpa3220实际测试引脚功能和官方资料不符,哪位大佬可以帮忙解答下
261浏览 20评论
请教下关于TAS5825PEVM评估模块原理图中不太明白的地方,寻求答疑
208浏览 14评论
两个TMP117传感器一个可以正常读取温度值,一个读取的值一直是0,为什么?
67浏览 13评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-26 06:52 , Processed in 0.865337 second(s), Total 49, Slave 43 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号