|
在本篇帖子中,我们将使用NUCLEO-G070开发板通过SPI方式读取IIM-42352传感器的数据。该传感器是一个三轴加速度计,可输出X、Y和Z三个方向的加速度值,非常适用于工业应用,可以轻松、稳定和准确地进行惯性和振动测量。
在本文中,我们将学习如何设置和使用IIM42352传感器,以及使用STM32CubeMX工具进行配置,TDK官方驱动程序的使用方法等。
所需的组件 ● NUCLEO-G070开发板 ● YBX-IIM42352传感器模块 ● 连接跳线 ● STM32CubeMX工具 ● 友善串口调试助手
YBX-IIM42352传感器模块简介 YBX-IIM42352模块采用TDK公司的最新一代高性能三轴MEMS加速度传感器IIM-42352。该传感器包括多种特性,例如宽而平坦的频率响应范围、低噪声和高达32kHz的输出数据速率,因此非常适用于工业应用,可以轻松、稳定和准确地进行惯性和振动测量。
IIM-42352传感器输出X、Y和Z轴加速度计,具有±2g、±4g、±8g和±16g可编程满量程范围。传感器具有低噪声 (70μg/√Hz) 和低功耗(0.3mA),并采用小型2.5 × 3 × 0.91毫米(14-LGA)封装。该模块支持SPI和I2C接口进行系统集成,可以快速实现与Arduino和STM32等控制器直接相连。该模块板载一颗电源芯片,支持3.3-5V供电。
硬件连接 YBX-IIM42352传感器模块连接到NUCLEO-G070RB的SPI1接口,对应的引脚分别是PA5(SCK)、PA6(MISO)和PA7(MOSI),片选引脚CS连接到PB2。模块的VCC连接到+5V引脚,GND引脚连接到NUCLEO-G070RB的任意GND引脚。
STM32CubeMX工具配置 STM32CubeMX工具是ST提供的一个免费的软件配置工具,它提供了一些工程模板,可以快速创建基于MCU、开发板以及示例程序的工程。使用该工具,我们可以快速新建一个基于NUCLEO-G070开发板的工程。
首先打开STM32CubeMX工具,点击ACCESS TO BOARD SELECTOR,在弹出的界面中找到NUCLEO-G070RB开发板,然后点击右上角的Start Project。
在Pinout布局中,已经初始化好RCC、Debug、UART2、LED等外设。 我们使用SPI1外设连接传感器模块,设置SPI1的模式为Full Duplex Master,将A5、PA6和PA7分别设为SPI1_SCK、SPI1_MISO和SPI1_MOSI。然后将PB2定义为CS输出。然后根据手册中的SPI时序图,设置SPI通讯的参数。 注意,SPI的时钟频率不能超过12MHz。
最后,生成基于Keil MDK的工程文件。
驱动文件 TDK提供了IIM-42352的驱动文件和示例代码,该文件可以在GitHub下载,下载地址:https://github.com/InvenSenseInc/public.mcu.iim42352/tree/master
代码 打开工程文件,将下载的驱动文件添加工程文件中。本文的代码基于示例程序example-raw-data。移植完成后,需要自定义编写两个SPI函数:inv_io_hal_read_reg和inv_io_hal_write_reg。以下是代码: - //low-levevl IO access function
- int inv_io_hal_read_reg(struct inv_iim423xx_serif * serif, uint8_t reg, uint8_t * rbuffer, uint32_t rlen)
- {
- switch (serif->serif_type) {
- case IIM423XX_AUX1_SPI3:
- case IIM423XX_AUX1_SPI4:
- case IIM423XX_AUX2_SPI3:
- case IIM423XX_UI_SPI4:
- return iim423xx_spi_read(reg, rbuffer, rlen, 0);
- // return inv_spi_master_read_register(INV_SPI_AP, reg, rlen, rbuffer);
- // case IIM423XX_UI_I2C:
- // while(inv_i2c_master_read_register(ICM_I2C_ADDR, reg, rlen, rbuffer)) {
- // inv_delay_us(32000); // Loop in case of I2C timeout
- // }
- // return 0;
- default:
- return -1;
- }
- }
- //low-levevl IO access function
- int inv_io_hal_write_reg(struct inv_iim423xx_serif * serif, uint8_t reg, const uint8_t * wbuffer, uint32_t wlen)
- {
- int rc;
- switch (serif->serif_type) {
- case IIM423XX_AUX1_SPI3:
- case IIM423XX_AUX1_SPI4:
- case IIM423XX_AUX2_SPI3:
- case IIM423XX_UI_SPI4:
- return iim423xx_spi_write(reg, wbuffer, wlen, 0);
- // for(uint32_t i=0; i<wlen; i++) {
- // rc = inv_spi_master_write_register(INV_SPI_AP, reg+i, 1, &wbuffer[i]);
- // if(rc)
- // return rc;
- // }
- // return 0;
- // case IIM423XX_UI_I2C:
- // while(inv_i2c_master_write_register(ICM_I2C_ADDR, reg, wlen, wbuffer)) {
- // inv_delay_us(32000); // Loop in case of I2C timeout
- // }
- // return 0;
- default:
- return -1;
- }
- }
复制代码
输出结果 将代码上传至开发板,打开串口工具,设置波特率115200,在串口中应该能显示数据:
|