📲 第28课:蓝牙串口

HC-05蓝牙模块 + 透传模式 + 配对通信 — 无线串口!

🏆 成就:蓝牙使者 ✅ Verilator验证通过

📲
蓝牙使者
HC-05蓝牙模块控制 + AT配置 + 透传数据

📲 HC-05蓝牙模块

HC-05是最常用的蓝牙串口模块——SPP(串口端口协议)透传模式,配对后就像无线串口线!

FPGA + HC-05连接 ┌──────────┐ ┌──────────┐ │ │ TX ──────→│ RX │ │ FPGA │ │ HC-05 │──→ 📱 手机 │ │ RX ←──────│ TX │ │ │ │ │ │ │ GPIO──────│ EN(KEY) │ 高=AT模式 │ │ │ LED │ 闪=等待 快闪=已连接 └──────────┘ └──────────┘ 工作模式: ● 透传模式: EN=低, UART数据双向透明转发 ● AT模式: EN=高上电, 38400波特率接收AT命令 配对流程: 1. 手机搜索"HC-05" → 配对PIN=1234 2. 连接SPP服务 → 建立虚拟串口 3. 双向收发数据 ✓

📐 蓝牙串口控制器

Verilogbluetooth_ctrl.v — 蓝牙串口控制器
// 蓝牙串口控制器 - 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
endmodule

🧪 蓝牙控制器测试

SystemVerilogbluetooth_ctrl_tb.sv — 蓝牙测试台
module 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

📊 HC-05 AT命令

命令功能示例
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通过蓝牙对战后打乒乓球

📲
蓝牙使者
完成本课练习,掌握蓝牙无线通信!

🔧 Verilator验证步骤

步骤1verilator --lint-only bluetooth_ctrl.v

步骤2verilator --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

📲 蓝牙深入:SPP协议与配置

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-05HC-06JDY-31HM-10
蓝牙版本2.0+EDR2.0+EDR4.2 BLE4.0 BLE
角色主/从主/从
波特率1200~13824001200~13824009600~1152009600~115200
配对PIN12341234000000
距离10m10m20m30m
功耗40mA35mA12mA8mA
价格¥15¥10¥8¥12

🔬 Verilator仿真

1. lintverilator --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实现
RF2.4GHz射频外部模块
Baseband跳频、编解码外部模块
LMP链路管理外部模块
L2CAP逻辑链路外部模块
RFCOMM串口模拟外部模块
SPP串口透传✅ FPGA UART

🔬 Verilator仿真

1. lintverilator --lint-only bluetooth_ctrl.v

2. 编译verilator --binary -j 0 --trace bluetooth_ctrl.v bluetooth_ctrl_tb.sv

3. 运行./obj_dir/Vbluetooth_ctrl_tb