1. 项目概述
在嵌入式系统开发中,惯性导航模块(IMU)是获取物体姿态、加速度等关键数据的重要传感器。JY901P是一款高性价比的六轴惯导模块,通过串口与主控设备通信。本文将详细介绍如何在Xilinx Spartan6 FPGA平台上实现固定波特率的UART通信,完成对JY901P模块的数据读取和指令写入。
这个方案的特点是采用固定波特率设计(115200bps),无法动态修改波特率。这意味着如果模块被恢复出厂设置(默认波特率9600bps),除非初始设置就是9600bps,否则将无法继续通信。但其他所有写命令(如加速度校准、磁场校准等)都可以正常执行。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. JY901P通信协议解析
2.1 数据帧格式
JY901P采用自定义二进制协议,数据帧分为读取帧和写入帧两种格式。
2.1.1 读取数据帧
模块主动输出的数据帧都以0x55开头,后跟数据类型标识符。默认输出以下四种数据:
- 加速度数据帧:0x55 0x51...
- 角速度数据帧:0x55 0x52...
- 角度数据帧:0x55 0x53...
- 磁场数据帧:0x55 0x54...
每种数据帧包含10字节:
- 帧头:0x55(1字节)
- 数据类型:0x51~0x54(1字节)
- 数据内容:6字节(3轴×2字节)
- 校验和:1字节(前面所有字节的和校验)
2.1.2 写入指令帧
主机向模块发送的指令帧格式如下:
- 帧头:0xFF 0xAA(2字节)
- 寄存器地址:1字节
- 数据:2字节(高字节在前)
- 无校验和
常用指令包括:
- 加速度校准(地址0x01)
- 磁场校准(地址0x03)
- 波特率设置(地址0x06)
- 数据输出频率设置(地址0x07)
- 恢复出厂设置(地址0x12)
- 保存参数(地址0x00)
2.2 数据解析要点
- 所有传感器数据均为16位有符号整数
- 加速度单位:g(重力加速度)
- 角速度单位:°/s
- 角度单位:°
- 磁场强度单位:μT
- 校验和计算:简单累加和,只取低8位
3. FPGA硬件设计
3.1 整体架构
系统采用模块化设计,主要包含以下功能模块:
-
顶层模块:JY901P_Uart_top
- 负责例化所有子模块
- 提供外部接口
-
UART收发模块:
- uart_send:并行转串行发送
- uart_receive:串行转并行接收
-
协议处理模块:
- JY901P_top:协调读写操作
- JY901P_reader:数据帧解析
- JY901P_writer:指令帧生成
3.2 关键模块实现
3.2.1 UART收发模块
UART配置为115200bps,8位数据位,无校验位,1位停止位。
发送模块核心逻辑:
verilog复制always @(posedge clk or negedge sys_rst_n) begin
if (!sys_rst_n) begin
tx <= 1'b1; // 空闲状态为高电平
end else if (tx_en) begin
case (bit_cnt)
4'd0: tx <= 1'b0;
