MM32W無線MCU系列產品應用筆記 —— 自定義AT指令
MM32W0/3提供模組和開發(fā)板方式供客戶使用,支持UART\SPI\IIC接口的AT指令,用戶通過發(fā)送相關固定格式的指令方式可以實現對應功能。開發(fā)板上電后,模塊會自動進行廣播,移動設備的APP 會對其進行掃描和連接,連接成功之后可以通過BLE 在模塊和移動設備之間進行數據傳輸。用戶MCU 可通過模塊的串口和移動設備進行雙向通信,移動設備也可以通過APP 對模塊進行寫操作,寫入的數據將通過串口發(fā)送給用戶的MCU,模塊收到來自用戶MCU 串口的數據,將自動轉發(fā)給移動設備。AT 指令主要用于配置模塊參數,比如廣播間隔、設備名、等,也用于發(fā)送透傳數據和斷開BLE 連接。而對于AT指令,客戶可以很方便的進行修改,添加自己需要的功能。
通信流程圖1 通信流程
UART AT指令集
表1 UART AT指令集
在官方提供的程序中已經支持大部分的藍牙設置等操作,可以實現透傳、修改藍牙參數等操作,如果用戶需要單獨開發(fā)AT指令集可以通過以下方式進行開發(fā)。
接收指令
首先是接收指令時的數據處理流程:
圖2 接收指令流程圖
在每次藍牙服務調用UsrProcCallback()函數時,使用CheckAtCmdInfo()函數檢查是否收到數據,如果有,在進入休眠之前加入一個可以接收20個字節(jié)的延時,在接收中斷中接收剩下的數據,通過判斷最后一位是否是0x0d或是0x0a來獲得一條完整的指令,調用AtCmdPreParser()函數處理數據。檢查數組開始的“AT+”和后面的指令名稱,在at_func_list[]中查找并調用對應的函數對數據中后續(xù)的參數進行處理。
從流程中可以看到,如果只是簡單的加減指令的話,只需要修改at_func_list數組就可以了,結構體AT_CMD_FUNC的兩個成員變量分別是函數名稱和對應的字符串。
注:處理時間不宜太長,更不能阻塞
typedef void (*ATCMDFUNC)(u8* cmd,u8 len);
typedef struct _tagATCMD
{
ATCMDFUNC func;
u8 name[MAX_AT_CMD_NAME_SIZE]; //max len is 11 bytes
}AT_CMD_FUNC;
在例程中,收到AT指令要通過藍牙發(fā)送數據時,使用的是sconn_notifydata()接口函數,這是一種不需要應答的藍牙特征值,預設句柄為0x12,可以在發(fā)送前用set_notifyhandle()函數修改對應的句柄,或者直接修改變量u16 cur_notifyhandle。
發(fā)送數據
在例程中,通過UART發(fā)送數據都是通過moduleOutData()函數,往一個特定的緩存數組中寫入數據。這個函數可以加在任何位置,可以加在AT指令處理函數中發(fā)送應答數據,也可以加到BLE服務中實現數據透傳功能。
在每次藍牙服務調用UsrProcCallback()函數時檢查緩存數組,若不為空,在休眠之前加入一個延時,開啟發(fā)送緩沖空中斷,并在中斷中發(fā)送剩下的數據。
圖3 發(fā)送數據流程圖
void moduleOutData(u8*data, u8 len) //api
{
unsigned char i;
if ((txLen+len)<MAX_SIZE)//buff not overflow
{
for (i=0;i<len;i++){
txBuf[txLen+i] = *(data+i);
}
txLen += len;
}
}
#ifdef MM32W0NTB//NTB 32Pin UART1
void UART1_IRQHandler(void) //串口1中斷服務程序
#else //PFB 48Pin UART2
void UART2_IRQHandler(void) //串口2中斷服務程序
#endif
{
if(UART_GetITStatus(UART_BLE, UART_IT_TXIEN) != RESET){
UART_ClearITPendingBit(UART_BLE,UART_IT_TXIEN);
TxTimeout = SysTick_Count + (20000/BaudRate);
if (PosW < txLen){
UART_SendData(UART_BLE,txBuf[PosW++]);
if (PosW == txLen){
txLen = 0;
PosW = 0;
}
}
else{
UART_ITConfig(UART_BLE, UART_IT_TXIEN, DISABLE);
}
}
}
以上例程使用的是UART接口的自定義AT指令實現方式,用戶可以根據需要自行修改為其他接口,如SPI、IIC、CAN、USB等。
編輯:ls 最后修改時間:2022-06-09