基于MP157AAA的I2C练习

练习要求:

通过I2C分别实现与芯片si7006(获取湿度、温度)和芯片ap3216(获取环境光照强度)的通讯;

1、运行效果

2、分析ap3216如何获取光照强度

2.1、需要操作的寄存器

通过分析手册,需要操作以下寄存器:

        0x00:系统配置

        0x0C:环境光低位

        0x0D:环境光高位

2.2、配置system寄存器为获取环境光模式

只监测环境光,因此,只需要配置成 0x01 (画红框的目的,一开始的目标是同时测量环境光、红外和物体接近, IGNORE!)

2.3、读取环境光

一次环境光的数据由两个寄存器构成(高、低位)

3、代码

3.1、main.c

#include "si7006.h"
#include "ap3216.h"

int main()
{
    unsigned short hum;
    short tem;
    unsigned short als;
    i2c_init();    // i2c初始化
    si7006_init(); // 进行si7006初始化
    ap3216_init();
    while (1)
    {
        // 读取温度和湿度
        hum = si7006_read_hum();
        hum = 125 * hum / 65536 - 6; // 数据的处理
        tem = si7006_read_tem();
        tem = tem * 175.72 / 65536 - 46.85;
        printf("tem=%d hum=%d\n\r", tem, hum);

        // 读取光照
        als = ap3216_read_als();
        printf("als=[%d]\n\r", als);

        delay_ms(1000);
    }
    return 0;
}

3.2、ap3216.c

#include "ap3216.h"
#include "delay.h"

void ap3216_init()
{
    i2c_init();
  
    //1、设置模式
    //1.1、选iic地址 0x1E:写
    i2c_start();
    i2c_write_byte((0x1E << 1) | 0);
    i2c_wait_ack();
    // 2、设置配置寄存器地址 0x00
    i2c_write_byte((0x00 << 1) | 0);
    i2c_wait_ack();
    // 3、配置为0x01:只读环境光
    i2c_write_byte(0x01);
    i2c_wait_ack();
    i2c_stop();
}

unsigned short ap3216_read_als()//ambient light sensor
{
    //1、读取高8位 寄存器地址 0x0D
    //1.1、设置要读取的寄存器
    i2c_start();
    i2c_write_byte((0x1E<<1)|0);
    i2c_wait_ack();
    i2c_write_byte(0x0D);
    i2c_wait_ack();
    //1.2、从寄存器读数据
    i2c_start();
    i2c_write_byte((0x1E<<1)|1);
    i2c_wait_ack();
    char als_high=i2c_read_byte(1);
    i2c_stop();

    //2、读取低8位 寄存器地址 0x0C
    //2.1、设置要读取的寄存器
    i2c_start();
    i2c_write_byte((0x1E<<1)|0);
    i2c_wait_ack();
    i2c_write_byte(0x0C);
    i2c_wait_ack();
    //2.2、从寄存器读数据
    i2c_start();
    i2c_write_byte((0x1E<<1)|1);
    i2c_wait_ack();
    char als_low=i2c_read_byte(1);
    i2c_stop();
   
    //
    //printf("als_high=[%d], als_low=[%d]\n\r", als_high, als_low);
    return (als_high<<8)|als_low;
}

3.3、si7006.c

#include "si7006.h"
//芯片初始化
void si7006_init()
{

    i2c_start();
    i2c_write_byte(0X40<<1|0);
    i2c_wait_ack();
    i2c_write_byte(0XE6);
    i2c_wait_ack();
    i2c_write_byte(0X3A);
    i2c_wait_ack();
    i2c_stop();

}
//读取温度函数封装
 short si7006_read_tem()
{
    short tem;
    char tem1,tem2;
    i2c_start();//主机发起起始信号
    i2c_write_byte(0X40<<1|0);
    i2c_wait_ack();
    i2c_write_byte(0XE3);
    i2c_wait_ack();
    i2c_start();//主机发起重复起始信号
    i2c_write_byte(0X40<<1|1);
    i2c_wait_ack();
    delay_ms(100);//给从机测量时间
    tem1=i2c_read_byte(0);//读取温度的高8位,回应应答信号
    tem2=i2c_read_byte(1);//读取低八位,回应非应答信号
    i2c_stop();
    //获取完整温度
    tem=tem1<<8|tem2;
    return tem;

}

//读取湿度函数封装
unsigned short si7006_read_hum()
{
    unsigned short hum;
    unsigned char hum1,hum2;
    i2c_start();//主机发起起始信号
    i2c_write_byte(0X40<<1|0);
    i2c_wait_ack();
    i2c_write_byte(0XE5);
    i2c_wait_ack();
    i2c_start();//主机发起重复起始信号
    i2c_write_byte(0X40<<1|1);
    i2c_wait_ack();
    delay_ms(100);//给从机测量时间
    hum1=i2c_read_byte(0);//读取温度的高8位,回应应答信号
    hum2=i2c_read_byte(1);//读取低八位,回应非应答信号
    i2c_stop();
    //获取完整温度
    hum=hum1<<8|hum2;
    return hum;
}

