MM32W無(wú)線(xiàn)MCU系列產(chǎn)品應(yīng)用筆記 —— 自定義AT指令
MM32W0/3提供模組和開(kāi)發(fā)板方式供客戶(hù)使用,支持UART\SPI\IIC接口的AT指令,用戶(hù)通過(guò)發(fā)送相關(guān)固定格式的指令方式可以實(shí)現(xiàn)對(duì)應(yīng)功能。開(kāi)發(fā)板上電后,模塊會(huì)自動(dòng)進(jìn)行廣播,移動(dòng)設(shè)備的APP 會(huì)對(duì)其進(jìn)行掃描和連接,連接成功之后可以通過(guò)BLE 在模塊和移動(dòng)設(shè)備之間進(jìn)行數(shù)據(jù)傳輸。用戶(hù)MCU 可通過(guò)模塊的串口和移動(dòng)設(shè)備進(jìn)行雙向通信,移動(dòng)設(shè)備也可以通過(guò)APP 對(duì)模塊進(jìn)行寫(xiě)操作,寫(xiě)入的數(shù)據(jù)將通過(guò)串口發(fā)送給用戶(hù)的MCU,模塊收到來(lái)自用戶(hù)MCU 串口的數(shù)據(jù),將自動(dòng)轉(zhuǎn)發(fā)給移動(dòng)設(shè)備。AT 指令主要用于配置模塊參數(shù),比如廣播間隔、設(shè)備名、等,也用于發(fā)送透?jìng)鲾?shù)據(jù)和斷開(kāi)BLE 連接。而對(duì)于AT指令,客戶(hù)可以很方便的進(jìn)行修改,添加自己需要的功能。
通信流程圖1 通信流程
UART AT指令集
表1 UART AT指令集
在官方提供的程序中已經(jīng)支持大部分的藍(lán)牙設(shè)置等操作,可以實(shí)現(xiàn)透?jìng)、修改藍(lán)牙參數(shù)等操作,如果用戶(hù)需要單獨(dú)開(kāi)發(fā)AT指令集可以通過(guò)以下方式進(jìn)行開(kāi)發(fā)。
接收指令
首先是接收指令時(shí)的數(shù)據(jù)處理流程:
圖2 接收指令流程圖
在每次藍(lán)牙服務(wù)調(diào)用UsrProcCallback()函數(shù)時(shí),使用CheckAtCmdInfo()函數(shù)檢查是否收到數(shù)據(jù),如果有,在進(jìn)入休眠之前加入一個(gè)可以接收20個(gè)字節(jié)的延時(shí),在接收中斷中接收剩下的數(shù)據(jù),通過(guò)判斷最后一位是否是0x0d或是0x0a來(lái)獲得一條完整的指令,調(diào)用AtCmdPreParser()函數(shù)處理數(shù)據(jù)。檢查數(shù)組開(kāi)始的“AT+”和后面的指令名稱(chēng),在at_func_list[]中查找并調(diào)用對(duì)應(yīng)的函數(shù)對(duì)數(shù)據(jù)中后續(xù)的參數(shù)進(jìn)行處理。
從流程中可以看到,如果只是簡(jiǎn)單的加減指令的話(huà),只需要修改at_func_list數(shù)組就可以了,結(jié)構(gòu)體AT_CMD_FUNC的兩個(gè)成員變量分別是函數(shù)名稱(chēng)和對(duì)應(yīng)的字符串。
注:處理時(shí)間不宜太長(zhǎng),更不能阻塞
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指令要通過(guò)藍(lán)牙發(fā)送數(shù)據(jù)時(shí),使用的是sconn_notifydata()接口函數(shù),這是一種不需要應(yīng)答的藍(lán)牙特征值,預(yù)設(shè)句柄為0x12,可以在發(fā)送前用set_notifyhandle()函數(shù)修改對(duì)應(yīng)的句柄,或者直接修改變量u16 cur_notifyhandle。
發(fā)送數(shù)據(jù)
在例程中,通過(guò)UART發(fā)送數(shù)據(jù)都是通過(guò)moduleOutData()函數(shù),往一個(gè)特定的緩存數(shù)組中寫(xiě)入數(shù)據(jù)。這個(gè)函數(shù)可以加在任何位置,可以加在AT指令處理函數(shù)中發(fā)送應(yīng)答數(shù)據(jù),也可以加到BLE服務(wù)中實(shí)現(xiàn)數(shù)據(jù)透?jìng)鞴δ堋?br />
在每次藍(lán)牙服務(wù)調(diào)用UsrProcCallback()函數(shù)時(shí)檢查緩存數(shù)組,若不為空,在休眠之前加入一個(gè)延時(shí),開(kāi)啟發(fā)送緩沖空中斷,并在中斷中發(fā)送剩下的數(shù)據(jù)。
圖3 發(fā)送數(shù)據(jù)流程圖
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中斷服務(wù)程序
#else //PFB 48Pin UART2
void UART2_IRQHandler(void) //串口2中斷服務(wù)程序
#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指令實(shí)現(xiàn)方式,用戶(hù)可以根據(jù)需要自行修改為其他接口,如SPI、IIC、CAN、USB等。
編輯:ls 最后修改時(shí)間:2022-06-09