一、项目介绍
气压数据在气象监测、环境感知、工业控制、消费电子等多个领域具有重要应用价值。纳芯微作为国内领先的传感器与信号链芯片企业,其推出的 NSPAD1N200DR04 绝压传感器具备高精度、高可靠性、小体积等优势,而 NSSinePad-NS800RT5039 开发板则为该传感器的快速评估与应用开发提供了便捷的硬件平台。本项目旨在搭建基于上述硬件组合的气压数据采集系统,实现对 NSPAD1N200DR04 传感器的驱动、数据读取与解析,为后续相关应用场景的二次开发提供基础原型。
二、项目目标
- 完成 NSSinePad-NS800RT5039 开发板与 NSPAD1N200DR04 绝压传感器的硬件连接与配置;
- 开发传感器驱动程序,实现 I2C 通信协议的适配,完成传感器初始化、数据采集命令发送;
- 对采集到的原始数据进行解析换算,得到实际气压值;
- 实现气压数据的串口打印输出,支持实时查看与调试;
- 使用十二指神探读取逻辑电平进行分析
三、项目框图

四、项目硬件
- NSSinePad-NS800RT5039 开发板 1 块;
- NSPAD1N200DR04 绝压传感器模块 1 个(含引脚座);
- 杜邦线 4 根(VCC、GND、SDA、SCL);
- USB-Type-C 数据线 1 根(用于开发板供电与串口通信);
- 电脑 1 台(用于程序编写、下载与调试)。
- 十二指神探一个
五、硬件介绍
- 带屏12指神探:12指神探是一款基于树莓派基金会推出的微控制器RP2040制作的多功能硬件调试助手,它有12根引脚,提供了5V和3.3V的电压,其中有9根GPIO,功能灵活,通过搭配不同程序可以做成各种调试器。带屏版的12指神探,它是在原板12指神探基础上,配备了一块240*240分辨率的LCD彩屏以及两个可程控按键和一个拨轮,丰富了人机交互功能,方便信息观察、界面切换等使用方式。此外还配备了白色外壳,精心设计的包装不仅使板卡日常使用时更加美观也便于板卡的站立以及使用安全。
- 纳芯微 NSPAD1N200DR04:NSPAD1N200DR04 是纳芯微车规级绝压传感器,量程 10-400kPa(可定制),-20℃-115℃下精度优于 ±1% F.S.,支持 I2C/SPI/ 模拟输出,3mm×3mm×1.54mm DFN-8 封装,低功耗(2.6mA)、抗过载(600kPa),采用 MIS 基板防分层,四孔进气防异物,适配汽车电子、工业控制等场景。
- NS800RT5039 :是纳芯微推出的NSSinePad 系列评估开发板,专为传感器(如 NSPAD1N200DR04)及信号链芯片快速评估设计。基于 Cortex M7内核,集成 I2C、UART、SPI 等通信接口,支持 3.3V 供电,板载调试接口,可直接对接传感器完成驱动开发、数据采集与验证。板载资源精简实用,布线优化,兼具稳定性与易用性,是纳芯微传感器产品二次开发的高效硬件平台,适配工业控制、汽车电子等场景的原型验证。



六、项目软件
- 集成开发环境(IDE):Keil MDK-ARM V5.38 及以上;
- KiCAD 8.0 版本(用于原理图绘制);
- 串口调试工具;
七、原理图和PCB设计
本NSPAD1N200DR04气压传感器扩展板以兼容性、灵活性与精度保障为核心设计思路,采用KiCAD 8.0绘制、立创EDA获取核心元器件封装,引脚定义完全兼容“带屏12指神探”传感器扩展板及NS800RT5039开发板,支持双向插装(左插座插入元器件正面朝上、右插座插入正面朝下),无需改动原有电路即可快速对接;延续模块化与灵活复用理念,传感器电路独立分区,预留排针排母接口供单独接线使用,同时设计预设断点支持掰离单独部署,兼顾批量扩展与单点使用场景;为保障气压测量精度,参考传感器设计指南在芯片周边采用环形开槽工艺,隔绝周边器件干扰,且I2C通信引脚配置上拉电阻、电源端添加滤波电容优化信号稳定性;布局遵循“信号短路径、电源分区域”原则,采用可润湿侧翼封装兼容AOI检测,在提升易用性的同时兼顾可制造性,降低生产故障率。

