这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » 【STEVAL-STWINKT1B】:结合STMcubeMX读取IIS3DWB数

共1条 1/1 1 跳转至

【STEVAL-STWINKT1B】:结合STMcubeMX读取IIS3DWB数据

高工
2026-04-12 07:53:43     打赏

一:IIS3DWB数据手册

    IIS3DWB是一款集成系统,内置一款具备3轴数字振动传感器的产品,该传感器在超宽且平坦的频率范围内具有低噪声特性。其宽频带、低噪声、非常稳定且可重复的灵敏度,以及能够在较广温度范围内运行(最高可达+105%C)的能力,使得该设备特别适用于工业应用中的振动监测。

    该器件能够以较低的功耗实现高性能,同时具备数字输出以及诸如FIFO和中断等嵌入式数字功能,这些特性使其成为适用于电池供    电的工业无线传感器节点的理想之选

    IIS3DWB具备可选择的满量程加速度范围,分别为+2/+4/+8/+16g,并能够测量高达6kHz的加速度,输出数据速率为26.7kHz。该设备内嵌有3kB的先进先出(FIFO)缓冲区,旨在避免数据丢失并限制主机处理器的干预。

二:原理图如下所示:


08 IIS3DWB 原理图.png

    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软件添加驱动文件

08-2 cube 添加驱动文件.png

3.2 配置SPI3的片选引脚

08-3 配置CS引脚.png

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 生成的驱动文件

08-4 生成的C文件png.png

只需要修改有关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;
}

五:实物如下所示:

08-5 数据截图.png

避坑经验如下:

  读命令格式:寄存器地址的bit0必须置1,即 reg | 0x80

  CS控制:必须用软件手动控制CS引脚,在传输前拉低,传输完成后拉高

  连续读取优化:加速度数据推荐用 ReadRegisters 一次读取6字节,避免多次SPI事务开销

  数据格式:原始数据为小端格式(低字节在前,高字节在后)

  数据就绪检查:读取前务必检查STATUS寄存器的DRDY位(bit0)或使用硬件中断引脚




关键词: STEVAL-STWINKT1B     IIS3DWB    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]