根据AN5444应用笔记介绍,IIS3DWB是一款高性能MEMS三轴振动传感器,具有超宽带宽低噪声等特点,SPI标准接口输出。具体的介绍可参考AN5444应用笔记。本次先对该传感器有个初步的数据读取测试,关于滤波等后面学习时再添加。, G$ L0 k, ~+ G2 }9 q4 P
原理图关于该部分的说明,如图1所示:3 u' m9 o, x1 `
5 s; t% O: [+ _% `+ r4 o
图1. h: {5 m, q& p- w# W2 t
9 ~6 |0 d. N( Z% x
先使用CubeMx建立工程,时钟等正常配置即可,因为要使用SPI通讯,所以引脚配置如图2:( Y" ` V2 ?8 X& T. G( b
( I% q* _' u1 m
" h' ]( o5 |) |9 s" y
+ Z+ T8 A+ B3 Q, r/ G4 d* o
图2% N4 E. r6 q' u/ f* p+ r
SPI外设参数的基本配置如图3:, W; W* }! O% \, _& X6 m+ W4 y
$ _) f! Y+ B0 I0 }& f4 ~* m Y1 ^! [8 H6 x6 h- P- O4 S4 L
图3
0 Z! v- t( F- s: \) B O 然后生成项目。在官方提供的文件中有IIS3DWB的驱动,4个文件,如图4所示:
! ^8 ?1 l9 M- _$ W8 x0 K
3 G& R5 c- A5 G9 o8 `: v8 B" v% o3 Q. j
图4
$ u/ K" D& {0 O5 c( n7 { 例程是参考官方github中提供的参考例程,修改了一下,增加了温度读取。初始化如下:: D) t! b+ b. T: \9 Z1 ? u
- dev_ctx.write_reg = platform_write;2 ]5 k+ z( a/ h; p
- dev_ctx.read_reg = platform_read;5 A- t) R8 O, J
- dev_ctx.handle = &hspi3;
* x' I' R2 V, W$ u" A( z# R2 ^" R: @& K
. R( {# R6 u2 V1 N2 h, Z9 ^1 d- HAL_Delay (10);1 s8 x5 f2 w; z1 n( s
- iis3dwb_device_id_get(&dev_ctx, &whoamI);
6 E# d- h2 |; A5 ~7 k6 S# x - // 复位设备1 {4 C1 C o$ d n$ a$ k
- iis3dwb_reset_set(&dev_ctx, PROPERTY_ENABLE);; b- A! f: M: e$ v, k
- // 配置加速度计/ }9 w) h, l! O7 k5 ]
- iis3dwb_block_data_update_set(&dev_ctx, PROPERTY_ENABLE);* D# i8 m8 L3 V& H! C! r# ]: i
- iis3dwb_xl_data_rate_set(&dev_ctx, IIS3DWB_XL_ODR_26k7Hz);- s9 K) t1 p: c# k8 B
- iis3dwb_xl_full_scale_set(&dev_ctx, IIS3DWB_2g);
复制代码
( J2 u, `) K- n1 |2 f9 }* q1 r8 c; h$ B* c0 }& w: ^
对于加速度值和温度的读取程序如下:
- b4 S) L0 s/ q; \- // 读取加速度数据: {0 G( ?( z! o, E0 w. {% W/ ~
- 7 L5 W& y# N: A A2 x% }4 F& E
- iis3dwb_xl_flag_data_ready_get(&dev_ctx, &drdy);//读取状态值2 A6 d: g: a& N+ Z/ J0 ]- D
- if (drdy) {8 d& K, S5 H1 I) x2 |3 b
- ; f( [5 ], j+ W5 M4 j c I
- iis3dwb_acceleration_raw_get(&dev_ctx, data_raw);
& n- |; u" ` H1 }' ?) Z - 7 N' G. l5 C! P5 o! R" k
- acceleration_mg[0] = iis3dwb_from_fs2g_to_mg(data_raw[0]);5 V& K# N/ _, J, C2 f6 Q
- acceleration_mg[1] = iis3dwb_from_fs2g_to_mg(data_raw[1]);+ F ~& s! A9 f6 m$ `
- acceleration_mg[2] = iis3dwb_from_fs2g_to_mg(data_raw[2]);
/ c1 G" b+ z: T- P+ |& K- g9 M) M - }" x( ~3 c# O% x1 _+ E; a# r* |
- iis3dwb_read_reg (&dev_ctx ,IIS3DWB_OUT_TEMP_L ,temp_data ,2);
( {2 u' G2 A+ X2 z7 n( u+ R - temp_raw = (int16_t )((temp_data [1]<<8) | temp_data[0]);4 C# I. J! j `9 i6 R
- temp_cel = temp_raw /256+25;
5 s7 p, B" X8 }0 p f6 r9 w
& b) e Q6 q. w5 Z1 r- HAL_Delay(1000); // 每秒读取一次数据
复制代码- 2 g' b$ h6 m6 O! g/ x, h# ~
复制代码 / X3 m5 B4 a1 P; P3 B
9 d- O7 M# i; ^; O, _# `" X
测试结果如图5所示:
4 ^$ O2 V! D) k j) m
: U/ e4 l# ?" q7 i9 B" y4 F
6 O4 Z) J: u/ f4 Q2 l7 q
图5/ M( S+ q( s* z. I) p
Device ID和温度值是正确的,滤波,FIFO等功能的增加一边理解一边添加测试。
; U# n; X- x: G' G, w3 a5 y) Z5 r$ W8 {2 J6 V0 T4 P) Y: t
6 C) _' q5 B0 x- ]! W+ k7 b |
感谢博主指导,我已经调试完成,发现是在使用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,/ c3 k% w6 j' N, h6 X- W
) {) {7 h+ B- K; D+ I$ P) Y1 h9 R
```
static int32_t platform_write(void *handle, uint8_t reg, const uint8_t *bufp, uint16_t len) 8 M& |# x+ B; G
{/ A$ f9 y+ A, C# C0 [, l
// uint8_t tx_buffer[1 + len];8 ?9 t4 p! k, @, S% m
// tx_buffer[0] = reg;
// memcpy(&tx_buffer[1], bufp, len);1 L/ K) ~- t v
HAL_GPIO_WritePin(GPIOF, GPIO_PIN_5, GPIO_PIN_RESET); // 选择合适的CS引脚( D, E& b' I+ v5 Y# h$ m
// HAL_StatusTypeDef status = HAL_SPI_Transmit(handle, tx_buffer, len + 1, HAL_MAX_DELAY);
" x1 ?3 ~5 G/ x/ }" E6 M) l
HAL_SPI_Transmit(handle, ®, 1, 1000);& b2 W+ q9 j0 x5 F
HAL_SPI_Transmit(handle, (uint8_t*) bufp, len, 1000);1 P, L: `- o+ Z% W: G# H
HAL_GPIO_WritePin(GPIOF, GPIO_PIN_5, GPIO_PIN_SET); // 选择合适的CS引脚
1 s$ u: W" R9 f1 z+ D: r/ z
// return (status == HAL_OK) ? 0 : -1;; D C+ L. I8 G
return 0;
}5 Q- g% O7 `8 R8 b1 g
```1 n" P2 b* f6 O3 J
您好,请问根据时序图来看,CPOL空闲时应该是高电平,为什么在您这里配置选择LOW。但是,在实例中只有CPOL选择低电平的时候采用数据输出,高电平没有,这与数据手册中的SPI时序图不相符,请问这是怎么回事?