根据AN5444应用笔记介绍,IIS3DWB是一款高性能MEMS三轴振动传感器,具有超宽带宽低噪声等特点,SPI标准接口输出。具体的介绍可参考AN5444应用笔记。本次先对该传感器有个初步的数据读取测试,关于滤波等后面学习时再添加。1 [4 \7 j! P6 u6 V# s) R
原理图关于该部分的说明,如图1所示:) s* l% a8 X6 a- {
, l# S4 C$ e' J5 b- {: `6 ?- s) t, v% J图1
( I2 s3 }7 S, x' `# C" p+ u8 Q" y! f+ X `# Y- f9 D
先使用CubeMx建立工程,时钟等正常配置即可,因为要使用SPI通讯,所以引脚配置如图2:/ y* w* k% H6 M0 U# m. q
* t+ z9 m/ `; L+ z0 z+ f% G) F2 P
2 t. K- m- _+ x4 b' j
4 p( A2 B9 m+ o7 `6 U. d' p图2: ~( i" o+ A& ?/ b6 G$ y. s
SPI外设参数的基本配置如图3:
' e7 S( R' P/ P& _( m
7 t& V2 U% b6 [. q9 x
/ S$ Q) ]$ e$ ~
图38 T: o# g9 Q7 w0 b
然后生成项目。在官方提供的文件中有IIS3DWB的驱动,4个文件,如图4所示:3 f: i2 A. h* X. {+ a0 G6 I% R* k
7 j0 L# Y2 d) p; \, O
- r$ K* X' A4 i' o$ l4 ^ j图4
1 r. p6 c/ D4 u+ N& i7 ?% R7 G 例程是参考官方github中提供的参考例程,修改了一下,增加了温度读取。初始化如下:
6 s8 L! f% j- A0 W- dev_ctx.write_reg = platform_write;
, r4 s/ {. A' _! P/ f - dev_ctx.read_reg = platform_read;
: `" N6 r: \8 N D& r! `) d - dev_ctx.handle = &hspi3;) D5 W. Q' o$ Q+ {+ ^
3 S; A, w! o4 o& Z0 V0 F! i( I- HAL_Delay (10);$ c) Q8 a) V9 n: B9 A a u: E
- iis3dwb_device_id_get(&dev_ctx, &whoamI);; P" a3 E& A2 y3 T
- // 复位设备
3 ~4 A0 R( `5 ]: L! t$ g9 U) E - iis3dwb_reset_set(&dev_ctx, PROPERTY_ENABLE);
K$ d/ Y; Q0 S - // 配置加速度计5 }* F; l) H. e0 z/ L
- iis3dwb_block_data_update_set(&dev_ctx, PROPERTY_ENABLE);
6 S5 P& `& i; v Z, y5 r& ` - iis3dwb_xl_data_rate_set(&dev_ctx, IIS3DWB_XL_ODR_26k7Hz);$ K: F! w& G6 [) B: q/ S
- iis3dwb_xl_full_scale_set(&dev_ctx, IIS3DWB_2g);
复制代码
6 Z" s! M1 `, s( X9 C+ L
3 a, H" U; f1 h1 q0 Y! I, d 对于加速度值和温度的读取程序如下:
1 P! c$ N P+ `' u0 W' I9 X- // 读取加速度数据* y* M- H& ^- V$ p. G& p" G: u0 l
- 8 {5 t& j8 Z3 f! d# T( E
- iis3dwb_xl_flag_data_ready_get(&dev_ctx, &drdy);//读取状态值% H/ Q+ ?4 U" u$ N$ E2 u
- if (drdy) {5 c5 f4 u9 F! V$ W4 D& _; c8 p
-
9 T9 r5 F) d$ r; L - iis3dwb_acceleration_raw_get(&dev_ctx, data_raw);
6 y3 @, v! \9 Y - $ y( _" V6 b; c5 e% u
- acceleration_mg[0] = iis3dwb_from_fs2g_to_mg(data_raw[0]);$ _& w, m( t$ M1 e/ S
- acceleration_mg[1] = iis3dwb_from_fs2g_to_mg(data_raw[1]);
! X; u/ o" H' m7 m! v( p - acceleration_mg[2] = iis3dwb_from_fs2g_to_mg(data_raw[2]);
2 f3 u$ \2 X" H' p- P - }5 s2 j' Y$ L4 L& a4 M" w
- iis3dwb_read_reg (&dev_ctx ,IIS3DWB_OUT_TEMP_L ,temp_data ,2);
* a# K/ g; f/ w( _! X - temp_raw = (int16_t )((temp_data [1]<<8) | temp_data[0]);: p( u. q+ y. Y+ u7 u/ V4 O
- temp_cel = temp_raw /256+25;
: I; x, P; B: A6 L+ x - $ }/ k6 y0 E, ?& O8 U
- HAL_Delay(1000); // 每秒读取一次数据
复制代码
3 F* E5 V1 Y: w. Z. L9 G$ L
/ A& e+ ~; D( h2 @3 S8 } 测试结果如图5所示:4 c& f. ]$ x' K% r0 g7 [: r
- s, M# P$ x+ A" ?& m. n
$ q6 o) m) T) |5 n$ z
图5
3 ^- n5 D5 V& ~3 U$ `) HDevice ID和温度值是正确的,滤波,FIFO等功能的增加一边理解一边添加测试。
/ y# q( R% q) g# |! G5 ?) M: B
5 b) J! E# F+ y: w8 C+ F7 K" Z) M- F
|
感谢博主指导,我已经调试完成,发现是在使用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,
```
static int32_t platform_write(void *handle, uint8_t reg, const uint8_t *bufp, uint16_t len)
{
// uint8_t tx_buffer[1 + len];% s6 R. J F, l( k8 ]" L
// tx_buffer[0] = reg;
// 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);" V5 V% h8 N& ]2 `$ y6 @
7 ], P. w7 |7 ^$ y' S8 j5 r
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引脚7 h: J/ z0 g: ?1 b
// return (status == HAL_OK) ? 0 : -1;, T3 ?9 }- s2 O, D
return 0;, S0 x- a9 A" v7 D$ C3 w) _$ C+ [
}
```6 b2 y4 D# a. I. j: m7 n9 Q% h
您好,请问根据时序图来看,CPOL空闲时应该是高电平,为什么在您这里配置选择LOW。但是,在实例中只有CPOL选择低电平的时候采用数据输出,高电平没有,这与数据手册中的SPI时序图不相符,请问这是怎么回事?