根据AN5444应用笔记介绍,IIS3DWB是一款高性能MEMS三轴振动传感器,具有超宽带宽低噪声等特点,SPI标准接口输出。具体的介绍可参考AN5444应用笔记。本次先对该传感器有个初步的数据读取测试,关于滤波等后面学习时再添加。+ G. B5 c+ ?+ R! p( t r
原理图关于该部分的说明,如图1所示:% h) @# J9 {; q% [9 c1 Q7 u/ \6 r( `
8 b5 f: @0 H2 ^# ~
图1: ]; k% [, {; b, S6 G6 Z7 r
2 y8 n6 u1 I* v) D) {2 u( t 先使用CubeMx建立工程,时钟等正常配置即可,因为要使用SPI通讯,所以引脚配置如图2:' R4 Y. g4 V4 d% m: f3 |
2 p( j# g( d9 \; H
( G y U8 y' q+ G4 V+ b- P5 v c3 I/ G
图2
9 i. x+ E! |7 I8 c( I4 T: Y SPI外设参数的基本配置如图3:7 P0 s0 Y* Z$ ?9 u0 C
) G& L% j. b* @7 W
0 ^# F/ u, I, z0 T8 ?. v( l0 r图3
: f7 u+ q0 x* P4 D- m+ K 然后生成项目。在官方提供的文件中有IIS3DWB的驱动,4个文件,如图4所示: \! \6 d) i1 _) B+ @" L- `
9 V0 S4 w$ ]& V U! u8 t# m# [% B' u1 F% ^' Q* s
图4' m" \( O' e. b+ u0 b2 O
例程是参考官方github中提供的参考例程,修改了一下,增加了温度读取。初始化如下:7 e% x* A/ P3 G6 c$ o
- dev_ctx.write_reg = platform_write;
3 C6 H# x/ y, F, C9 n8 k$ \ - dev_ctx.read_reg = platform_read;- \2 |, Q) B! v5 z8 _2 s
- dev_ctx.handle = &hspi3;
8 m# z1 `( M' ~' ?4 p - 4 X; O& q0 |% x! b5 u
- HAL_Delay (10);
* }0 _! Q& {& k) y - iis3dwb_device_id_get(&dev_ctx, &whoamI);( q! q* @: ~6 D* C
- // 复位设备3 _6 R, p) k6 ~# ~5 D4 ]' O9 `
- iis3dwb_reset_set(&dev_ctx, PROPERTY_ENABLE);
H/ P2 f) r5 }* V - // 配置加速度计
1 Q7 @# g" }7 ~7 x4 E/ G - iis3dwb_block_data_update_set(&dev_ctx, PROPERTY_ENABLE);
0 ^$ e5 l8 c" Q8 {( A - iis3dwb_xl_data_rate_set(&dev_ctx, IIS3DWB_XL_ODR_26k7Hz);
b6 n! g3 m' J% H: z: R - iis3dwb_xl_full_scale_set(&dev_ctx, IIS3DWB_2g);
复制代码 / r0 l/ {% j8 w$ y4 h4 Y4 ~
1 l- |4 Z9 s. u9 ?" B; F6 A% R 对于加速度值和温度的读取程序如下:$ Q5 g H# F. V
- // 读取加速度数据
( r0 ^. K8 K% Q# s& n3 b, k -
, w* }4 v2 z. h: E0 v, W, j - iis3dwb_xl_flag_data_ready_get(&dev_ctx, &drdy);//读取状态值
9 Q( M9 w; |2 `0 n6 p" C$ o - if (drdy) {
" t+ r5 \% _1 t7 V, \7 L - 9 n- m, c& `1 u- }0 c- Z
- iis3dwb_acceleration_raw_get(&dev_ctx, data_raw);
+ ^9 D* E, Y( B Z, v - ! ~; I/ i y) T' y9 s1 N/ F, \2 W7 y
- acceleration_mg[0] = iis3dwb_from_fs2g_to_mg(data_raw[0]);
, W; w" H& \( j - acceleration_mg[1] = iis3dwb_from_fs2g_to_mg(data_raw[1]);; w: W4 g2 y) ^
- acceleration_mg[2] = iis3dwb_from_fs2g_to_mg(data_raw[2]);
" ]4 `! C: E9 ]! p% j b8 I - }: q/ W) v! Y( L" h- j9 o( c1 j8 z' ~
- iis3dwb_read_reg (&dev_ctx ,IIS3DWB_OUT_TEMP_L ,temp_data ,2);! Z7 I' d5 c% E$ k# ~; y
- temp_raw = (int16_t )((temp_data [1]<<8) | temp_data[0]);$ y5 O; k; z6 u
- temp_cel = temp_raw /256+25;3 z' ~( ^, j& N# m$ H
- % x7 U5 f M& V6 y6 s" o
- HAL_Delay(1000); // 每秒读取一次数据
复制代码 ( c$ X' M$ G) R+ N& A% K
* n; k% u/ ~- n! [ 测试结果如图5所示:
( Q- v# `7 e( S+ ]4 Q) t3 s! T
% X6 K- y+ f7 v6 }! N
& i! A: }5 J" H j1 [/ e
图5
8 C& R1 h. G" c) T9 R0 fDevice ID和温度值是正确的,滤波,FIFO等功能的增加一边理解一边添加测试。/ e& Y5 ^. I: o6 D& H4 _3 K$ o5 l
! Z: d5 T- g3 i" Y( G+ S
: B3 t$ f- Z8 z {( m |
感谢博主指导,我已经调试完成,发现是在使用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
0 \5 Y3 ?% y) ]6 [
[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];/ l" x5 N0 e* }& ?
// tx_buffer[0] = reg;) l) t2 M8 S- O( j. F. n8 f1 j1 s
// memcpy(&tx_buffer[1], bufp, len);
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);5 v9 f. A. h6 c! \- F ^
5 T7 [. t% g4 [" e) g+ Z
HAL_SPI_Transmit(handle, ®, 1, 1000);
HAL_SPI_Transmit(handle, (uint8_t*) bufp, len, 1000);; X0 ~9 T" k; \' c" ?
HAL_GPIO_WritePin(GPIOF, GPIO_PIN_5, GPIO_PIN_SET); // 选择合适的CS引脚
# r8 V% p/ e. F5 _
// return (status == HAL_OK) ? 0 : -1;
return 0;
}
```+ M7 v$ s4 K2 a0 }! }