一:IIS3DWB数据手册
IIS3DWB是一款集成系统,内置一款具备3轴数字振动传感器的产品,该传感器在超宽且平坦的频率范围内具有低噪声特性。其宽频带、低噪声、非常稳定且可重复的灵敏度,以及能够在较广温度范围内运行(最高可达+105%C)的能力,使得该设备特别适用于工业应用中的振动监测。
该器件能够以较低的功耗实现高性能,同时具备数字输出以及诸如FIFO和中断等嵌入式数字功能,这些特性使其成为适用于电池供 电的工业无线传感器节点的理想之选
IIS3DWB具备可选择的满量程加速度范围,分别为+2/+4/+8/+16g,并能够测量高达6kHz的加速度,输出数据速率为26.7kHz。该设备内嵌有3kB的先进先出(FIFO)缓冲区,旨在避免数据丢失并限制主机处理器的干预。二:原理图如下所示:

IIS3DWB芯片上的 IN1 和 IN2 是两个可配置的中断输出引脚。它们主要用于向主控MCU(微控制器)发送实时状态信号,无需主控通过SPI总线不断查询芯片状态,从而提高系统效率。
IN1 可编程中断引脚 1 数据就绪、FIFO达到设定阈值、唤醒、活动/非活动检测等
IN2 可编程中断引脚 2 功能与IN1相同,可实现中断源的物理分离,例如将数据就绪中断分配给IN1,将FIFO满中断分配给IN2关键功能解析
数据就绪 (Data Ready):这是最常用的功能之一。每当传感器产生一个新的测量数据时,IN1或IN2引脚会产生一个脉冲信号(即 drdy-pulsed 模式)或电平变化,通知MCU来读取数据。
FIFO阈值/满标志:芯片内部集成了一个3kB的FIFO(先进先出)缓冲区。当FIFO中存储的数据数量达到预设的阈值时,对应的中断引脚会被触发,提示MCU可以一次性读取一批数据,从而进一步减少MCU的唤醒和干预次数。
事件检测:可用于实现基于运动或特定加速度事件的低功耗唤醒。例如,当检测到超过设定阈值的振动(唤醒事件)或设备静止(非活动事件)时,引脚状态改变,将系统从休眠模式中唤醒。
使用中的注意事项
默认状态:芯片上电复位后,IN1默认被配置为数据就绪 (Data Ready) 信号输出引脚,而IN2则默认无功能。
灵活配置:你可以通过SPI接口修改芯片内部的寄存器,来自由定义每个引脚具体响应哪种中断事件,并可以配置其输出的有效电平(高电平或低电平)和模式(脉冲或锁存)三:STM32cube MX软件配置
3.1 stmcube MX软件添加驱动文件

3.2 配置SPI3的片选引脚

SPI 配置注意事项:
通讯模式:IIS3DWB 支持SPI 模式 0 和模式 3(即 CPOL=0, CPHA=0 或 CPOL=1, CPHA=1)。
数据格式:SPI 通讯中,数据以8位或16位的格式进行传输。通常,发送命令和读取数据会组合成16位的帧来完成。
全双工:芯片支持标准的全双工SPI,可以在发送命令的同时读取数据
IIS3DWB 在 SPI 通讯时,最高时钟频率为 10 MHz
四:软件代码
IIS3DWB的读取流程主要分为三个步骤:初始化配置、轮询数据就绪状态和读取加速度数据。
步骤1:初始化与通信校验
在读取数据之前,必须正确初始化传感器并验证通信是否正常。
1.1 等待启动完成
上电后,芯片需要进行约 10 ms 的启动过程来加载修调参数。在此期间不要访问传感器。
1.2 SPI接口配置
根据数据手册,IIS3DWB的SPI参数如
SPI模式 模式0 或 模式3
时钟极性(CPOL) 模式0: 0(空闲低电平);模式3: 1(空闲高电平)
时钟相位(CPHA) 模式0: 0(第一个边沿采样);模式3: 1(第二个边沿采样)
数据位顺序 高位优先(MSB First)
通讯速度 最高10 MHz
帧格式 Motorola模式
1.3 校验通信
通过读取 WHO_AM_I 寄存器(地址 0x0F)来验证通信是否正常,该寄存器应返回固定值 0x73
步骤2:寄存器配置
传感器上电后默认处于 Power-Down 模式,需要配置后才能开始采集数据。主要配置寄存器
步骤3:读取加速度数据3.1 检查数据就绪状态
在读取数据之前,需要检查 STATUS 寄存器(地址 0x27)的 DRDY(Data Ready)位。
注意:可以通过硬件中断引脚(IN1/IN2)来检测数据就绪,这可以避免轮询占用CPU资源。
3.2 读取加速度数据
当检测到数据就绪后,连续读取 6 个字节的数据寄存器:
3.3 数据转换
将原始值转换为物理加速度值(单位:g)
加速度(g) = 原始值 × 灵敏度
使用建议:
如果需要实现 22 kHz 以上的高采样率(如振动监测应用),可以参考以下优化措施:
减少SPI事务开销:将多次单字节读取合并为一次连续读取(如上述读6字节的方式)
快速CS控制:使用 digitalWriteFast() 或直接操作寄存器(位带操作)来控制片选引脚
避免重复的beginTransaction/endTransaction:如果SPI配置不变,可在初始化时设置一次
考虑使用DMA:对于大量数据传输,DMA可以显著提高效率
使用硬件中断:通过IN1/IN2引脚检测数据就绪,代替轮询STATUS寄存器
4.1 STM32cube 生成的驱动文件

