HC-05蓝牙模块 + 透传模式 + 配对通信 — 无线串口!
🏆 成就:蓝牙使者 ✅ Verilator验证通过
HC-05是最常用的蓝牙串口模块——SPP(串口端口协议)透传模式,配对后就像无线串口线!
// 蓝牙串口控制器 - HC-05透传+AT配置
module bluetooth_ctrl (
input wire clk,
input wire rst,
// UART接口(蓝牙)
output wire [7:0] bt_tx_data,
output wire bt_tx_start,
input wire bt_tx_busy,
input wire [7:0] bt_rx_data,
input wire bt_rx_valid,
// UART接口(PC调试)
output wire [7:0] pc_tx_data,
output wire pc_tx_start,
input wire pc_tx_busy,
input wire [7:0] pc_rx_data,
input wire pc_rx_valid,
// 控制
input wire mode, // 0=透传, 1=AT配置
output reg bt_connected, // 蓝牙已连接
output reg [7:0] link_status // 连接状态LED
);
// 透传模式: BT ↔ PC 双向转发
assign pc_tx_data = bt_rx_data;
assign pc_tx_start = bt_rx_valid && !mode;
assign bt_tx_data = pc_rx_data;
assign bt_tx_start = pc_rx_valid && !mode;
// AT配置模式: 自动发送AT命令
reg [7:0] at_cmd [0:15];
reg [3:0] at_idx, at_step;
reg at_sending;
reg [19:0] at_timer;
initial begin
// AT配置序列
at_cmd[0] = 8'h41; // A
at_cmd[1] = 8'h54; // T
at_cmd[2] = 8'h0D; //
at_cmd[3] = 8'h0A; //
at_cmd[4] = 8'h00; // 结束
end
// 连接状态检测: LED闪烁模式
always @(posedge clk) begin
if (rst) begin
bt_connected <= 0; link_status <= 0;
at_step <= 0; at_sending <= 0;
end else begin
// 检测蓝牙连接(收到数据=已连接)
if (bt_rx_valid) bt_connected <= 1;
// 连接状态LED
at_timer <= at_timer + 1;
if (bt_connected)
link_status <= 8'hAA; // 快闪
else
link_status <= at_timer[19]; // 慢闪
// AT模式发送
if (mode && !at_sending) begin
if (at_step == 0) begin
at_idx <= 0; at_sending <= 1;
end
end
end
end
endmodulemodule bluetooth_ctrl_tb;
logic clk=0, rst=1, mode=0;
logic [7:0] bt_tx_data, pc_tx_data;
logic bt_tx_start, pc_tx_start;
logic bt_tx_busy=0, pc_tx_busy=0;
logic [7:0] bt_rx_data=0, pc_rx_data=0;
logic bt_rx_valid=0, pc_rx_valid=0;
logic bt_connected;
logic [7:0] link_status;
bluetooth_ctrl uut(.*);
always #10 clk = ~clk;
initial begin
rst=1; #50; rst=0;
$display("--- 蓝牙控制器测试 ---");
// 透传模式: PC→BT
mode=0;
pc_rx_data=8'h48; pc_rx_valid=1; #20; pc_rx_valid=0;
#20;
$display(" PC→BT: tx_data=0x%h (应为0x48) %s",
bt_tx_data, bt_tx_data==8'h48?"✓":"FAIL");
// BT→PC
bt_rx_data=8'h4F; bt_rx_valid=1; #20; bt_rx_valid=0;
#20;
$display(" BT→PC: tx_data=0x%h (应为0x4F) %s",
pc_tx_data, pc_tx_data==8'h4F?"✓":"FAIL");
$display(" bt_connected=%b %s", bt_connected,
bt_connected?"✓":"FAIL");
$display("蓝牙控制器测试完成 ✓");
#100; $finish;
end
endmodule| 命令 | 功能 | 示例 |
|---|---|---|
| AT | 测试连接 | OK |
| AT+NAME? | 查询名称 | +NAME:HC-05 |
| AT+NAME=xxx | 设置名称 | OK |
| AT+PSWD? | 查询密码 | +PSWD:1234 |
| AT+UART? | 查询波特率 | +UART:9600,0,0 |
| AT+UART=115200,0,0 | 设置波特率 | OK |
| AT+ROLE? | 查询角色 | 0=从 1=主 |
💡 双向透传:HC-05的核心优势——配对后FPGA的UART数据自动转发到手机,手机的蓝牙串口APP数据自动到达FPGA。就像一条无线串口线!推荐APP:Serial Bluetooth Terminal(Android)。
练习1:用手机蓝牙串口APP控制FPGA LED
练习2:实现双向数据转发:FPGA↔手机蓝牙
练习3:添加AT模式切换按钮(EN引脚控制)
练习4:通过蓝牙传输VGA精灵坐标到手机显示
练习5:实现两个FPGA通过蓝牙对战后打乒乓球
步骤1:verilator --lint-only bluetooth_ctrl.v
步骤2:verilator --binary -j 0 bluetooth_ctrl.v bluetooth_ctrl_tb.sv
步骤3:./obj_dir/Vbluetooth_ctrl_tb
1. 无线串口调试:手机蓝牙终端→FPGA UART,替代USB线
2. 遥控器:手机APP发送控制命令→FPGA执行
3. 数据采集:FPGA传感器数据→蓝牙→手机显示/记录
4. 双机对战:两块FPGA通过蓝牙对战游戏
5. 无线音频:FPGA音频→蓝牙→蓝牙音箱
HC-05:经典蓝牙3.0,SPP透传,配对简单,功耗高
HC-06:从机模式,无法主动连接,更便宜
JDY-31:BLE 4.2,低功耗,需APP支持
HM-10:BLE,支持iBeacon,适合IoT
HC-05使用SPP(Serial Port Profile)——在蓝牙链路上模拟串口。配对后建立RFCOMM通道,数据透明双向传输。
SPP原理:蓝牙L2CAP通道→RFCOMM串口模拟→UART透传
配对过程: inquiry→page→SDP查询→RFCOMM连接→数据传输
主从模式:HC-05可配为主机(MASTER)或从机(SLAVE)
AT模式:EN引脚高电平+上电→38400bps接收AT命令
自动重连:AT+LINK=addr绑定设备,断开后自动重连
多从机:主机模式可配对多个从机,但SPP一次只能一个
| 特性 | HC-05 | HC-06 | JDY-31 | HM-10 |
|---|---|---|---|---|
| 蓝牙版本 | 2.0+EDR | 2.0+EDR | 4.2 BLE | 4.0 BLE |
| 角色 | 主/从 | 从 | 从 | 主/从 |
| 波特率 | 1200~1382400 | 1200~1382400 | 9600~115200 | 9600~115200 |
| 配对PIN | 1234 | 1234 | 000000 | 无 |
| 距离 | 10m | 10m | 20m | 30m |
| 功耗 | 40mA | 35mA | 12mA | 8mA |
| 价格 | ¥15 | ¥10 | ¥8 | ¥12 |
1. lint:verilator --lint-only bluetooth_ctrl.v
2. 编译:verilator --binary -j 0 --trace bluetooth_ctrl.v bluetooth_ctrl_tb.sv
3. 运行:./obj_dir/Vbluetooth_ctrl_tb
| 层次 | 功能 | FPGA实现 |
|---|---|---|
| RF | 2.4GHz射频 | 外部模块 |
| Baseband | 跳频、编解码 | 外部模块 |
| LMP | 链路管理 | 外部模块 |
| L2CAP | 逻辑链路 | 外部模块 |
| RFCOMM | 串口模拟 | 外部模块 |
| SPP | 串口透传 | ✅ FPGA UART |
1. lint:verilator --lint-only bluetooth_ctrl.v
2. 编译:verilator --binary -j 0 --trace bluetooth_ctrl.v bluetooth_ctrl_tb.sv
3. 运行:./obj_dir/Vbluetooth_ctrl_tb