该PCB设计围绕NSPAD1N200DR04传感器核心功能展开,以**信号完整性、兼容性与可制造性**为核心思路。布局上,将传感器U1置于中心,周边紧凑排布电容C1、电阻R3(模拟输出滤波)及R1、R2(I2C上拉),缩短信号路径以减少干扰;接口H1、H3、H4分别对应模拟输出、I2C通信与电源,位置布局兼顾插拔便利性与布线合理性。布线采用单面板设计,优先保障电源与通信走线的通畅性,同时通过清晰的颜色区分(红/蓝线)明确电源与信号路径。此外,延续“灵活复用”设计理念,预留标准接口与合理的器件间距,既支持与NS800RT5039开发板、“12指神探”扩展板的兼容对接,也便于单独拆用,在满足功能需求的前提下,兼顾了生产焊接的便捷性与后期维护的可操作性。

八、关键代码
项目基于Keil进行开发
IIC读写寄存器的代码I2C写寄存器时序遵循 “起始信号→地址传输→寄存器地址→数据→停止信号” 的连续流程。通过I2C_sendStart发送起始信号(SCL 高电平时 SDA 拉低),触发从机监听;随后传输从机地址与写方向位(bit0=0),从机匹配后反馈 ACK;接着按regAddrSize传输目标寄存器地址,待从机 ACK 确认后,逐字节发送数据(每字节后需从机 ACK 响应);最后通过I2C_sendStop发送停止信号(SCL 高电平时 SDA 拉高),释放总线,完成写操作。
I2C 读寄存器时序需先指定寄存器地址再切换读方向,流程为 “起始→写地址→寄存器地址→重复起始→读地址→数据→停止”。前半段与写操作一致,发送起始信号、从机写地址及寄存器地址并确认 ACK;之后通过I2C_sendReStart发送重复起始信号(不释放总线),切换传输从机地址与读方向位(bit0=1),从机 ACK 后开始数据接收;主机接收前 n-1 字节时发送 ACK 促从机继续传输,最后 1 字节发送 NACK 终止,最终以停止信号结束,完成读操作
I2C_Status I2C_mem_write(I2C_TypeDef *i2c, uint8_t devAddr, uint32_t regAddr,
I2C_SubAddressSize regAddrSize, uint8_t *data, uint32_t dataSize) {
I2C_Status status;
status = I2C_sendStart(i2c, devAddr, I2C_DIRECTION_WRITE);
if (status != I2C_STATUS_SUCCESS) {
return status;
}
status = I2C_sendSubAddrMaster(i2c, regAddr, regAddrSize);
if (status != I2C_STATUS_SUCCESS) {
I2C_sendStop(i2c); // ?????????
return status;
}
status = I2C_sendDataMaster(i2c, data, dataSize);
if (status != I2C_STATUS_SUCCESS) {
I2C_sendStop(i2c);
return status;
}
return I2C_sendStop(i2c);
}
I2C_Status I2C_mem_read(I2C_TypeDef *i2c, uint8_t devAddr, uint32_t regAddr,
I2C_SubAddressSize regAddrSize, uint8_t *data, uint32_t dataSize) {
I2C_Status status;
status = I2C_sendStart(i2c, devAddr, I2C_DIRECTION_WRITE);
if (status != I2C_STATUS_SUCCESS) {
return status;
}
status = I2C_sendSubAddrMaster(i2c, regAddr, regAddrSize);
if (status != I2C_STATUS_SUCCESS) {
I2C_sendStop(i2c);
return status;
}
status = I2C_sendReStart(i2c, devAddr, I2C_DIRECTION_READ);
if (status != I2C_STATUS_SUCCESS) {
I2C_sendStop(i2c);
return status;
}
status = I2C_receiveDataMaster(i2c, data, dataSize);
if (status != I2C_STATUS_SUCCESS) {
I2C_sendStop(i2c);
return status;
}
return I2C_sendStop(i2c);
}
NSPAD1N200DR04 代码
先通过I2C_mem_write向传感器(I2C 地址 0xFE)的 0x30 控制 / 状态寄存器写入 0x0A 采样命令,若写操作失败则打印 “write is file”(推测为 “fail” 笔误)并返回;随后通过 do-while 循环读取 0x30 寄存器状态,直至数据 [0] 等于 0x02(采样就绪状态码)才退出等待;接着调用I2C_mem_read读取 0x06 起始地址的 3 字节气压原始数据,读失败则打印 “read is file”(笔误)并返回;最后将 3 字节数据按高位在前拼接为 24 位无符号长整型 PCode,通过公式(float)PCode/8388607 * 231.25 - 8.125换算为实际气压值,再通过串口打印输出。

