NB模块初始化流程
文章目錄
- 1 NB模塊初始化流程分析
- 1.1 NB模塊初始化流程分析
- 1.2 常見AT指令
- 2 NB模塊初始化流程代碼實現
1 NB模塊初始化流程分析
1.1 NB模塊初始化流程分析
流程如下:
1.2 常見AT指令
測試日志如下:
//上電后自動輸出 [11-08 17:35:22:824]*MATREADY: 1 [11-08 17:35:22:824]+CFUN: 1 [11-08 17:35:23:554]+CPIN: READY //at [11-08 17:35:39:015]AT [11-08 17:35:39:015]OK [11-08 17:35:41:676]ATE1 [11-08 17:35:41:676]OK //讀取imei號 [11-08 17:35:44:993]AT+GSN [11-08 17:35:45:015]868334033341946 [11-08 17:35:45:015]OK //讀取imsi號 [11-08 17:35:48:105]AT+CIMI [11-08 17:35:48:117]460041677239460 [11-08 17:35:48:117]OK //檢查sim卡 [11-08 17:35:49:393]AT+CPIN? [11-08 17:35:49:406]+CPIN: READY [11-08 17:35:49:406]OK //設置apn [11-08 17:35:51:101]AT+CFUN=0 [11-08 17:35:51:771]+CPIN: NOT READY [11-08 17:35:51:870]OK [11-08 17:35:52:730]AT*MCGDEFCONT="IP","" [11-08 17:35:52:730]OK [11-08 17:35:54:440]AT+CFUN=1 [11-08 17:35:54:762]OK [11-08 17:35:55:157]+CPIN: READY //檢查網絡注冊 [11-08 17:35:55:915]AT+CSQ [11-08 17:35:55:915]+CSQ: 0,0 [11-08 17:35:55:915]OK [11-08 17:35:56:892]AT+CSQ [11-08 17:35:56:892]+CSQ: 0,0 [11-08 17:35:56:892]OK [11-08 17:35:57:491]AT+CSQ [11-08 17:35:57:491]+CSQ: 17,0 [11-08 17:35:57:491]OK [11-08 17:35:59:819]AT+CEREG? [11-08 17:35:59:832]+CEREG: 0,2 [11-08 17:35:59:832]OK [11-08 17:36:00:852]AT+CEREG? [11-08 17:36:00:852]+CEREG: 0,1 [11-08 17:36:00:852]OK [11-08 17:36:03:266]AT+CGACT? [11-08 17:36:03:277]+CGACT: 1,1 [11-08 17:36:03:277]OK [11-08 17:36:06:251]AT+CGCONTRDP [11-08 17:36:06:265]+CGCONTRDP: 1,5,"CMNBIOT","100.69.240.217.255.255.255.0" [11-08 17:36:06:265]OK2 NB模塊初始化流程代碼實現
dev_sim7020.c:
#include <string.h> #include "main.h" #include "at_parse.h" #include "app_debug.h"#include "FreeRTOS.h" #include "task.h"#define AT_CMD_AT "AT" #define AT_CMD_ATE0 "ATE0" #define AT_CMD_GET_IMEI "AT+GSN" //get imei #define AT_CMD_GET_IMSI "AT+CIMI" //get imsi #define AT_CMD_SET_APN "AT*MCGDEFCONT=\"IP\",\"\"" //cmnbiot "AT*MCGDEFCONT=\"IP\",\"cmnbiot\"" #define AT_CMD_CFUN0 "AT+CFUN=0" #define AT_CMD_CFUN1 "AT+CFUN=1" #define AT_CMD_CPIN "AT+CPIN?" #define AT_CMD_CSQ "AT+CSQ" #define AT_CMD_CEREG "AT+CEREG?" #define AT_CMD_CGACT "AT+CGACT?" #define AT_CMD_CGCONTRDP "AT+CGCONTRDP" #define AT_CMD_PSM_REPORT "AT+CPSMSTATUS=1" #define AT_CMD_PSM_ON "AT+CPSMS=1,,,\"01001010\",\"00000000\"" #define AT_CMD_PSM_OFF "AT+CPSMS=0" #define AT_REPORT_PSM "+CPSMSTATUS:"#define STATUS_IS_ON() (!HAL_GPIO_ReadPin(M_STA_GPIO_Port,M_STA_Pin)) #define STATUS_IS_OFF() (HAL_GPIO_ReadPin(M_STA_GPIO_Port,M_STA_Pin)) #define PWRKEY_HIGH() HAL_GPIO_WritePin(M_PWR_GPIO_Port,M_PWR_Pin,GPIO_PIN_RESET) #define PWRKEY_LOW() HAL_GPIO_WritePin(M_PWR_GPIO_Port,M_PWR_Pin,GPIO_PIN_SET)#define SIM_RECV_BUF_SIZE 150struct sim7020_control_t {char recv_buf[SIM_RECV_BUF_SIZE];uint16_t recv_len; }sim_ctl;static bool sim7020_at_ok() {uint16_t err=0;while (err<3){err++;if(at_send_wait_reply(AT_CMD_AT,true,"OK","ERROR",NULL,NULL,1000)==false)continue;if(at_send_wait_reply(AT_CMD_ATE0,true,"OK","ERROR",NULL,NULL,1000)==false)continue;return true;}return false;}bool sim7020_pwr_on() {uint16_t err=0;DEBUG("sim7020 pwr on");if(STATUS_IS_ON())return true;while(err<3){err++;PWRKEY_HIGH();vTaskDelay(200);PWRKEY_LOW();vTaskDelay(1000);PWRKEY_HIGH();vTaskDelay(500);if(!STATUS_IS_ON())continue;if(sim7020_at_ok()==false)continue;return true;}return false; }bool sim7020_pwr_off() {uint16_t err=0;DEBUG("sim7020 pwr off");if(STATUS_IS_OFF())return true;while(err<3){err++;PWRKEY_HIGH();vTaskDelay(200);PWRKEY_LOW();vTaskDelay(1500);PWRKEY_HIGH(); vTaskDelay(500);if(!STATUS_IS_OFF())continue;return true;}return false; }bool sim7020_reboot() {if(STATUS_IS_ON()){if(sim7020_pwr_off()==false)return false;}return sim7020_pwr_on(); }static bool sim7020_send_atcmd(char *cmd,char *prefix,uint32_t timeout) {memset(sim_ctl.recv_buf,0,SIM_RECV_BUF_SIZE);sim_ctl.recv_len=SIM_RECV_BUF_SIZE;return at_send_wait_reply (cmd,true,prefix,"ERROR",sim_ctl.recv_buf,&sim_ctl.recv_len,timeout); }static bool sim7020_get_imei() {uint16_t err=0;while(err<3){err++;vTaskDelay(100);if(sim7020_send_atcmd(AT_CMD_GET_IMEI,"86",1000)!=true)continue;return true;}return false; }static bool sim7020_check_sim() {uint16_t err=0;while(err<3){err++;vTaskDelay(500);if(sim7020_send_atcmd(AT_CMD_CPIN,"+CPIN: READY",1000)!=true)continue;return true;}return false; }static bool sim7020_set_apn() {uint16_t err=0;while(err<3){err++;vTaskDelay(100);if(sim7020_send_atcmd(AT_CMD_CFUN0,"OK",1000)!=true)continue;vTaskDelay(100);if(sim7020_send_atcmd(AT_CMD_SET_APN,"OK",1000)!=true)continue;vTaskDelay(100);if(sim7020_send_atcmd(AT_CMD_CFUN1,"+CPIN: READY",1000)!=true)continue;return true;}return false; }static bool sim7020_check_net() {uint16_t err=0;while(err<300){err++;vTaskDelay(100);if(sim7020_send_atcmd(AT_CMD_CSQ,"+CSQ:",1000)!=true)continue;vTaskDelay(100);if(sim7020_send_atcmd(AT_CMD_CEREG,"+CEREG: 0,1",1000)!=true)continue;vTaskDelay(100);if(sim7020_send_atcmd(AT_CMD_CGACT,"+CGACT: 1,1",1000)!=true)continue;vTaskDelay(100);if(sim7020_send_atcmd(AT_CMD_CGCONTRDP,"+CGCONTRDP:",1000)!=true)continue;return true;}return false;}bool sim7020_deinit() {DEBUG("sim7020 deinit");sim7020_pwr_off();at_parse_deinit();memset(&sim_ctl,0,sizeof(sim_ctl));return true; }bool sim7020_init() {uint16_t err=0;DEBUG("sim7020 init");while(err<3){err++;if(at_parse_init()!=true)continue;memset(&sim_ctl,0,sizeof(sim_ctl));if(sim7020_reboot()!=true)continue;if(sim7020_get_imei()!=true)continue;if(sim7020_check_sim()!=true)continue;if(sim7020_set_apn()!=true)continue;if(sim7020_check_net()!=true)continue;vTaskDelay(100);DEBUG("sim7020 init ok");return true;}sim7020_deinit();return false;}總結
- 上一篇: 散户数量为红柱是什么意思
- 下一篇: 原理图、PCB和实物是如何对应起来的