根据AN5444应用笔记介绍,IIS3DWB是一款高性能MEMS三轴振动传感器,具有超宽带宽低噪声等特点,SPI标准接口输出。具体的介绍可参考AN5444应用笔记。本次先对该传感器有个初步的数据读取测试,关于滤波等后面学习时再添加。
( f6 x+ L1 d$ K$ T0 H: E0 C 原理图关于该部分的说明,如图1所示:; {/ Y E c/ U( V
! @4 C3 w4 _5 t5 f$ K; L
图1$ V7 d9 T& l+ h' |6 W+ x1 A: ]
) h( d/ v8 X7 D6 T
先使用CubeMx建立工程,时钟等正常配置即可,因为要使用SPI通讯,所以引脚配置如图2:! @. B* }; q) I6 y+ h
( L) a! t D' C: C! Y& P
) B( ]- k5 D: J( F% P% H
0 j, F% n) y% }图2
0 x; A) `( x( F: Q: H' N SPI外设参数的基本配置如图3:
. A8 o: _" E$ W0 X9 p; ^0 s
' l2 l3 @5 x- E8 f: t2 ^) U. D1 r& ?" H% r8 {
图3# k" q4 N3 L9 l6 O: O+ A
然后生成项目。在官方提供的文件中有IIS3DWB的驱动,4个文件,如图4所示:0 F0 |* n( R3 U" m5 b0 d
4 N% I+ s+ _, O9 Y8 O( G0 f, _' {6 J% I% c! j3 m. Q+ I7 k
图4$ t* T+ `' B8 J: u
例程是参考官方github中提供的参考例程,修改了一下,增加了温度读取。初始化如下:6 o( F5 V+ R) O1 o3 I! z4 m
- dev_ctx.write_reg = platform_write;" v1 ~1 H5 Y, C
- dev_ctx.read_reg = platform_read;
1 Z% Y% C9 S6 A' p0 p - dev_ctx.handle = &hspi3;
7 p7 f; h0 L* n: m# j2 R* C6 p - $ U$ {2 q7 u+ W1 d
- HAL_Delay (10);7 y6 l8 c5 S2 d5 J. t( x
- iis3dwb_device_id_get(&dev_ctx, &whoamI);# N6 e a( ^. f( n9 S
- // 复位设备1 Y; T9 F2 f6 g" s; O* E5 W
- iis3dwb_reset_set(&dev_ctx, PROPERTY_ENABLE);
6 P$ k# T- G, n- V: y! v6 W - // 配置加速度计 a! x Q# `! Z$ v/ ]. z, W
- iis3dwb_block_data_update_set(&dev_ctx, PROPERTY_ENABLE);
6 w, D+ `& v) K: A, ?7 I7 I |$ ^ - iis3dwb_xl_data_rate_set(&dev_ctx, IIS3DWB_XL_ODR_26k7Hz);% {- d0 g4 g B& E/ l# K5 @# o3 m @
- iis3dwb_xl_full_scale_set(&dev_ctx, IIS3DWB_2g);
复制代码
' s' v$ |( q) e+ `1 F. z4 y( t W/ q4 H+ P8 ~3 N0 r# `
对于加速度值和温度的读取程序如下:
# v, E6 o5 w- W- // 读取加速度数据1 s' B8 e0 ?2 |( h( [, Z
-
9 ~) [4 i1 a& i( d3 y - iis3dwb_xl_flag_data_ready_get(&dev_ctx, &drdy);//读取状态值 j% }9 c9 Y2 ^7 w7 \8 p$ J( d
- if (drdy) {
6 n$ l! M- t- D7 Z. [ - - Z8 C, b8 [9 ^) K+ _: _/ F
- iis3dwb_acceleration_raw_get(&dev_ctx, data_raw);
: c, y- y& u1 R1 `0 A - & j) e& l' A$ U( L/ Q2 l
- acceleration_mg[0] = iis3dwb_from_fs2g_to_mg(data_raw[0]);
9 t6 Q$ `, D% X9 F# T - acceleration_mg[1] = iis3dwb_from_fs2g_to_mg(data_raw[1]);6 v f5 w) N. n
- acceleration_mg[2] = iis3dwb_from_fs2g_to_mg(data_raw[2]);+ \# R3 P; J$ a- \- \' a( G
- }
5 c$ ?4 f$ M- R' A - iis3dwb_read_reg (&dev_ctx ,IIS3DWB_OUT_TEMP_L ,temp_data ,2);
" f% L& v, @* j4 N0 x( e7 e - temp_raw = (int16_t )((temp_data [1]<<8) | temp_data[0]);
' \6 E, L9 A' K9 T6 M - temp_cel = temp_raw /256+25;
P1 a1 C- ]/ K+ L - . c- a- ?# r: h( F+ x
- HAL_Delay(1000); // 每秒读取一次数据
复制代码
' P$ Q9 A$ J2 G' t& [. b# j# c* e
4 @! Y2 l9 j) V: Z4 m5 ~ B 测试结果如图5所示:8 M4 p, ]) e& x3 C# v1 a
2 K5 J7 P9 V0 I: d* Q9 q3 z
" o+ c( j3 m8 ?图5
, K# ?$ s' ?' U1 \Device ID和温度值是正确的,滤波,FIFO等功能的增加一边理解一边添加测试。4 z% Y$ c5 w- y1 a
( e0 k" O3 s* n* h/ ]1 E0 ?7 V# a+ @! f& f9 A4 t, g
|
感谢博主指导,我已经调试完成,发现是在使用spi3时只在spi.h文件中声明了spi3,并没有在main.h中声明,在声明之后后获取了数据,再次感谢博主的答疑,辛苦您了(鞠躬)
感谢分享
这个板子肯定可以吧,性能满强的
确实,大佬
感谢分享,学习
你好博主,麻烦问一下您配置这个振动传感器的时候是怎么配置的呢,我看官方的应用笔记上面说明片选在拉低的时候才能用spi,但我配置之后仍然无法读到数据(可以的话能麻烦您分享一下源码我学习一下吗,谢谢您😄 )
[md]不知道是否调通了,我是参考的官方的例程,cubemx配置好SPI后,将传感器的.c 和.h文件移植过来,在main函数中初始化即可。源代码我得找找,有什么问题可以随时留言交流。
[md]我在cubeMX中直接配置了IIS3DWB的驱动文件,然后在官方的例程中进行了修改,但是貌似读取不到设备的ID,麻烦您看一下我这里的配置是有什么问题吗,谢谢您
;
static void platform_delay(uint32_t ms);
//static void platform_init(void);
/ Main Example --------------------------------------------------------------/
void iis3dwb_read_data_polling(void)
{
stmdev_ctx_t dev_ctx;
/ Initialize mems driver interface /
dev_ctx.write_reg = platform_write;
dev_ctx.read_reg = platform_read;
dev_ctx.handle = &hspi3;
/ Init test platform /
// platform_init();
/ Wait sensor boot time /
platform_delay(BOOT_TIME);
/ Check device ID /
iis3dwb_device_id_get(&dev_ctx, &whoamI);
uint8_t ctrl_reg;
iis3dwb_read_reg(&dev_ctx, IIS3DWB_CTRL1_XL, &ctrl_reg, 1);
printf("CTRL1_XL: 0x%02X\n", ctrl_reg);
// if (whoamI != IIS3DWB_ID)
// while (1);
/ Restore default configuration /
iis3dwb_reset_set(&dev_ctx, PROPERTY_ENABLE);
// do {
// iis3dwb_reset_get(&dev_ctx, &rst);
// } while (rst);
/ Enable Block Data Update /
iis3dwb_block_data_update_set(&dev_ctx, PROPERTY_ENABLE);
/ Set Output Data Rate /
iis3dwb_xl_data_rate_set(&dev_ctx, IIS3DWB_XL_ODR_26k7Hz);
/ Set full scale /
iis3dwb_xl_full_scale_set(&dev_ctx, IIS3DWB_2g);
/* Configure filtering chain(No aux interface)
*/
iis3dwb_xl_filt_path_on_out_set(&dev_ctx, IIS3DWB_LP_ODR_DIV_100);
/ Read samples in polling mode (no int) /
while (1) {
uint8_t reg;
/ Read output only if new xl value is available /
iis3dwb_xl_flag_data_ready_get(&dev_ctx, ®);
if (reg) {
/ Read acceleration field data / // memset(data_raw_acceleration, 0x00, 3 * sizeof(int16_t));
iis3dwb_acceleration_raw_get(&dev_ctx, data_raw_acceleration);
acceleration_mg[0] =
acceleration_mg[1] =
acceleration_mg[2] =
}
HAL_Delay(100); // iis3dwb_temp_flag_data_ready_get(&dev_ctx, ®);
//
// if (reg) {
// / Read temperature data /
// memset(&data_raw_temperature, 0x00, sizeof(int16_t));
// iis3dwb_temperature_raw_get(&dev_ctx, &data_raw_temperature);
// temperature_degC = iis3dwb_from_lsb_to_celsius(data_raw_temperature);
// sprintf((char *)tx_buffer,
// "Temperature [degC]:%6.2f\r\n", temperature_degC);
//// tx_com(tx_buffer, strlen((char const *)tx_buffer));
// }
}
}
/*
*/
static int32_t platform_write(void handle, uint8_t reg, const uint8_t bufp,
{
//#ifdef STEVAL_MKI109V3
//
// if (handle == &hspi2) {
HAL_GPIO_WritePin(CS_up_GPIO_Port, CS_up_Pin, GPIO_PIN_RESET);
HAL_SPI_Transmit(handle, ®, 1, 1000);
HAL_SPI_Transmit(handle, (uint8_t*) bufp, len, 1000);
HAL_GPIO_WritePin(CS_up_GPIO_Port, CS_up_Pin, GPIO_PIN_SET); // }
//
//#elif defined(SPC584B_DIS)
// / Add here the SPC5 write SPI interface /
//#endif
return 0;
}
/*
*/
static int32_t platform_read(void handle, uint8_t reg, uint8_t bufp,
{
//#ifdef STEVAL_MKI109V3
//
// if (handle == &hspi2) {
/ Read command /
reg |= 0x80;
HAL_GPIO_WritePin(CS_up_GPIO_Port, CS_up_Pin, GPIO_PIN_RESET);
HAL_SPI_Transmit(handle, ®, 1, 1000);
HAL_SPI_Receive(handle, bufp, len, 1000);
HAL_GPIO_WritePin(CS_up_GPIO_Port, CS_up_Pin, GPIO_PIN_SET); // }
//#elif defined(SPC584B_DIS)
// / Add here the SPC5 read SPI interface /
//#endif
return 0;
}
那想问一下您在platform_write以及platform_read这个函数中的CS_up_GPIO_Port,以及CS_up_Pin是GPIOF pin5还是GPIOE pin14呢?我在csdn上看到一个博主这里是GPIOE pin14
[md]CS我用的PF5,% G, I, w# o1 ~& w; _, L
```7 l: G2 U( D, L( j. E! V/ s
static int32_t platform_write(void *handle, uint8_t reg, const uint8_t *bufp, uint16_t len)
{
// uint8_t tx_buffer[1 + len];8 x( V) @$ p3 X* c! o
// tx_buffer[0] = reg;
// memcpy(&tx_buffer[1], bufp, len);3 E2 Q d$ ` o9 w @
HAL_GPIO_WritePin(GPIOF, GPIO_PIN_5, GPIO_PIN_RESET); // 选择合适的CS引脚# E) T J$ X& `' o; z$ R; Z
// HAL_StatusTypeDef status = HAL_SPI_Transmit(handle, tx_buffer, len + 1, HAL_MAX_DELAY);) Z8 g0 G* K0 B
4 h5 W5 d# j4 Y
HAL_SPI_Transmit(handle, ®, 1, 1000);3 g# b! K5 i7 j! A# E9 o
HAL_SPI_Transmit(handle, (uint8_t*) bufp, len, 1000);
HAL_GPIO_WritePin(GPIOF, GPIO_PIN_5, GPIO_PIN_SET); // 选择合适的CS引脚5 z* j! `/ Q5 X" G% E
( z" _+ V5 e3 E: P9 R& Z
// return (status == HAL_OK) ? 0 : -1;
return 0;) S0 Z2 Y: x) z5 J9 k# `/ |, }
}$ |! b) A& @& @ G9 O
```