void NSPAD1N200DR04_Read_Pressure(I2C_TypeDef *i2c)
{
I2C_Status status;
unsigned char data[3];
data[0]=0x0A;
status=I2C_mem_write(i2c,0xFE,0x30,I2C_SUBADDRSIZE_1BYTE,data,1);
if (status != I2C_STATUS_SUCCESS) {
printf("write is file\r\n ");
return;
}
do{status=I2C_mem_read(i2c,0xFE,0x30,I2C_SUBADDRSIZE_1BYTE,data,1);}
while(data[0]!=0x02);
status=I2C_mem_read(i2c,0xFE,0x06,I2C_SUBADDRSIZE_1BYTE,data,3);
if (status != I2C_STATUS_SUCCESS) {
printf("read is file\r\n ");
return;
}
float Pressure;
unsigned long PCode ;
PCode = data[0]<<16 | data[1]<<8 | data[2];
Pressure = (float)PCode/8388607 * 231.25 - 8.125;
printf("Pressure is %f\r\n",Pressure);
}
九、实物连接方式
NS800RT5039 开发板 | NSPAD1N200DR04 传感器 |
|---|---|
GPIO A01 | SCL |
GPIO A02 | SDA |
3.3V | VCC |
GND | GND |
十、实物照片连接方式
十一、完成结果
1、基础任务完成结果(打印不同的气压值)
正常的气压值(海拔1500左右)

向传感器进行吹气(气压升高)

2、十二指神探采集和解释波形
阶段一开始波形
这个为开始波形 首先SDA(数据线,通常对应图中红色或浅色线)在 SCL(时钟线,通常对应图中绿色或深色时钟线)高电平时,由高电平跳转为低电平,标志着一次 I2C 通信的开始 然后发送我们要写的设备地址7F 然后为写标志1 收到应答后发送我们要写的寄存器为0x30要写的值为0x0A
这个为数据手册中的

第二阶段 读取0x30中的数据是否为0x02表示准备完成
首先将寄存器地址写为0x30 然后发送读的命令 这次我们读到的是0x0A 代表数据没有准备完成然后重复上面的步骤

这里读到0x02 准备进入下一个阶段

以上的两个阶段对应数据手册中寄存器的描写(这里备注的意思就是上方的意思)

第三阶段 读取 0x06 0x07 0x08 寄存器的值并且进行计算

这一部分在数据手册中的描写

总结IIC通信的数据手册中的说明波形和实际波形对比
1、对地址的描写 为高位在前低位在后


写字节时 先发送开始信号当 SDA(数据线,通常对应图中红色或浅色线)在 SCL(时钟线,通常对应图中绿色或深色时钟线)高电平时,由高电平跳转为发送七个1和一个0 然后从机回复相应 发送寄存器地址从机回复相应 再发送要写的值

实际的波形完全相同

读数据先发起始信号,再发从设备地址 + 写控制位(第 8 位为 0),从设备 ACK 应答;接着发寄存器地址,从设备 ACK;随后发要写入的寄存器数据,从设备 ACK;最后发停止信号结束操作。
数据手册


十二、遇到的难题和解决方法
刚开始使用逻辑分析仪采集 I2C 波形时,遇到明显问题:波形呈现毛刺较多、边沿模糊的状态,SDA 与 SCL 的电平跳变不锐利,甚至出现数据位错位、高低电平过渡区拉长的情况。同时,协议解码功能完全失效,频繁出现地址误判、ACK/NACK 信号丢失、数据字段乱码等问题,无法识别出完整的 I2C 通信帧。排查硬件连接、触发条件等环节后均未解决,最终发现核心原因是采样分辨率设置不当 —— 原采样率远低于 I2C 信号频率需求,未满足 “采样率≥5 倍信号频率” 的基本原则,导致采样点稀疏,无法精准捕获 SDA/SCL 的瞬时边沿变化和关键电平状态。调整采样分辨率至符合要求后,波形完整性显著提升,协议解析也恢复正常。
十三、心得体会
本次实践让我深入掌握了 NSPAD1N200DR04 的 I2C 配置与气压测试流程。初期因采样率设置过低,逻辑分析仪波形解析混乱,调整至 1MHz 后恢复正常,深刻体会到采样率与信号频率匹配的重要性。电路设计中,上拉电阻选型和接地处理直接影响信号完整性,多次调试后解决了波形毛刺问题。通过对比规格书波形与实际数据,进一步理解了 I2C 协议时序细节。整个过程既锻炼了硬件设计能力,也提升了协议调试技巧,让我明白理论与实践结合的关键,为后续传感器应用积累了宝贵经验。
