• 【蓝牙数据采集模块】02Sensor Controller 编写CC2650STK外设驱动


    上次说到把所有的传感器模块在Sensor Controller中实现读写,并封装驱动。

    先来看一下CC2650STK的原理图

    用红色方框标记的DIO_0~DIO_7, DIO_23~DIO_30是可以通过Sensor Controller去控制的。后面几个暂时用不到,前面的包括了一个I2C接口,和两个BUTTON按键管脚,以及一个REED干簧管管脚。剩余的TMP RDY,AUDIO,MPU INT就先不管了。

    现在开始给I2C接口和3个输入管脚编写驱动Sensor Controller下的驱动与数据采集程序。

    SDA和SCL的I2C接口下面接入了4个传感器芯片,分别是OPT3001光照、BMP280气压、TMP007红外温度、HDC1000湿度。这些传感器的datasheet和驱动都可以在官方网站上下载到,参照官方的驱动程序,在Sensor Controller Studio中编写对应的驱动程序。3个输入信号,另外创建一个TASK编写对应的程序,读取管脚的输入状态。 I2C中只用到了数据延迟操作,而输入信号用到了定时器中断功能。

    最终工程的结构如下图:

    用到了5个管脚,I2C Sensors任务用到了两个引脚, IO Sensors任务用到了三个引脚。

    最后生成的驱动代码所占用的RAM资源达到了95.6%,基本用完了。若需要加其他东西,只能精简驱动程序代码了,比如去掉一些初始化步骤等等。

    在编写驱动中发现HDC1000的温湿度读取I2C通信过程相对较为特殊,需要先触发测量(写访问,写0个字节到温度寄存器),读取等待测量完成(循环读访问直到有ACK信号),读取测量结果(温度2个字节、湿度2个字节)。光用文字说不太清楚,需要详细看手册去了解这个。  中间提到的读取等待测量完成(循环读访问直到有ACK信号),在我这里测量总是第353次才有ACK返回,不知道有什么具体的原因。

    用TASK Testing工具测试I2C Sensors任务的效果,可以看到Sensor Controller已经能够读取到所有关心的数据了。

    IO Sensors任务中的驱动代码相对来说简单很多,有兴趣的可以看源代码。

    ~~大功告成,其实花了很多时间来调I2C的驱动,主要原因就是上面提到的HDC1000循环读取的关系,不过最后也算是终于搞定了。

    该工程的源码可以在下面链接上看到。

    https://coding.net/u/vacajk/p/Exploration_Sensors/git

    下一步就是在M3内核中来实现与Sensor Controller互相通信交互的功能。

  • 相关阅读:
    C++11之function模板和bind函数适配器
    C++11之右值引用(三):使用C++11编写string类以及“异常安全”的=运算符
    C++11之右值引用(二):右值引用与移动语义
    C++11之右值引用(一):从左值右值到右值引用
    C++Singleton的DCLP(双重锁)实现以及性能测评
    信息熵
    ip访问网站和localhost访问网站中top使用
    方差与协方差
    js获取file控件的完整路径(上传图片预览)
    对线性回归,logistic回归和一般回归
  • 原文地址:https://www.cnblogs.com/vacajk/p/5631717.html
Copyright © 2020-2023  润新知