4、小结

笔者在写si7006.c时,同时犯了以上两个错误,通过和示例代码比较,总结出以下两点:

  • start后面必须要跟I2C地址+操作位(读/写);
  • 除了上一点,后面操作的所有寄存器都不需要进行移位操作和读取操作的配置了。

此外,还有一个疑问:

  • 是否在配置系统寄存器之前,都需要先进行软件复位(基于ap3216);
  • 手册中有描述,进行测量时需要一定的时间,问题是,我如何知道应该延迟多久,以及,如果读取间隔过短,读取两次,我很有可能其实读到的同一次测量的数据。后续可以研究,是否可以结合中断,来解决这个问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/950542.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】深入理解文件系统(超详细)

目录 一.磁盘 1-1 磁盘、服务器、机柜、机房 &#x1f4cc;补充&#xff1a; &#x1f4cc;通常网络中用高低电平&#xff0c;磁盘中用磁化方向来表示。以下是具体说明&#xff1a; &#x1f4cc;如果有一块磁盘要进行销毁该怎么办&#xff1f; 1-2 磁盘存储结构 ​编辑…

网络安全图谱以及溯源算法

​ 本文提出了一种网络攻击溯源框架&#xff0c;以及一种网络安全知识图谱&#xff0c;该图由六个部分组成&#xff0c;G <H&#xff0c;V&#xff0c;A&#xff0c;E&#xff0c;L&#xff0c;S&#xff0c;R>。 1|11.知识图 ​ 网络知识图由六个部分组成&#xff0c…

《Spring Framework实战》7:4.1.2.容器概述

欢迎观看《Spring Framework实战》视频教程 容器概述 该接口表示 Spring IoC 容器&#xff0c;并负责实例化、配置和组装 bean。 容器在组件上获取其指令&#xff0c;以实例化、配置和 通过读取配置元数据进行汇编。可以表示配置元数据 作为带注释的组件类、具有工厂方法的配置…

学生公寓技术规格书如何编写?

学生公寓限电柜的技术规格书主要包括以下内容‌&#xff1a; ‌用电计量计费‌&#xff1a;限电柜可以通过计算机售电管理系统进行用电计量计费&#xff0c;学生需要预交电费&#xff0c;系统会自动将数据传给控电柜和配电箱&#xff0c;对宿舍的电量进行累减计量‌。 ‌时间控…

【HarmonyOS NEXT】鸿蒙应用点9图的处理(draw9patch)

【HarmonyOS NEXT】鸿蒙应用点9图的处理&#xff08;draw9patch&#xff09; 一、前言&#xff1a; 首先在鸿蒙中是不支持安卓 .9图的图片直接使用。只有类似拉伸的处理方案&#xff0c;鸿蒙提供的Image组件有与点九图相同功能的API设置。 可以通过设置resizable属性来设置R…

SpringBoot 使用 Cache 集成 Redis做缓存保姆教程

1. 项目背景 Spring Cache是Spring框架提供的一个缓存抽象层&#xff0c;它简化了缓存的使用和管理。Spring Cache默认使用服务器内存&#xff0c;并无法控制缓存时长&#xff0c;查找缓存中的数据比较麻烦。 因此Spring Cache支持将缓存数据集成到各种缓存中间件中。本文已常…

MySQL事件功能简介

MySQL 的事件调度器&#xff08;Event Scheduler&#xff09;提供了一种便捷的方法来定时执行 SQL 语句&#xff0c;从而实现数据维护、报告生成等自动化操作。本文将详细介绍 MySQL 的事件功能&#xff0c;并说明如何使用 Navicat 管理这些事件。 1. 什么是 MySQL 事件调度器…

高光谱相机的特点

光谱特性 高光谱分辨率&#xff1a;能将光谱范围分割成极窄的波段&#xff0c;光谱分辨率通常达到纳米级甚至亚纳米级&#xff0c;可精确捕捉到不同物质在细微光谱差异上的特征&#xff0c;比如可以区分不同种类的植被因叶绿素含量等差异而在光谱上的细微变化。 多波段探测&a…

备考蓝桥杯:数据结构概念浅谈

目录 1数据结构的概念 什么是数据结构: 为什么要有数据结构 2.数据结构的三个组成要素 1.逻辑结构 2.存储结构 3.数据运算 3。算法好坏的度量&#xff08;时间复杂度和空间复杂度&#xff09; 时间复杂度计算 最优和平均和最差时间复杂度 计算时间复杂度例子 空间复…

