TC35661藍牙芯片要正常使用的話,必須先要進行一系列配置,GD32F芯片通過串口和該藍牙芯片相連,首先需要通過串口將配置命令一條一條的寫進去。這些命令就是所謂的 HCI Command。
如果不寫程序,單純就可以通過串口助手發送這些命令即可完成初始化,
大致分爲幾個階段 : HCI命令 –> MNG配置 –> SPP 配置
主要是配置MAC地址、設備類型、配對密鑰、鏈路密鑰、射頻參數等。
這些都涉及到具體的藍牙協議了,本文就不詳細描述了。
下面會放上具體的代碼地址。本文主要探討和C51單片機交互的部分,即初始化完成之後如何通過串口和51單片機交互,也即如何完成數據透傳。
GD32F芯片,和藍牙交互的部分利用了USART3,和單片機交互的利用了USART1,還是直接放上相關部分代碼:
#define TX_STR_SIZE 128
volatile uint8_t Uart1_pos=0;
char rx_char[TX_STR_SIZE] = {0x0};
uint8_t count = 0;
uint8_t uart1_is_rx_buffer_empty(void)
{
return !(Uart1_RcvCnt - Uart1_pos);
}
uint8_t uart1_read(void)
{
uint8_t c;
c = Uart1_Buff[Uart1_pos++];
if(Uart1_RcvCnt == Uart1_pos){
Uart1_RcvCnt = Uart1_pos = 0;
}
return c;
}
/** 處理單片機發來的消息,然後通過藍牙發送出去 **/
/** 單片機 --> 手機 ,主要通過該函數進行透傳 **/
void msg_process(void)
{
while(!uart1_is_rx_buffer_empty()&& count < TX_STR_SIZE)
rx_char[count++] = uart1_read();
if(count >= TX_STR_SIZE)
{
count = 0;
return;
}
if(count > 0 && rx_char[count-1] == ':') //判定分隔符
{
rx_char[count-1] = 0x0 ;//讀到分隔符後,將':'修改爲'\0',字符串結束標誌
C_bt_send(rx_char); //將字符串通過藍牙發送出去
count = 0 ;
}
}
/** GD32主函數 **/
int main ( void )
{
SystemInit();
if(SysTick_Config(72000*1)) //配置TICK中斷頻率
while(1);
IO_Init();//IO初始化
NVIC_Configuration();//中斷級聯初始化
Uart1Init ( 115200 ); //串口1初始化
Uart3Init ( 115200 ); //串口3初始化
if(!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_6)) //讀取GPIOA6電平,判斷是否進入充電模式
LED1_Blink_Start(1000); //如果有充電,則LED1閃爍
else
{
SYS_POWER_ON; //未進入充電模式,開啓三極管,打開系統電源
LED1_ON; //LED1常亮
}
BT_POWER_OFF;
C_bt_init(); //藍牙初始化
BT_POWER_ON; //打開藍牙電源
printf("\nInitial OK !\n");
while(1)
{
if((ms_timer % 1) == 0)
{
C_bt_step(); //藍牙模塊交互
msg_process(); //USART1消息處理
}
}
}
手機 –> 單片機方向 主要通過下面代碼實現透傳,代碼在pan1026.cpp中,藍牙協議處理部分代碼:
case(0x48): //收到SPP數據
{
uint16_t spplength = ((uint16_t)parser_buffer[6]<<8) | parser_buffer[5];
if(spplength)
{
uint16_t datalength = ((uint16_t)parser_buffer[8]<<8) | parser_buffer[7];
//將有效數據部分轉發到USART1
this->RawSendStaticBinary(&parser_buffer[9],datalength);
}
}
break;
基本上透傳就這麼點東西,很簡單。主要是藍牙協議相關的比較複雜。另外該POS機按鍵中斷、充電判斷都需要看電路板引線才分析出來,已經在代碼中實現了~