根据AN5444应用笔记介绍,IIS3DWB是一款高性能MEMS三轴振动传感器,具有超宽带宽低噪声等特点,SPI标准接口输出。具体的介绍可参考AN5444应用笔记。本次先对该传感器有个初步的数据读取测试,关于滤波等后面学习时再添加。
: s; T7 G1 E3 t, s4 N( b& L 原理图关于该部分的说明,如图1所示:
% |, I( u, `0 v8 k4 R8 b7 K4 d& S
* { m5 i% ]3 l4 s+ {6 `+ {
图1
$ E% U0 m i4 u } P+ ~" s, s* A: R( B( z7 X* s
先使用CubeMx建立工程,时钟等正常配置即可,因为要使用SPI通讯,所以引脚配置如图2: y+ G8 I: _- C) r+ G6 ~
& H' g5 d3 h) d- o. s( d
- {1 {* K! W! f* X9 K0 ?( J/ j
$ \7 x m) d2 X) L q# v @图2
% o8 Y' M% ]0 P* E5 R' ^ SPI外设参数的基本配置如图3:. b% P! Q0 I/ s- K
% v" D7 [9 E; M8 D" R5 [
7 `7 n, r A$ {" w% H图3
# P$ `5 P+ [9 `% H( c 然后生成项目。在官方提供的文件中有IIS3DWB的驱动,4个文件,如图4所示:9 i- T2 I, Q. \! {
9 n5 t' P; u3 q3 ^, q! U
. q& }2 w- ~" H6 U8 a图4
9 e( D; a' O) |5 P! h 例程是参考官方github中提供的参考例程,修改了一下,增加了温度读取。初始化如下:/ t6 u' W' t2 R$ q$ W5 f
- dev_ctx.write_reg = platform_write;+ S/ ~- R# c* D* I" u5 T
- dev_ctx.read_reg = platform_read;/ F8 H, V% t0 Q) c/ h! L
- dev_ctx.handle = &hspi3;5 G4 n/ o( T O" P' T' Z
- 7 [. c5 }+ V3 Z# [! e
- HAL_Delay (10);
" Z7 C6 ]; k+ ]6 k4 r: N - iis3dwb_device_id_get(&dev_ctx, &whoamI);* k3 z1 P: A7 |
- // 复位设备
( p2 j' V# L; V' m8 ` - iis3dwb_reset_set(&dev_ctx, PROPERTY_ENABLE);6 P) ~4 J& @$ V. N4 L, g* ]1 D
- // 配置加速度计% q: D4 `+ |8 k7 K6 T' _
- iis3dwb_block_data_update_set(&dev_ctx, PROPERTY_ENABLE);
& b1 E, Z! C9 X! q# M+ i+ V' P - iis3dwb_xl_data_rate_set(&dev_ctx, IIS3DWB_XL_ODR_26k7Hz);: L9 u. K7 |% v# P+ y1 T
- iis3dwb_xl_full_scale_set(&dev_ctx, IIS3DWB_2g);
复制代码 3 r) O% c& D& `* N! V9 Y' i9 N$ ?8 z
8 V% y( B- C7 r3 E 对于加速度值和温度的读取程序如下:
+ q5 I& v+ ^- {7 T5 B- // 读取加速度数据. W4 K1 n/ v" v" ~, e: d
- : P% H4 u3 V: H# x6 `1 {
- iis3dwb_xl_flag_data_ready_get(&dev_ctx, &drdy);//读取状态值
% `+ ^: O" `$ u2 d8 J# c0 g. J - if (drdy) {
- \' b* K9 L% N& [! a# p - % c' R/ y5 r" G' h% Z
- iis3dwb_acceleration_raw_get(&dev_ctx, data_raw);
5 m0 p* k2 ?& H- G$ A+ `0 m: r0 I - * F) J! x F1 h1 x
- acceleration_mg[0] = iis3dwb_from_fs2g_to_mg(data_raw[0]);
$ ^; c+ O1 k4 I" B, O4 Q2 e - acceleration_mg[1] = iis3dwb_from_fs2g_to_mg(data_raw[1]);
4 Z7 o3 a, O8 Q+ [" B: J - acceleration_mg[2] = iis3dwb_from_fs2g_to_mg(data_raw[2]);
, N9 C8 `0 l5 G5 n0 Q6 s) Y - }7 k o' M, r- L+ j. W5 |7 S9 J& w
- iis3dwb_read_reg (&dev_ctx ,IIS3DWB_OUT_TEMP_L ,temp_data ,2);
$ S D3 P4 P! o/ U6 f5 j - temp_raw = (int16_t )((temp_data [1]<<8) | temp_data[0]);/ o$ i" d& _+ e1 T( S
- temp_cel = temp_raw /256+25;' F. v- V! f8 @# V) W
1 L4 F1 o( h0 ]0 a( a- HAL_Delay(1000); // 每秒读取一次数据
复制代码 0 h9 W+ ]% i( I. ]" K- E7 o
0 _! u' l: v% }: C
测试结果如图5所示:5 g& g% e$ B* M/ a8 ^
]' ^# J [: p, v1 X& L0 Q
+ O; @" D* n/ y& |8 U v图53 c; u) R3 F, V6 z d
Device ID和温度值是正确的,滤波,FIFO等功能的增加一边理解一边添加测试。5 d! a5 M& Z" m
+ q& u: F) n' v7 m0 l* Z. h" J
. E" f4 \4 |5 W" `! n$ } |
感谢博主指导,我已经调试完成,发现是在使用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
f* W3 u2 M" \& [( r( W
[md]CS我用的PF5,
```3 O/ V& K" s3 f& g" q" s
static int32_t platform_write(void *handle, uint8_t reg, const uint8_t *bufp, uint16_t len)
{
// uint8_t tx_buffer[1 + len];3 p: M4 _1 p: {( l
// tx_buffer[0] = reg;
// memcpy(&tx_buffer[1], bufp, len);
% |; {+ I0 z) j# o
HAL_GPIO_WritePin(GPIOF, GPIO_PIN_5, GPIO_PIN_RESET); // 选择合适的CS引脚! V7 W& Q* q1 Q: I; J
// HAL_StatusTypeDef status = HAL_SPI_Transmit(handle, tx_buffer, len + 1, HAL_MAX_DELAY);' J! y+ L0 L% T( ] _
HAL_SPI_Transmit(handle, ®, 1, 1000);
HAL_SPI_Transmit(handle, (uint8_t*) bufp, len, 1000);
HAL_GPIO_WritePin(GPIOF, GPIO_PIN_5, GPIO_PIN_SET); // 选择合适的CS引脚# W* f. g" ~% V+ [8 n* O
# u/ P7 B1 A4 C% }: `% b& i
// return (status == HAL_OK) ? 0 : -1;
return 0;
}* R5 J$ |' W4 q. ?5 W8 S6 t, z
```- `( k6 T+ y& D4 g