日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

cc1310 学习调试记录

發布時間:2024/3/26 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 cc1310 学习调试记录 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1、學習資料

?

2、基礎知識

?

3、調試問題

3.1?cc1310實現wor接收發送低功耗模式

在鎖里面用了cc1310來做前后面板的通信,所以需要通過cc1310的wor模式來通信

wor模式是通過控制rf核打開時間來實現的,及rf打開較短時間來抓包,其余時間都休眠,從而實現低功耗

具體實現代碼如下

/********************************************* * @文件: driverRf.c * @作者: cjx * @版本: v1.0.1 * @時間: 2017-01-15 * @概要: RF接收采用wor模式 發送采用連續發送 *********************************************/ #include <ti/drivers/rf/RF.h> #include <ti/devices/DeviceFamily.h> #include <ti/devices/cc13x0/driverlib/rf_prop_mailbox.h> #include <ti/drivers/PIN.h> #include <ti/drivers/pin/PINCC26XX.h>#include "Board.h" #include "RFQueue.h" #include "RFConf.h" #include "smartrf_settings.h"#include "driverFile.h" #include "driverTimer.h" #include "driverTime.h" #include "driverKey.h" #include "ioctrl.h" #include "queue.h" #include "assert.h"/* 基礎宏配置 */ #define RF_RX_INT 500 //接收間隔用來調節功耗 ms #define RF_TX_INT 10 //連續發送的間隔 ms #define RF_TX_MAX_CNT (2 * (RF_RX_INT / RF_TX_INT)) //連續發送最多的次數 這個根據RX休眠時間來定 如果有丟包可調節此參數 #define WOR_WAKEUPS_PER_SECOND (1000/RF_RX_INT) //每秒rf醒來的次數 用于功耗調節 #define DATA_ENTRY_HEADER_SIZE 8 /* Constant header size of a Generic Data Entry */ #define NUM_DATA_ENTRIES 1 /* NOTE: Only two data entries supported at the moment */ #define NUM_APPENDED_BYTES 1 /* Length byte included in the stored packet */#define FCFG1_BASE_ADDR 0x50001000 #define FCFG1_MAC_ADDR ((T_VOID *)(FCFG1_BASE_ADDR + 0x2F0)) //MAC地址/* 屬性變量 */ static RF_Object rfObject; static RF_Handle rfHandle; static rfc_propRxOutput_t rxStatistics; static rfc_CMD_PROP_RX_SNIFF_t RF_cmdPropRxSniff; //接收抓包屬性 static rfc_CMD_PROP_TX_ADV_t RF_cmdPropTxAdv; //發送廣播屬性/* RF數據包定義 */ typedef struct {T_U8 u8H[DATA_ENTRY_HEADER_SIZE]; //發送前導碼T_U8 len;T_U32 u32AbsTime; //絕對時間 用于濾數據T_U8 u8Data[RF_DATA_MAX_LENGTH];T_U8 u8R[10]; //做接收擴充預留 }T_RFRxData; typedef struct {T_U8 len;T_U32 u32AbsTime; //絕對時間 用于濾數據T_U8 u8Data[RF_DATA_MAX_LENGTH]; }T_RFTxData;static T_RFTxData g_stTxPacket; //發送緩存 static T_RFRxData g_stRxPacket; //接收緩存typedef enum {RF_M_RX_RUN = 0, //正常模式下接收RF_M_TX_RUN, //RF 發送模式RF_M_RX_SLEEP, //RF 休眠抓包模式 }E_RF_M;/* RF控制數據*/ typedef struct {T_U8 u8TaskM; //RF_IOCTL_CMDT_U8 u8RfM; //E_RF_MT_U8 u8TxCnt; //發送次數計數T_U32 u32OldAbsTime; //用于記錄上一次結收數據包的時間}T_RFCtl; //rf控制數據static T_RFCtl g_RFCtl;static T_U8 g_u8RfPopFlag = 0; static T_U8 g_u8RfReadCache[RF_DATA_MAX_LENGTH];static T_VOID Rf_TaskHandler(T_VOID *pvData);/*********************************************功能:RF 初始化*輸入:無*輸出:無*條件:無*返回:無注意: *********************************************/ static PIN_Handle ledPinHandle; static PIN_State ledPinState; PIN_Config pinTable[] = {IOID_7 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX,IOID_6 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX,PIN_TERMINATE }; static T_VOID Rf_Init(T_VOID) {RF_Params stRfParams;RF_Params_init(&stRfParams);/* 初始化rf */rfHandle = RF_open(&rfObject, &RF_prop, (RF_RadioSetup*)&RF_cmdPropRadioDivSetup, &stRfParams);RF_runCmd(rfHandle, (RF_Op*)&RF_cmdFs, RF_PriorityNormal, NULL, 0);memset(&g_RFCtl, 0, sizeof(T_RFCtl));ledPinHandle = PIN_open(&ledPinState, pinTable); } /*********************************************功能:RF 設置整個工作模式*輸入:模式*輸出:無*條件:無*返回:無注意: *********************************************/ static T_VOID Rf_SetTaskMode(RF_IOCTL_CMD emM) {g_RFCtl.u8TaskM = emM; } /*********************************************功能:RF 設置模式*輸入:模式*輸出:無*條件:無*返回:無注意: *********************************************/ static T_VOID Rf_SetMode(E_RF_M emM) {T_U32 stTick;TimerHandle stTimeNode;TimeTick stTimeTick;g_RFCtl.u8RfM= emM;g_RFCtl.u8TxCnt = 0;MDL_TIME_GetTimeTick(&stTimeTick);stTick = stTimeTick.u32Sec*1000 + stTimeTick.s32MSec;stTimeNode.fTimerHandle = Rf_TaskHandler;stTimeNode.pvData = T_NULL;stTimeNode.s32MSec = stTick + 100;MDL_DRVTIMER_AddTimer(&stTimeNode); }/*********************************************功能:RF 接收抓包配置*輸入:u8WkPerS :每秒喚醒次數*輸出:無*條件:無*返回:無注意: *********************************************/ static T_VOID Rf_RxConf(T_U8 u8WkPerS) {T_U32 u32Datarate;dataQueue_t stDataQueue;/* 創建接收數據入口 */if (RFQueue_defineQueue(&stDataQueue,(uint8_t *)&g_stRxPacket,sizeof(g_stRxPacket),NUM_DATA_ENTRIES,sizeof(T_RFTxData) + NUM_APPENDED_BYTES)) //RF_DATA_MAX_LENGTH + NUM_APPENDED_BYTES)){while(1);}/* 初始化抓包屬性 */initializeSniffCmdFromRxCmd(&RF_cmdPropRxSniff, &RF_cmdPropRx);RF_cmdPropRxSniff.pQueue = &stDataQueue;RF_cmdPropRxSniff.pOutput = (uint8_t*)&rxStatistics;RF_cmdPropRxSniff.maxPktLen = sizeof(T_RFTxData);//RF_DATA_MAX_LENGTH;RF_cmdPropRxSniff.rxConf.bAutoFlushIgnored = 1;RF_cmdPropRxSniff.rxConf.bAutoFlushCrcErr = 1;u32Datarate = calculateSymbolRate(RF_cmdPropRadioDivSetup.symbolRate.preScale,RF_cmdPropRadioDivSetup.symbolRate.rateWord);configureSniffCmd(&RF_cmdPropRxSniff, WOR_MODE, u32Datarate, u8WkPerS); RF_cmdPropRxSniff.startTime = RF_getCurrentTime();RF_cmdPropRxSniff.startTime += WOR_WAKE_UP_INTERVAL_RAT_TICKS(u8WkPerS); } /*********************************************功能:RF 發送配置*輸入:數據*輸出:無*條件:無*返回:無注意: *********************************************/ static T_VOID Rf_TxConf(T_U8 *pu8W, T_U32 u32Len) {g_stTxPacket.len = sizeof(g_stTxPacket)-1;g_stTxPacket.u32AbsTime = RF_getCurrentTime();memcpy(&g_stTxPacket.u8Data, pu8W, u32Len);initializeTxAdvCmdFromTxCmd(&RF_cmdPropTxAdv, &RF_cmdPropTx);RF_cmdPropTxAdv.pktLen = sizeof(T_RFTxData); /* +1 for length byte */RF_cmdPropTxAdv.pPkt = (uint8_t *)&g_stTxPacket;RF_cmdPropTxAdv.preTrigger.triggerType = TRIG_REL_START;RF_cmdPropTxAdv.preTime = WOR_PREAMBLE_TIME_RAT_TICKS(1000 / 10); }/*********************************************功能:RF 接收*輸入:模式*輸出:無*條件:無*返回:無注意: *********************************************/ static T_VOID Rf_RxCheck(T_VOID) {switch(RF_cmdPropRxSniff.status) {case PROP_DONE_IDLE:{} break;case PROP_DONE_IDLETIMEOUT:{} break;case PROP_DONE_RXTIMEOUT:{} break;case PROP_DONE_OK:{if(g_RFCtl.u32OldAbsTime != g_stRxPacket.u32AbsTime){/*不是重復包*/memcpy(g_u8RfReadCache, &g_stRxPacket.u8Data, RF_DATA_MAX_LENGTH);g_u8RfPopFlag = 1;g_RFCtl.u32OldAbsTime = g_stRxPacket.u32AbsTime;}} break;case PROP_ERROR_RXBUF:{} break;default:break;} }/*********************************************功能:RF 事件回調*輸入:模式*輸出:無*條件:無*返回:無注意: *********************************************/ void RF_EventCallBack(RF_Handle h, RF_CmdHandle ch, RF_EventMask e) {e = e; }/*********************************************功能:RF 控制*輸入:數據*輸出:無*條件:無*返回:無注意: *********************************************/ static T_VOID Rf_TaskHandler(T_VOID *pvData) {T_U32 stTick;TimerHandle stTimeNode;TimeTick stTimeTick;if(RF_M_RX_RUN == g_RFCtl.u8RfM){/*在整個任務不休眠的情況下rf采用間隔時間抓包抓包等待時間設置要短 避免影響其他程 序運行*/Rf_RxConf(100);RF_runCmd(rfHandle, (RF_Op*)&RF_cmdPropRxSniff, RF_PriorityNormal, &RF_EventCallBack, RF_EventRxEntryDone); //會阻塞休眠Rf_RxCheck();if(RF_SLEEP_CMD == g_RFCtl.u8TaskM){Rf_SetMode(RF_M_RX_SLEEP);}MDL_TIME_GetTimeTick(&stTimeTick);stTick = stTimeTick.u32Sec*1000 + stTimeTick.s32MSec;stTimeNode.fTimerHandle = Rf_TaskHandler;stTimeNode.pvData = T_NULL;stTimeNode.s32MSec = stTick + RF_RX_INT;MDL_DRVTIMER_AddTimer(&stTimeNode);}if(RF_M_RX_SLEEP == g_RFCtl.u8RfM){/*休眠情況下rf采用間隔時間抓包抓包等待時間設置合理可以降低功耗*/SysTickStop(); //關閉系統時鐘Rf_RxConf(WOR_WAKEUPS_PER_SECOND);RF_runCmd(rfHandle, (RF_Op*)&RF_cmdPropRxSniff, RF_PriorityNormal, &RF_EventCallBack, RF_EventRxEntryDone); //這里會休眠Rf_RxCheck();PIN_setOutputValue(ledPinHandle, IOID_7, !PIN_getOutputValue(IOID_7));MDL_TIME_GetTimeTick(&stTimeTick);stTick = stTimeTick.u32Sec*1000 + stTimeTick.s32MSec;stTimeNode.fTimerHandle = Rf_TaskHandler;stTimeNode.pvData = T_NULL;stTimeNode.s32MSec = stTick; //如果沒接到數據立馬又接收休眠MDL_DRVTIMER_AddTimer(&stTimeNode);SysTickStart();}if(RF_M_TX_RUN == g_RFCtl.u8RfM){/*發送采用連續發包模式要保證與rf接收喚醒間隔內能收到至少一次數據*/ if(g_RFCtl.u8TxCnt++ < RF_TX_MAX_CNT){RF_runCmd(rfHandle, (RF_Op*)&RF_cmdPropTxAdv, RF_PriorityNormal, NULL, 0);}else{g_RFCtl.u8TxCnt = 0;Rf_SetMode(RF_M_RX_RUN);}MDL_TIME_GetTimeTick(&stTimeTick);stTick = stTimeTick.u32Sec*1000 + stTimeTick.s32MSec;stTimeNode.fTimerHandle = Rf_TaskHandler;stTimeNode.pvData = T_NULL;stTimeNode.s32MSec = stTick + RF_TX_INT; MDL_DRVTIMER_AddTimer(&stTimeNode); }} /*********************************************功能:打開函數*輸入:無*輸出:無*條件:無*返回:成功:RET_SUCCESS 失敗:RET_FAILED 注意: *********************************************/ static T_S32 _RF_Open(T_VOID) {Rf_Init();Rf_SetMode(RF_M_RX_RUN);return RET_SUCCESS; } /*********************************************功能:讀取函數*輸入:無*輸出:無*條件:無*返回:成功:RET_SUCCESS 失敗:RET_FAILED 或者長度注意: *********************************************/ static T_S32 _RF_Read(T_S8 *ps8DataBuf, T_S32 s32BufLen) {ASSERT_EQUAL_RETVAL(ps8DataBuf, T_NULL, RET_FAILED);ASSERT_EQUAL_RETVAL(s32BufLen, 0, RET_FAILED);if(1 == g_u8RfPopFlag){g_u8RfPopFlag = 0;if(s32BufLen >= RF_DATA_MAX_LENGTH){memcpy(ps8DataBuf, g_u8RfReadCache, RF_DATA_MAX_LENGTH);return RF_DATA_MAX_LENGTH;}else{return RET_FAILED;}}return RET_FAILED; } /*********************************************功能:寫入函數*輸入:無*輸出:無*條件:無*返回:成功:RET_SUCCESS 失敗:RET_FAILED 或者長度注意: *********************************************/ static T_S32 _RF_Write(T_S8 *ps8DataBuf, T_S32 s32BufLen) {ASSERT_EQUAL_RETVAL(ps8DataBuf, T_NULL, RET_FAILED);ASSERT_EQUAL_RETVAL(s32BufLen, 0, RET_FAILED);Rf_TxConf((T_U8 *)ps8DataBuf, s32BufLen);Rf_SetMode(RF_M_TX_RUN);return s32BufLen; } /*********************************************功能:控制接口*輸入:s32Cmd :命令類型RF_IOCTL_CMDpvData:暫無數據*條件:無*返回:成功:RET_SUCCESS 失敗:RET_FAILED *********************************************/ static T_S32 _RF_Ioctl(T_S32 s32Cmd, T_VOID *pvData) {if(s32Cmd < RF_GET_MAC_CMD){Rf_SetTaskMode((RF_IOCTL_CMD)s32Cmd);}else{ASSERT_EQUAL_RETVAL(pvData, T_NULL, RET_FAILED);memcpy(pvData, FCFG1_MAC_ADDR, RF_MAC_LENGTH);}return RET_SUCCESS; } /*********************************************功能:事件標志*輸入:無*輸出:無*條件:無*返回:成功:RET_SUCCESS 失敗:RET_FAILED 注意: *********************************************/ static T_S32 _RF_Pop(T_VOID) {if(0 == g_u8RfPopFlag){return RET_FAILED;} return RET_SUCCESS; } /*********************************************功能:初始化DRIVER_RF_Init并且將其添加至文件列表*輸入:無*輸出:無.*條件:無*返回:成功:RET_SUCCESS 失敗:RET_FAILED 注意:無 *********************************************/ T_S32 DRIVER_RF_Init(T_VOID) {FileOperation stKeyFileOperation;memset(stKeyFileOperation.s8ModelName, 0, MODEL_NAME_LEN);strcpy((char *)stKeyFileOperation.s8ModelName, "RF");stKeyFileOperation.FileIoctl = _RF_Ioctl;stKeyFileOperation.FileOpen = _RF_Open;stKeyFileOperation.FileRead = _RF_Read;stKeyFileOperation.FileWrite = _RF_Write;stKeyFileOperation.FilePop = _RF_Pop;stKeyFileOperation.FileClose = T_NULL;stKeyFileOperation.FileRelease = T_NULL;return MDL_FILE_AddModel(&stKeyFileOperation); }

?

總結

以上是生活随笔為你收集整理的cc1310 学习调试记录的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。