根据AN5444应用笔记介绍,IIS3DWB是一款高性能MEMS三轴振动传感器,具有超宽带宽低噪声等特点,SPI标准接口输出。具体的介绍可参考AN5444应用笔记。本次先对该传感器有个初步的数据读取测试,关于滤波等后面学习时再添加。
2 v. O* X) M/ s E7 o. l+ j 原理图关于该部分的说明,如图1所示:2 J! w$ V4 @( G) Q/ z3 H, Y
% x1 G/ V1 b a4 V3 g, {2 @ j图1
; u; |2 Q/ I/ x1 {. z2 B3 b" a0 L5 |$ o$ J, U4 J1 F0 I
先使用CubeMx建立工程,时钟等正常配置即可,因为要使用SPI通讯,所以引脚配置如图2: H# l7 }6 k y0 G( N* f
7 r; U# A7 R+ d/ M
( \) q1 p$ o k; F7 p9 z/ |, a. K+ D& j
图2( O1 Y# N8 I, A4 Y& L
SPI外设参数的基本配置如图3:
" ~/ A! V" }" x/ b# r o5 f0 c
& F! L$ H b1 {# y+ Q# P! P# R1 ?
7 d( T, g9 h( w6 T: C7 g7 `
图3* \- c3 G/ w! _/ N6 f( J8 U# x
然后生成项目。在官方提供的文件中有IIS3DWB的驱动,4个文件,如图4所示:6 `" |2 }- }9 @; Q) g1 f
" T4 _1 z' u. ?4 m
" |4 V( }" n' _- q) ]# K& t4 f) s图4
& x0 r( Z3 e$ Y- k 例程是参考官方github中提供的参考例程,修改了一下,增加了温度读取。初始化如下:
2 p+ y; @# n J& _- dev_ctx.write_reg = platform_write;0 h# F8 j( W- Z, ]8 w! q
- dev_ctx.read_reg = platform_read;
$ ]9 }1 L2 i3 j& J - dev_ctx.handle = &hspi3;
% Q$ {9 B9 E8 g
+ `. m% U3 w) n! `; E# S8 S% }+ a- HAL_Delay (10);
. s/ J! n$ ?6 K& b& T8 p- ?7 v - iis3dwb_device_id_get(&dev_ctx, &whoamI);
) }* L! U9 L( R( \) \- m( s7 J - // 复位设备% Q9 O( t |8 {3 q2 _& M* F
- iis3dwb_reset_set(&dev_ctx, PROPERTY_ENABLE);4 `4 d2 G6 M) h; q8 g- k
- // 配置加速度计
3 W& C4 f) s$ ^5 `9 I - iis3dwb_block_data_update_set(&dev_ctx, PROPERTY_ENABLE);/ |; H& u, A6 ~# O- y( @6 t
- iis3dwb_xl_data_rate_set(&dev_ctx, IIS3DWB_XL_ODR_26k7Hz);3 I9 {$ X8 p. r- X* w
- iis3dwb_xl_full_scale_set(&dev_ctx, IIS3DWB_2g);
复制代码
4 t, Z7 e9 n2 }" n% M
( h6 b) |- {5 h2 j+ R) v 对于加速度值和温度的读取程序如下:
4 v0 Q* E8 r# B# i- // 读取加速度数据
& `0 g4 a5 o. s - ; e" F7 _# P7 X
- iis3dwb_xl_flag_data_ready_get(&dev_ctx, &drdy);//读取状态值
" E4 f8 D, s; s2 P" m - if (drdy) {" g7 c6 f7 D7 T+ {0 Y9 P
- 7 n9 x! w) @3 m
- iis3dwb_acceleration_raw_get(&dev_ctx, data_raw);1 d2 E& d! [0 [0 I6 _
- ; }) u" [) z: i R; {: B) W ?+ J
- acceleration_mg[0] = iis3dwb_from_fs2g_to_mg(data_raw[0]);* }; g: d" b1 L0 Y' P. N- C
- acceleration_mg[1] = iis3dwb_from_fs2g_to_mg(data_raw[1]);
2 a* |5 j/ L/ O4 d9 r - acceleration_mg[2] = iis3dwb_from_fs2g_to_mg(data_raw[2]);6 G# Q4 R. ^+ k! h5 f" l
- }
: [; D/ Y" o" P% N' D' C; G - iis3dwb_read_reg (&dev_ctx ,IIS3DWB_OUT_TEMP_L ,temp_data ,2);, `9 u2 V8 P0 P$ J. |7 H. `
- temp_raw = (int16_t )((temp_data [1]<<8) | temp_data[0]);
- U2 ?% N. e7 [" j ?+ U$ N9 b - temp_cel = temp_raw /256+25;; p2 f( I/ A2 S% ~: N( {
- - |! F$ x) k- ~4 K- K6 [! Q
- HAL_Delay(1000); // 每秒读取一次数据
复制代码- . W9 q! y; [: E& i+ U2 h+ \
复制代码 # v4 x% X( |* ?6 O+ m8 k/ {
W( _, Z, w4 M& u. L6 p
测试结果如图5所示:
1 i- ^/ T# y% J+ a/ q
5 o4 V9 m3 K4 t5 ]$ m1 O, O- T' {" k9 H8 Q
( ?; p+ q; q8 R' n4 W$ \2 b图5
+ g1 B+ d: k- i/ X; ]; G8 h( s( tDevice ID和温度值是正确的,滤波,FIFO等功能的增加一边理解一边添加测试。
9 X J: C1 E$ |. r
: ^1 F7 ~- {3 y8 D* a1 E6 d3 s
4 I2 P1 H& F; ]3 ^: U |
感谢博主指导,我已经调试完成,发现是在使用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
" l" X9 [9 d- L( T
[md]CS我用的PF5,
```
static int32_t platform_write(void *handle, uint8_t reg, const uint8_t *bufp, uint16_t len)
{
// uint8_t tx_buffer[1 + len];! I j0 b; |3 y) d
// tx_buffer[0] = reg;
// memcpy(&tx_buffer[1], bufp, len);; t* [ l! H* W
HAL_GPIO_WritePin(GPIOF, GPIO_PIN_5, GPIO_PIN_RESET); // 选择合适的CS引脚" E1 Y( b$ Z: O) V# y
// HAL_StatusTypeDef status = HAL_SPI_Transmit(handle, tx_buffer, len + 1, HAL_MAX_DELAY);
3 q$ `4 ]' w6 U4 I& T' M8 ]! T" w
HAL_SPI_Transmit(handle, ®, 1, 1000);5 W2 ~( K5 x! `& t9 A8 h: W( J# B
HAL_SPI_Transmit(handle, (uint8_t*) bufp, len, 1000);
HAL_GPIO_WritePin(GPIOF, GPIO_PIN_5, GPIO_PIN_SET); // 选择合适的CS引脚. p. u; U0 X2 W
// return (status == HAL_OK) ? 0 : -1;6 g: s. u$ y3 W* b0 H4 D# n5 g' W
return 0;6 f) T, t7 I/ e
}
``` N+ X6 _' D4 u0 ~( J% J