查看: 1406|回复: 0

MCUXpresso SDK教程–在OKdo E1板上使用I2C驱动程序

[复制链接]
  • TA的每日心情
    开心
    2024-3-26 15:16
  • 签到天数: 266 天

    [LV.8]以坛为家I

    3301

    主题

    6548

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    32040
    最后登录
    2024-4-28
    发表于 2020-8-4 09:28:15 | 显示全部楼层 |阅读模式
    MCUXpresso SDK教程–在OKdo E1板上使用I2C驱动程序


    翻译自: mark Embeddedpro


    在较早的教程中,我介绍了将I2C与OKdo E1板上的NXP LPC55S69结合使用以读取Mikroe Weather Click板上的Bosch BME280环境传感器。使用MCUXpresso时钟,引脚和外设配置工具来使其运行。在锁定的这几个月中,这一直是我一直在从事的气象站项目的全部工作。它开始成形-从照片中可以看出:
    1.png
    从左侧开始:Mikroe Weather单击,OKdo E1,Mikroe eInk单击。
    现在,我确实确实需要开始对BME280传感器进行读写,这意味着在lpcxpresso55s69 SDK中使用I2C驱动程序。因此,本周,我将对最常用的I2C函数调用进行法医检查。


    该软件是从前一周开始构建的。如果您想重现我的步骤,就在这里。请注意,我已将所有代码放入一个大的“ C”模块中(这不是很好的做法,但是使下载更容易)。


    查看main(),我们可以看到从传感器读取数据时要遵循许多步骤。


    初始化硬件(第593-601行);
    测试I2C通讯(第603行);
    读取BME280校准数据(604行);
    写入BME280配置参数(过采样率,第605行);
    触发BME280进行转换(第609行);
    轮询IsMeasuring的BME280状态寄存器完成(610);
    读取原始的BME280传感器数据(压力,温度,湿度,行611);
    将原始BME280传感器数据转换为SI单位(hPa,oC,%)(第612-614行)。
    2.png
    这是许多步骤,但是所有这些步骤都需要通过I2C读取或写入BME280环境传感器。我将通过案例研究功能I2C_WriteBME280ModeForce(),它有助于首先了解BME280内部实现的寄存器。
    3.png
    Bosch BME280注册地图
    总共有55个寄存器,其中大多数是cyan校准数据寄存器。博世提供传感器的详细生产线校准,一旦我们读取了校准数据和数据寄存器,即可轻松转换原始传感器数据(来自黄色的数据寄存器)。在使用传感器之前,有必要通过写入白色控制寄存器来配置传感器,然后通过写入地址为0xF4的ctrl_meas寄存器中的mode [1:0]位来触发转换。 BME280具有三种操作模式(睡眠,正常,强制),我的软件使用“强制”模式对这三个传感器进行单个采样。 BME280需要数毫秒的时间才能将模拟传感器数据转换为数字结果,并且在这段时间内,传感器在紫色状态寄存器中设置了一个测量位。该软件将强制进行转换并轮询测量位,以等待数据可用。

    为了在强制模式下触发转换,我们需要写入BME280传感器,并在ctrl_meas寄存器中将位设置为“ 0”。这是寄存器号0xF4。 I2C写入物理接口如下所示:
    4.png
    BME280 I2C写协议
    首先,我们输出7位从机地址(0x76),并通过清除RW位–位0来表示这是一个写操作。BME280从机确认该字节后,我们输出寄存器地址(在本例中为ctrl_meas为0xF4),再次等待来自BME280传感器的确认。最后,我们发送要写入的数据。控制寄存器ctrl_meas包含三个字段,我们必须注意不要更改现有的OverSample设置。由于传感器处于“ 0b00”睡眠模式,并且我们要转换为强制模式,因此我们将0b01写入mode [1:0]字段,并且完整的数据字节为值0x25。




    设置ctrl_meas位[1:0] = 0b01将BME280传感器转换为强制模式
    main()例程在第609行调用函数I2C_WriteBME280ModeForce()输出此I2C事务:
    5.png
    I2C_WriteBME280ModeForce()
    该事务全部由SDK I2C驱动程序函数I2C_MasterTransferNonBlocking()在404行处理。这三个参数是:
    6.png
    ·I2C外设的基地址(在FLEXCOMM4_PERIPHERAL中实现);
    ·I2C配置句柄的地址(在第601行创建,并配置回调);
    ·传输结构masterTransfer的地址。
    我们的代码需要定义和填充传输结构,您可以在395-402行中看到这一点:


    ·writeData设置为BME280-CTRL_MEAS,定义为0x25;
    ·slaveAddress设置为BME280_ADDR,定义为0x76;
    ·方向是kI2C_Write;
    ·子地址设置为BME280_CTRL_MEAS,定义为0xF4;
    ·subaddressSize为1,写入一个寄存器;
    ·数据设置为writeData的地址
    ·dataSize为1,发送一个字节的数据;
    ·标志设置为kI2C_TransferDefaultFlag,使传输以“开始”位开始,以“停止”位结束。
    观看“在线”并让I2C协议分析器完成所有艰苦的工作,我们看到了:
    7.png


    I2C_WriteBME2的I2C总线事务


    很容易看到起始位和停止位(SDA为低电平有效,首先是时钟为高电平,然后是SCL的上升沿为低电平)。在这三个阶段之间,从[W] 0x76开始,然后是0xF4,最后是0x25。一切都按预期进行。


    应用程序中的其他更高级别的函数调用可以采用相同的基本方法,例如I2C_ReadBME280Data(),I2C_ReadBME280ConvertComplete()。在读取的情况下,仅需要声明适当大小的缓冲区,以便从传感器读取数据。由于有8个数据寄存器,因此定义BME280_DATA_N为8,并且这些寄存器从地址BME280_DATA_REG 0xF7开始。
    8.png
    I2C_ReadBME280Data(),读取缓冲区大小为8个字节
    9.png
    I2C_ReadBME280Data()的I2C总线事务[显示的第一个字节0x5F]
    读取数据后,根据Bosch的“双精度浮点”算法进行了校准(来自BME280数据表,附录A),我看到了Weather Station应用程序输出的以下数据:




    应用程序的Semihost控制台输出
    在撰写本文时,英国伦敦西部的天气是“多变的”。这里干燥温暖,但是我们正从阴雨天气转变为更稳定的天气。大气压力一直在上升,表明从低压变为高压。


    与往常一样,我录制了该教程的视频,并将其托管在我的EmbeddedPro YouTube频道上。它也嵌入在这里:
    10.png

    由于只读取一次传感器没有多大意义,因此,我还发布了另一个视频,展示了如何在LPC55S69上设置实时时钟(RTC)以及如何在lpcxpresso55s69 SDK中使用RTC驱动程序。该视频显示了1分钟的中断,将构成本系列下一个教程的基础……在这里,我将开始使用Weather Station上的eInk显示屏。





    签到签到
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-4-29 03:24 , Processed in 0.123579 second(s), 22 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表