嵌入式技术论坛
直播中

张宇

7年用户 1570经验值
私信 关注
[经验]

RT-Thread Sensor框架和内置的lis2dh12驱动实现说明

LIS3DH驱动的实现说明
LIS3DH驱动基于Sensor框架内置的LIS2DH12修改而来,操作步骤参考本节其余内容。
驱动支持polling模式和fifo + 中断的模式,我们实际项目中使用的是fifo + 中断的模式。
LIS3DH内置可以保存32个样本的硬件fifo,我们把fifo的water marker中断配置为25,使用INT1引脚通知sensor框架来读取fifo中的数据。在ODR配置为100的时候,理论上每250ms中断一次,其间CPU可以休眠以减小功耗。
获取修改基础的步骤如下
1、下载RT-Thread Sensor框架和内置的lis2dh12驱动。
1.jpg
pkgs --update
scons --target=mdk5
2、ST官方的MEMS驱动库,从中提取lis3dh.h和lis3dh.c用于访问外设的基础。
我们把提取的文件放在board/lis3dh目录下,修改SConscript加入编译。
1.jpg
3、增加board/port_sensor.c向系统注册加速度传感器。
我们为了提高访问速度降低系统功耗使用了SPI访问加速度传感器,因此需要向系统注册SPI设备,如果使用I2C接口则需要注册I2C的设备。
1.jpg
通过Sensor框架使用传感器的方法
RT-Thread Sensor框架的官方文档中有一个“传感器使用 FIFO 接收模式并配合接收回调函数的使用示例”可以参考。我们实际使用的代码采用了获取设备、设置接收回调、读取设备信息、分配数据缓冲区、设置量程、设置采样频率、启动设备的流程。并在读取数据失败的时候增加了重置FIFO的代码,避免因调试或数据传输阻塞导致的硬件FIFO溢出停止更新的问题。
1.jpg
1.jpg
相对于sensor框架中的lis2dh12驱动做出的修改
1、修改所有的LIS2DH12字样为LIS3DH (DOGS),包括文件名、函数名、宏等。
2、遵循Sensor框架的开发建议,删除全局变量改为在私有指针中挂在驱动数据结构的方式,以支持多实例。
3、重新梳理和修改 初始化流程改。
采用如下流程:查找SPI设备、初始化和配置SPI设备、检测设备ID、配置设备、向Sensor注册设备。
修改原流程的几个问题:
1、硬件初始化失败时向系统中注册了无效设备。
2、增加了SPI波特率、数据位宽、极性等配置。
3、清空FIFO缓冲避免二次初始化失败的问题。
1.jpg
4、重新实现xxx_set_range, xxx_set_odr, xxx_set_mode, xxx_read_dat
参考ST官方例子lis3dh_multi_read_fifo.c重新实现上述函数。
增加自定义用户命令实现FIFO重置
LIS3DH芯片的FIFO支持两种模式:一种Steam模式,读取不及时时芯片会丢弃最老的数据,保留最新的数据;一种是FIFO模式,读取不及时芯片会停止更新FIFO。我们的系统需要连续的获取传感器数据,不希望丢失数据因此使用FIFO模式。但是为了避免因为调试或数据传输阻塞等情况造成的FIFO停止更新的情况,增加了一个自定义命令RT_SENSOR_CTRL_RESET_FIFO,用于在读取不到数据时重置FIFO恢复正常的数据更新。
RESET_FIFO函数的实现方法是参考官方app note的方法把fifo配置为bypass然后再配置回来,实现恢复数据采集的动作。
1.jpg

原作者:lishen_

更多回帖

发帖
×
20
完善资料,
赚取积分