只需要修改有关SPI3的配置项就可以。
读写函数如下所示:
// CS控制宏
#define CS_LOW() GPIO_ResetBits(GPIOB, GPIO_Pin_12)
#define CS_HIGH() GPIO_SetBits(GPIOB, GPIO_Pin_12)
// SPI单字节收发
uint8_t SPI_Transfer(uint8_t data) {
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);
SPI_I2S_SendData(SPI2, data);
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);
return SPI_I2S_ReceiveData(SPI2);
}
// 读寄存器
uint8_t ReadRegister(uint8_t reg) {
uint8_t result;
CS_LOW();
SPI_Transfer(reg | 0x80); // 读命令:地址bit0=1
result = SPI_Transfer(0x00);
CS_HIGH();
return result;
}
// 写寄存器
void WriteRegister(uint8_t reg, uint8_t value) {
CS_LOW();
SPI_Transfer(reg & 0x7F); // 写命令:地址bit0=0
SPI_Transfer(value);
CS_HIGH();
}
// 连续读取多个字节
void ReadRegisters(uint8_t reg, uint8_t* buffer, uint16_t len) {
CS_LOW();
SPI_Transfer(reg | 0x80);
for (uint16_t i = 0; i < len; i++) {
buffer[i] = SPI_Transfer(0x00);
}
CS_HIGH();
}完整读取代码如下所示:
void IIS3DWB_Init(void) {
SPI_Init(); // 初始化SPI
Delay_ms(10); // 等待传感器启动
// 校验通信
if (ReadRegister(0x0F) != 0x73) {
// 错误处理
return;
}
// 配置传感器
WriteRegister(0x10, 0xE0); // ODR=26.67kHz, ±16g
WriteRegister(0x12, 0x40); // 块数据更新使能
WriteRegister(0x13, 0x01); // 4线SPI模式
}
void IIS3DWB_ReadAccel(float* ax, float* ay, float* az) {
uint8_t data[6];
// 等待数据就绪
while (!(ReadRegister(0x27) & 0x01));
// 读取6字节数据
ReadRegisters(0x28, data, 6);
// 转换为物理值
int16_t x_raw = (int16_t)((data[1] << 8) | data[0]);
int16_t y_raw = (int16_t)((data[3] << 8) | data[2]);
int16_t z_raw = (int16_t)((data[5] << 8) | data[4]);
*ax = x_raw * 0.000488f; // ±16g量程
*ay = y_raw * 0.000488f;
*az = z_raw * 0.000488f;
}五:实物如下所示:

避坑经验如下:
读命令格式:寄存器地址的bit0必须置1,即 reg | 0x80
CS控制:必须用软件手动控制CS引脚,在传输前拉低,传输完成后拉高
连续读取优化:加速度数据推荐用 ReadRegisters 一次读取6字节,避免多次SPI事务开销
数据格式:原始数据为小端格式(低字节在前,高字节在后)
数据就绪检查:读取前务必检查STATUS寄存器的DRDY位(bit0)或使用硬件中断引脚
我要赚赏金
