买来的模块背面就长这样子,总共有六个引脚,实际只用四个脚(RXD、TXD、GND和VCC)就可以进行数据的收发,以默认的9600bps的波特率,由于目前项目对速度要求不高,因此也没有深入研究AT指令等。
关于蓝牙模块的协议其实就是一个串口协议,在蓝牙配对成功后,就相当于以无线的方式进行串口通信。关于串口协议可参考我之前的一篇博客:串口回环
做这个实验的目的就是更好地理解蓝牙即串口这个概念。实验的思路框图如下:
思路很简单,用一组传统的uart串口连接PC,HC-05连接一台手机。当通过连接PC的uart给FPGA发送数据时,把这个收到的数据发到HC-05的发送模块,通过hc05_tx输出到蓝牙模块;而当手机端发给HC-05数据时,会通过rx_hc05模块接收到数据,再把这个数据送到串口发送模块tx_uart和数码管显示模块smg_disp,同步显示在数码管上。这样,我们就将FPGA作为通道,间接实现了PC与手机端的通信。
module bluetooth(
input clk ,
input reset ,
input hc05_rx ,
input uart_rx ,
output logic hc05_tx ,
output logic uart_tx ,
output logic [ 7:0] seg_sel ,
output logic [ 6:0] seg_ment
);
logic [ 7:0] data ;
logic data_vld ;
logic [ 7:0] rx_data ;
logic rx_vld ;
/*
auto_tx auto_tx_inst
(
.clk (clk ),
.reset (reset ),
.data (data ),
.data_vld (data_vld )
);
*/
tx tx_inst_hc05
(
.clk (clk ),
.reset (reset ),
.rx_vld (data_vld ),
.rx_data (data ),
.tx (hc05_tx )
);
tx tx_inst_uart
(
.clk (clk ),
.reset (reset ),
.rx_vld (rx_vld ),
.rx_data (rx_data ),
.tx (uart_tx )
);
rx rx_inst_hc05
(
.clk (clk ),
.reset (reset ),
.rx (hc05_rx ),
.rx_data (rx_data ),
.rx_vld (rx_vld )
);
rx rx_inst_uart
(
.clk (clk ),
.reset (reset ),
.rx (uart_rx ),
.rx_data (data ),
.rx_vld (data_vld )
);
smg_disp smg_disp_inst
(
.clk (clk ),
.reset (reset ),
.rx_data (rx_data ),
.data_vld (rx_vld ),
.seg_sel (seg_sel ),
.seg_ment (seg_ment )
);
endmodule
从我顶层模块例化的模块可以看出,不管是uart还是hc05的tx和rx模块,例化的都是同一个原模块,只是输入输出变了而已,这样还是验证一句话:蓝牙即串口。
在连接hc-05模块时要特别注意RXD和TXD引脚的连接,模块上标出的TXD引脚是模块的输出脚,是FPGA的输入,因此对应hc05_rx脚,而模块的RXD是作为FPGA的输出,因此对应hc05_tx脚,注意不要接反了。
所需软件:友善串口调试助手、SPP蓝牙串口。
首先,通过串口调试助手发送66给FPGA,按照我们的设计,连上hc_05的手机端会收到66(数据都是16进制)。然后手机端通过app发送88给FPGA,这时PC上的串口调试助手会收到88这个数据,并且数码管显示88。
实验成功,所以蓝牙只是串口的另外一种形式,它遵循的还是串口协议。
附上源码,有兴趣的朋友可以下载 蓝牙串口源码