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机按键中断、充电判断都需要看电路板引线才分析出来,已经在代码中实现了~