RT-Thread的sensor框架
RT-Thread通过Sensor框架支持各种传感器,其中包括加速度传感器。使用sensor框架开发应用程序的好处就是同一套代码可以在不修改或小修改的情况下适配多种不同的传感器。很多时候还能白嫖sensor框架内已经支持的传感器驱动。
开发前应该首先阅读官方的介绍文档,了解整个传感器框架的架构。
sensor框架目前还不支持我们选择的lis3dh,本篇文章基于sensor框架内置的lis2dh12修改支持lis3dh。
ST提供了MEMS的驱动库,可以参考lis3dh的基础寄存器操作函数和实例,其中lis3dh_multi_read_fifo.c在我们的应用中是比较有价值的参考。
https://github.com/STMicroelectronics/STMems_Standard_C_drivers
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驱动。
pkgs --update
scons --target=mdk5
2、ST官方的MEMS驱动库,从中提取lis3dh.h和lis3dh.c用于访问外设的基础。
我们把提取的文件放在board/lis3dh目录下,修改SConscript加入编译。
3、增加board/port_sensor.c向系统注册加速度传感器。
我们为了提高访问速度降低系统功耗使用了SPI访问加速度传感器,因此需要向系统注册SPI设备,如果使用I2C接口则需要注册I2C的设备。
通过Sensor框架使用传感器的方法
RT-Thread Sensor框架的官方文档中有一个“传感器使用 FIFO 接收模式并配合接收回调函数的使用示例”可以参考。我们实际使用的代码采用了获取设备、设置接收回调、读取设备信息、分配数据缓冲区、设置量程、设置采样频率、启动设备的流程。并在读取数据失败的时候增加了重置FIFO的代码,避免因调试或数据传输阻塞导致的硬件FIFO溢出停止更新的问题。
相对于sensor框架中的lis2dh12驱动做出的修改
1、修改所有的LIS2DH12字样为LIS3DH (DOGS),包括文件名、函数名、宏等。
2、遵循Sensor框架的开发建议,删除全局变量改为在私有指针中挂在驱动数据结构的方式,以支持多实例。
3、重新梳理和修改 初始化流程改。
采用如下流程:查找SPI设备、初始化和配置SPI设备、检测设备ID、配置设备、向Sensor注册设备。
修改原流程的几个问题:
1、硬件初始化失败时向系统中注册了无效设备。
2、增加了SPI波特率、数据位宽、极性等配置。
3、清空FIFO缓冲避免二次初始化失败的问题。
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然后再配置回来,实现恢复数据采集的动作。