闲谭SpringBoot--ShardingSphere分库分表探究

文章目录 1. 背景2. 创建数据库3. 修改yml配置文件4. 分片算法类5. 测试6 小结 1. 背景 接上文&#xff0c;我们对日志表&#xff0c;进行了按月的分表&#xff0c;这样每个月几百万条数据量还是扛得住的。 但是如果数据再多呢&#xff0c;除了提高硬件性能&#xff0c;还有一…

基于伪分布式模式部署Hadoop集群

1.上传Hadoop安装包 在/export/software目录下使用rz命令上传Hadoop安装包 2.创建目录 在/export/servers目录下创建wfb-hadoop目录&#xff0c;用于存放Hadoop的安装目录&#xff0c;命令如下&#xff1a; mkdir -p /export/servers/wfb-hadoop 3.安装Hadoop 1)将Hadoop安…

Android车载音频系统目录

目录 第一章 1.1 Android Automotive&#xff08;一&#xff09; 1.2 Android Automotive&#xff08;二&#xff09; 1.3 Android Automotive&#xff08;三&#xff09; 第二章 2.1 Android车载音频系统概览 2.2 车载音频焦点 2.3 车载音频配置 2.4 Audio control HAL…

怎么管理电脑usb接口,分享四种USB端口管理方法

怎么管理电脑usb接口&#xff0c;分享四种USB端口管理方法 USB接口作为电脑重要的外部接口&#xff0c;方便了数据传输和设备连接。 然而&#xff0c;不加管理的USB接口也可能带来安全隐患&#xff0c;例如数据泄露、病毒传播等。 因此&#xff0c;有效管理电脑USB接口至关重…

React+redux项目搭建流程

1.创建项目 create-react-app my-project --template typescript // 创建项目并使用typescript2.去除掉没用的文件夹&#xff0c;只保留部分有用的文件 3.项目配置&#xff1a; 配置项目的icon 配置项目的标题 配置项目的别名等&#xff08;craco.config.ts&…

conda+jupyter+pycharm:如何在Windows conda环境下运行jupyter并使用浏览器或者pycharm运行.ipynb

1 安装conda 2 conda环境下安装jupyter pip install jupyter3 设置jupyter配置文件 1&#xff09;创建 jupyter_notebook_config.py文件 jupyter notebook --generate-config 2&#xff09;设置密码 3&#xff09;设置参数 直接将以下参数修改为自己的配置后复制到配置文件…

微信小程序获取图片使用session(上篇)

概述&#xff1a; 我们开发微信小程序&#xff0c;从后台获取图片现实的时候&#xff0c;通常采用http get的方式&#xff0c;例如以下代码 <image class"user_logo" src"{{logoUrl}}"></image>变量logoUrl为ur图片l的请求地址 但是对于很多…

【江协STM32】9-1/2/3 USART串口协议、USART外设、串口发送串口发送+接收

1. 通信接口 通信的目的&#xff1a;将一个设备的数据传送到另一个设备&#xff0c;扩展硬件系统通信协议&#xff1a;制定通信的规则&#xff0c;通信双方按照协议规则进行数据收发全双工&#xff1a;指通信双方能够同时进行双向通信。发送线路和接收线路互不影响&#xff0c…

第一 二章 小车硬件介绍-(全网最详细)基于STM32智能小车-蓝牙遥控、避障、循迹、跟随、PID速度控制、视觉循迹、openmv与STM32通信、openmv图像处理、smt32f103c8t6

第一篇-STM32智能小车硬件介绍 后续章节也放这里 持续更新中&#xff0c;视频发布在小B站 里面。这边也会更新。 B站视频合集: STM32智能小车V3-STM32入门教程-openmv与STM32循迹小车-stm32f103c8t6-电赛 嵌入式学习 PID控制算法 编码器电机 跟随 小B站链接:https://www.bilib…

【网络】电路交换(Circuit Switching)、报文交换(Message Switching)和分组交换(Packet Switching)

电路交换&#xff08;Circuit Switching&#xff09;&#xff1a;一条专用的通信线路&#xff08;或电路&#xff09;&#xff08; 电话专用线路&#xff0c;好处&#xff1a;专用稳定&#xff0c;有没有数据都被占用&#xff0c;坏处&#xff1a;容易浪费&#xff09; 报文交换…

Pixel 6a手机提示无法连接移动网络,打电话失败!

1、开启VoLTE 2、如果没有&#xff0c;下载shizuku和PixelIMS应用。 shizuke Releases RikkaApps/Shizuku GitHub PixellMS Release v1.2.8 kyujin-cho/pixel-volte-patch GitHub 3、安装shizuke启动&#xff0c;开通root可以直接点击下面的启动&#xff0c;如果没有就…