根据AN5444应用笔记介绍,IIS3DWB是一款高性能MEMS三轴振动传感器,具有超宽带宽低噪声等特点,SPI标准接口输出。具体的介绍可参考AN5444应用笔记。本次先对该传感器有个初步的数据读取测试,关于滤波等后面学习时再添加。1 I6 O- b# E; C' M' y
原理图关于该部分的说明,如图1所示:
+ L" v) A2 Z3 I
2 F% u8 V* R$ D2 Y& o
图1) y- @* J3 ?3 t
% y' t; j8 t1 c k7 ~
先使用CubeMx建立工程,时钟等正常配置即可,因为要使用SPI通讯,所以引脚配置如图2:
0 p2 |( L8 v6 u& n
' K3 t" G/ a ?# m, e" _6 W
9 G" A3 {! n% S7 x% o# ^. }8 J6 @9 z7 M4 J
图2
, w( s; B5 u2 D- Y SPI外设参数的基本配置如图3:
5 R1 A8 V" g. Q% w# s( ~
9 _# ^% E0 R N2 y+ o% Q* X( w( g) X! L" U) Z9 O0 r. y6 Q& a& j
图3
. d3 I$ o( ?) [! H6 g# t7 M 然后生成项目。在官方提供的文件中有IIS3DWB的驱动,4个文件,如图4所示:& F4 ^; [, `7 q6 h* c
8 }1 K% U& s- {% b" U
+ ^2 U2 @/ y9 c0 X9 h, [& R4 M图4+ { u: a% V! u
例程是参考官方github中提供的参考例程,修改了一下,增加了温度读取。初始化如下:0 d5 x' z8 }) C! a
- dev_ctx.write_reg = platform_write;' k1 J7 J3 s$ Z$ I# }
- dev_ctx.read_reg = platform_read;
1 y, m e- w4 M - dev_ctx.handle = &hspi3;
* h; X$ s, E5 S - 3 h: Q' ^3 |$ I6 C- n; u
- HAL_Delay (10);; A/ p0 ^( I0 D" m4 n8 K
- iis3dwb_device_id_get(&dev_ctx, &whoamI);( y3 t5 Z; t( Z
- // 复位设备+ c- E; b& e+ o7 v9 v" L3 c
- iis3dwb_reset_set(&dev_ctx, PROPERTY_ENABLE);
+ V- x1 l* c. N2 N1 V - // 配置加速度计
0 k/ x$ V+ G9 z& x - iis3dwb_block_data_update_set(&dev_ctx, PROPERTY_ENABLE);
+ z' ~7 U M! G( D } - iis3dwb_xl_data_rate_set(&dev_ctx, IIS3DWB_XL_ODR_26k7Hz);
! U1 b) V, f* u& O - iis3dwb_xl_full_scale_set(&dev_ctx, IIS3DWB_2g);
复制代码 . _( m9 a% w$ c" @0 f8 [, d" }5 ]
$ M# o- C5 P: f" C! R; I 对于加速度值和温度的读取程序如下:
% K2 E! J: u, b- // 读取加速度数据; Z4 e- Z1 _6 a" H+ }
-
' u: k9 I+ P! o+ q7 h! F - iis3dwb_xl_flag_data_ready_get(&dev_ctx, &drdy);//读取状态值
% {) d5 o D! [5 Y7 z7 S - if (drdy) {
5 v) b% l4 _/ [0 a' ? - % T' y1 Y& w( f
- iis3dwb_acceleration_raw_get(&dev_ctx, data_raw);
0 B: [! l- \5 _0 ]7 Z -
) n( o L- c% a6 t5 K: a: g8 N - acceleration_mg[0] = iis3dwb_from_fs2g_to_mg(data_raw[0]);
6 S; c0 f5 W% Z - acceleration_mg[1] = iis3dwb_from_fs2g_to_mg(data_raw[1]);
0 l5 U$ U0 y' c4 K! O9 v; G# Y - acceleration_mg[2] = iis3dwb_from_fs2g_to_mg(data_raw[2]);( v& U. @) e# [7 }. X2 { u$ e
- }
- y! j" c2 u$ Y' _( c. j/ y# H' Y - iis3dwb_read_reg (&dev_ctx ,IIS3DWB_OUT_TEMP_L ,temp_data ,2);
( T% z6 x* U' o - temp_raw = (int16_t )((temp_data [1]<<8) | temp_data[0]);
% z s# r0 C, {4 b" {+ x, s+ y - temp_cel = temp_raw /256+25;
1 z" S- G/ a! o. ] - ( J9 Z3 `0 ?( [9 I; @
- HAL_Delay(1000); // 每秒读取一次数据
复制代码
7 Q8 V8 I: a6 _8 r4 M) n a( y
复制代码 5 F4 h8 i @* s
, D8 S9 g: t4 m! k' ^' r5 y3 @7 R 测试结果如图5所示:
2 K8 w5 \ c0 H6 ]& z
( K3 \$ c! E+ G9 i4 B9 k
0 m- w0 y5 e7 W: R" @: B* z图5
1 k d5 e. N9 ]$ |Device ID和温度值是正确的,滤波,FIFO等功能的增加一边理解一边添加测试。
" t6 R# c) F T+ ~, m, N% C$ T' V6 I" o2 ~
) w, r2 l. t( `* c
|
感谢博主指导,我已经调试完成,发现是在使用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,2 a" ~* U& r1 d
& c+ t) G q1 f1 C
```7 R4 f ~* o' B( }+ \
static int32_t platform_write(void *handle, uint8_t reg, const uint8_t *bufp, uint16_t len)
{8 O' i: @4 [7 n" t! D
// uint8_t tx_buffer[1 + len];3 x% a8 {; P: @
// tx_buffer[0] = reg;( k( P4 D; `. j7 b. S
// memcpy(&tx_buffer[1], bufp, len);( n, r. B9 \" D7 m2 O4 [* T
HAL_GPIO_WritePin(GPIOF, GPIO_PIN_5, GPIO_PIN_RESET); // 选择合适的CS引脚
// HAL_StatusTypeDef status = HAL_SPI_Transmit(handle, tx_buffer, len + 1, HAL_MAX_DELAY);& ^9 ]9 \3 _6 G: |" x$ t
HAL_SPI_Transmit(handle, ®, 1, 1000);4 c9 R) s! a1 W
HAL_SPI_Transmit(handle, (uint8_t*) bufp, len, 1000);; ]6 T6 b- K' a' V4 a3 V- t9 y
HAL_GPIO_WritePin(GPIOF, GPIO_PIN_5, GPIO_PIN_SET); // 选择合适的CS引脚
, L' [# S! D- q$ ?$ Y
// return (status == HAL_OK) ? 0 : -1;7 n, E/ \3 X4 i# j/ G8 G3 G9 j
return 0;
}7 D9 \* ?, v2 }9 T9 K$ s
```: c# L- P$ z2 B6 ~+ W0 S8 F* M0 W