移远NB-IOT BC28模块模组简介及初始化代码

发布于 2018-08-21  662 次阅读


BC28 基于华为海思芯片平台研发,支持 B1/B3/B5/B8/B20/B28 频段,在 multi tone 模式下最大上行速率可达 62.5kbps。BC28 是一款超紧凑、高性能、低功耗的多频段 NB-IoT 无线通信模块。其尺寸仅为 17.7mm × 15.8mm × 2.0mm,能最大限度地满足终端设备对小尺寸模块产品的需求,同时有效地帮助客户减小产品尺寸并优化产品成本。BC28 在设计上兼容移远通信 GSM/GPRS 系列的 M26 模块,方便客户快速、灵活的进行产品设计和升级。

官方推荐使用流程

 

初始化代码

void BC28_Init(void)
{
		HAL_TIM_Base_Start_IT(&htim6);
		Clear_Buffer();
		while(sim900a_send_cmd("AT","OK",200))
		{
			debug_log("NB-iot reset\r\n",14);
		
		}
		uint8_t cnt=0;
    BC28_Status.netstatus=2;
		while(sim900a_send_cmd("AT+CIMI","460",200))
		{
			debug_log("NB-iot reset\r\n",14);	
		}
		while(sim900a_send_cmd("AT+CGATT=1","OK",200))
		{
			debug_log("NB-iot reset\r\n",14);	
		}
		while(sim900a_send_cmd("AT+CGATT?","+CGATT:1",200))
		{
			debug_log("NB-iot reset\r\n",14);	
		}
		BC28_Status.netstatus=1;
		Clear_Buffer();
    printf("AT+CSQ\r\n");
    wait_for_bc28(300);
    strx=strstr((const char*)Usart3Type.RX_pData,(const char*)"+CSQ");//·µ»ØCSQ
  if(strx)
    {
        BC28_Status.CSQ=(strx[5]-0x30)*10+(strx[6]-0x30);//»ñÈ¡CSQ
        if(BC28_Status.CSQ==99)//˵Ã÷É¨ÍøÊ§°Ü
        {
            while(1)
            {
                debug_log("ÐźÅËÑË÷ʧ°Ü£¬Çë²é¿´Ô­Òò!\r\n",20);
                HAL_Delay(300);
            }
        }
        BC28_Status.netstatus=4;//×¢Íø³É¹¦
     } 
  while(strx==NULL)
    {
        Clear_Buffer();	
        printf("AT+CSQ\r\n");//²é¿´»ñÈ¡CSQÖµ
        wait_for_bc28(300);
        strx=strstr((const char*)Usart3Type.RX_pData,(const char*)"+CSQ");//
        if(strx)
        {
            BC28_Status.CSQ=(strx[5]-0x30)*10+(strx[6]-0x30);//»ñÈ¡CSQ
            if(BC28_Status.CSQ==99)//˵Ã÷É¨ÍøÊ§°Ü
            {
                while(1)
                {
                    debug_log("ÐźÅËÑË÷ʧ°Ü£¬Çë²é¿´Ô­Òò!\r\n",20);
                    HAL_Delay(300);
                }
            }
						BC28_Status.netstatus=4;//×¢Íø³É¹¦
         }
    }
		while(sim900a_send_cmd("AT+CEREG=1","OK",200))
		{
			debug_log("NB-iot reset\r\n",14);	
		}
	
}

AT指令与应答检测程序

/**
  * @brief    检测应答字符串
  * @note 
  * @retern null
  * @{
  */
uint8_t* sim900a_check_cmd(uint8_t *str)
{
	char *strx=0;
	if(Usart3Type.RX_flag == 1)		
	{ 
		Usart3Type.RX_pData[Usart3Type.RX_Size]=0;
		strx=strstr((const char*)Usart3Type.RX_pData,(const char*)str);
	} 
	return (uint8_t*)strx;
}
/**
  * @brief   发送AT指令并检测应答
  * @note 
  * @retern null
  * @{
  */
uint8_t sim900a_send_cmd(uint8_t *cmd,uint8_t *ack,uint16_t waittime)
{
	uint8_t res=0; 
	Usart3Type.RX_flag = 0;
	HAL_UART_Receive_DMA(&huart3,Usart3Type.RX_pData,RX_LEN);
	__HAL_UART_ENABLE_IT(&huart3, UART_IT_IDLE);
	printf("%s\r\n",cmd);//
	if(ack&&waittime)		//
	{
		while(--waittime)	//
		{
			HAL_Delay(10);
			if(Usart3Type.RX_flag == 1)//
			{
				if(sim900a_check_cmd(ack))break;//
				Usart3Type.RX_flag = 0;
				HAL_UART_Receive_DMA(&huart3,Usart3Type.RX_pData,RX_LEN);
				__HAL_UART_ENABLE_IT(&huart3, UART_IT_IDLE);
			} 
		}
		if(waittime==0)res=1; 
	}
	return res;
} 

建立TCP连接程序

void BC28_ConTCP(void)
{
    printf("AT+NSOCL=1\r\n");//¹Ø±ÕsocektÁ¬½Ó
    wait_for_bc28(300);
    Clear_Buffer();
    printf("AT+NSOCR=STREAM,6,56000,1\r\n");//´´½¨Ò»¸öSocket
    wait_for_bc28(300);
    strx=strstr((const char*)Usart3Type.RX_pData,(const char*)"OK");//·µ»ØOK
	while(strx==NULL)
	{
		wait_for_bc28(300);
		strx=strstr((const char*)Usart3Type.RX_pData,(const char*)"OK");//·µ»ØOK
	}
    BC28_Status.Socketnum=Usart3Type.RX_pData[2];//»ñÈ¡socketºÅÂë
    Clear_Buffer();	
    printf("AT+NSOCO=%c,103.46.128.41,22091\r\n",BC28_Status.Socketnum);
    wait_for_bc28(300);
    strx=strstr((const char*)Usart3Type.RX_pData,(const char*)"OK");//·µ»ØOK
	while(strx==NULL)
	{
		wait_for_bc28(300);
		strx=strstr((const char*)Usart3Type.RX_pData,(const char*)"OK");//·µ»ØOK
	}
    Clear_Buffer();	
	BC28_TCPSenddata(1,"ID:123456789\r\n");
}

 

 


一沙一世界,一花一天堂。君掌盛无边,刹那成永恒。