七、I2C通信读取LM75B温度

7.1 概述

I2C(Inter-Integrated Circuit)是一种同步、多主从、串行通信协议,由飞利浦公司开发,主要用于短距离通信,尤其在集成电路之间。

7.1.1 主要特点

两线制:仅需SDA(数据线)和SCL(时钟线)两根线。

多主从结构:支持多个主设备和从设备。

地址寻址:每个从设备有唯一地址,主设备通过地址选择通信对象。

低速到中速:标准模式100 kbps,快速模式400 kbps,高速模式3.4 Mbps。

7.1.2 通信过程

I²C 总线可以连接多个从设备,每个从设备都有一个唯一的地址(7 位或 10 位)。

主设备通过发送从设备地址来选择与之通信的从设备。

当主设备发送从设备地址时,从设备会将自己的地址与接收到的地址进行比较。

如果地址匹配,从设备会响应主设备并参与后续通信;如果不匹配,从设备会忽略通信。

        主机发送起始信号拉低总线,然后再发送一个字节来指明跟哪个从机通信(从机地址)以及通信的方向(主机收信息还是主机发信息),然后被寻址的从机发送应答信号回应主机,之后就开始发收了,主发从收,或者从收主发,发送器发一个,接收器应答一下。在发送完后,主机发送停止信号释放总线。

起始条件:SCL高电平时,SDA从高到低跳变。

地址传输:主设备发送7位或10位从设备地址和读写位。

数据传输:每8位数据后跟一个ACK/NACK确认位,即9位。

停止条件:SCL高电平时,SDA从低到高跳变。

在发送过程中,数据只在SCL为高电平时发送,每一个SCL的高电平发送一位(位数高到低),除了起始和停止信号,在数据传输期间,SCL为高电平时,SDA必须保持稳定,不允许改变,在SCL低电平时才可以进行变化。

发送器发8个信号,接收器应答一下,应答为低电平,非应答高电平,可能没收到,或者不收了

7.2 引脚及温度传感器介绍

7.2.1 SCL、SDA

        如下图左边,SCL对应CPU引脚为PIO0_4, SDA对应CPU引脚为PIO0_5。

7.2.2 LM75B温度传感器

将测量到的温度通过数据线发出,发两次,高8位,低8位,拼接起来就行

7.3 寄存器

7.3.1 控制置位寄存器 I2C0CONSET

        通过写1使相应位置位,写0无效

符号描述
1:0保留
2AA声明应答标志,为0返回非应答信号
3SII2C中断标志,I2C状态改变时SI置位
4STO

停止标志,总线检测到停止条件自动清零

主模式下发送停止条件

从模式下从错误状态中恢复

5STA开始标志,进入主模式,发送起始条件或重复起始条件
6I2EN接口使能
7保留

7.3.2 I2C控制清零寄存器 I2C0CONCLR

        写1将I2C0CONSET中的寄存器相应位清零

符号描述
1:0保留
2AAC声明应答清零
3SIC中断清零
4

保留

5STACSTART标志位清零
6I2ENC接口禁能
7保留

7.3.3 状态寄存器 I2C0STAT

        只读寄存器。 [7:3]位存状态码,0xF8时SI不置位,其他状态码对应一个I2C状态,这些状态对应其中任一状态时,SI置位。

7.3.4 数据寄存器 I2C0DAT

        包含要发送的数据或刚接收的数据。收发都是从右向左移位,先高位7MSB,再低位

        [7:0]存已接收或将要发送的数据值

7.3.5 监控模式寄存器 I2C0MMCTRL

在I2C总线的监控模式下,设备可以监视I2C总线上正在进行的所有通信活动,包括读取数据、写入数据等,但不会对总线进行控制。

1有效
0MM_ENA

监控模式使能

SDA输出被强制为高电平,防止I2C模块向总线输出数据

1ENA_SCL

SCL输出使能

模块可以与正常操作中相同方式控制时钟线

可以使得有足够时间相应I2C中断

3MATCHALL

选择中断寄存器匹配

0:只有在4个地址寄存器中的一个出现匹配才产生中断

1:可在任意接收地址上产生中断,监控总线上所有通信

7.3.6 数据缓冲寄存器 I2C0DATABUFFER

[7:0]位保存I2C0DAT数据寄存器中高8位内容

在监控模式下,ENA_SCL不置位,则I2C模块不能控制时钟线,接收数据的时间有限,I2C0DAT中老内容会被覆盖,为使处理器有更多时间相应,就在总线每接收9位(8位数据1位应答),就把高8位内容自动传输到DATABUFFER

7.3.7 从地址寄存器 I2C0ADR[0, 1, 2, 3]

        I2C从模式下可用,主模式无效

在 I²C 通信中,从地址寄存器(Slave Address Register)用于存储 I²C 从设备(Slave Device)的地址。这个地址是 I²C 主设备(Master Device)与从设备通信时的重要标识。

符号
0GC通用调用使能位,识别通用调用地址0x00
7:1地址从模式的I2C器件地址,若值为0x00,则总线上任意地址匹配(课本上不与好像错了)

7.3.8 屏蔽寄存器 I2C0MASK[0, 1, 2, 3]

        进行地址匹配时会把屏蔽寄存器中的地址忽略,也就是我如果是从机,我屏蔽了我的地址I2C0ADR,那么我就当没有这个地址,主机匹配这个地址时匹配不到我

四个屏蔽寄存器各包含7个有效位[7:1] 

        通用调用地址0x00无法屏蔽,因为默认就是屏蔽这个地址,有违通用调用之名

7.3.9 高电平占空比寄存器,低电平占空比寄存器 I2C0SCLH,I2C0SCLL

I2C时钟不分频就是系统时钟 48MHz 标准480 快速120 快速plus48

I2C0SCLH,I2C0SCLL值可以随便取,但是单个值必须大于等于4

7.4 获取温度

        获取LM75中的温度

照样,移植上次的UART工程,修改代码如下

main.c

#include <LPC11xx.h>
#include "LED.h"
#include "Button.h"
#include "TIMER.h"
#include "UART.h"
#include "string.h"
#include "I2C.h"
char buf[7];void Get_temputerature(void);
int32_t Temputerature_Test(void);int main(void)
{LED_Init();LED_ON();UART_Init();I2CInit();// 定义要发送的数据char message[] = "Hello, world!";// 计算数据长度,不包括结束符 '\0'int length = strlen(message);// 调用UART_Send函数发送数据UART_Send(message, length);	//发送换行UART_Send_Bit(0x0d);UART_Send_Bit(0x0a);while (1){Get_temputerature();UART_Send("Temputerature = ",16);UART_Send(buf,7);  //发送温度到pcUART_Send_Bit('C');delay_ms(1000);}
}/*
*********************************************************************************************************
*	函 数 名: Temputerature_Test()
*	功能说明: 读取温度数据
*	形    参:无
*	返 回 值: 温度值*1000的整数值
*********************************************************************************************************
*/
int32_t Temputerature_Test(void)
{uint16_t Temputerature_8,Temputerature_16;float Temputerature;I2C_Start();//startI2C_Send_Byte(0x91);//读LPC_I2C->CONSET =(1<<2);//AA=1Temputerature_8=I2C_Recieve_Byte();//高八位LPC_I2C->CONCLR =(1<<2);//AA=0Temputerature_16=(Temputerature_8<<8)+I2C_Recieve_Byte();//合成温度I2C_Stop();//STOP//温度转换Temputerature_16=Temputerature_16>>5;if(Temputerature_16&0x0400){Temputerature=-(~(Temputerature_16&0x03ff)+1)*0.125;}else{Temputerature=0.125*(float)(Temputerature_16);}return (int32_t)(Temputerature*1000);
}/*
*********************************************************************************************************
*	函 数 名: Get_temputerature()
*	功能说明: 温度数据转化为十进制
*	形    参: 无
*	返 回 值: 无
*********************************************************************************************************
*/
void Get_temputerature(void)
{int32_t temp;temp=Temputerature_Test();//获得温度//将int 转为char 同时'0'对应00000000 对数值无影响buf[0]=temp/100000+'0';//if((temp/100000)==0) buf[0]=' ';//不显示0else if(temp < 0) buf[0] = '-'; // 小于零buf[1]=temp/10000%10+'0';buf[2]=temp/1000%10+'0';buf[3]='.';buf[4]=temp/100%10+'0';buf[5]=temp/10%10+'0';buf[6]=temp%10+'0';
}

I2C.c

#include "I2C.h"/*
*********************************************************************************************************
*	函 数 名: I2CInit()
*	功能说明: I2C 初始化
*	形    参:无
*	返 回 值: 无
*********************************************************************************************************
*/
void I2CInit(void)
{LPC_SYSCON->PRESETCTRL |= (1<<1); //复位取消LPC_SYSCON->SYSAHBCLKCTRL |=(1<<5);//使能I2CLPC_SYSCON->SYSAHBCLKCTRL |=(1<<16);//使能IO配置块//选择快速模式LPC_IOCON->PIO0_4 &=~(0X3F); //选择快速模式LPC_IOCON->PIO0_4 |=0X01;//选择SCLLPC_IOCON->PIO0_5 &=~(0X3F); //选择快速模式LPC_IOCON->PIO0_5 |=0X01;//选择SDA//设置SCL频率为400kHZLPC_I2C->SCLH=40;LPC_I2C->SCLL=80;//使能I2C 同时将其他控制位清0LPC_I2C->CONCLR=0XFF;     //清所有标志LPC_I2C->CONSET |=(1<<6);    //使能I2C接口
}/*
*********************************************************************************************************
*	函 数 名: I2C_Start()
*	功能说明: 发送开始信号
*	形    参:无
*	返 回 值: 无
*********************************************************************************************************
*/
void I2C_Start(void)
{LPC_I2C->CONSET =(1<<5);// 发送开始信号 5位STA起始while(!(LPC_I2C->CONSET&(1<<3)));//等待开始信号发送完成 SI置位LPC_I2C->CONCLR =(1<<5|1<<3); //清零START 和SI 3位SI中断标志
}/*
*********************************************************************************************************
*	函 数 名: I2C_Stop()
*	功能说明: 发送停止信号
*	形    参:无
*	返 回 值: 无
*********************************************************************************************************
*/
void I2C_Stop(void)
{LPC_I2C->CONCLR =(1<<3);LPC_I2C->CONSET =(1<<4);// 发送停止信号while((LPC_I2C->CONSET&(1<<4)));//等待停止信号发送完成 SI置位
}/*
*********************************************************************************************************
*	函 数 名: I2C_Send_Byte(uint8_t data)
*	功能说明: 发送一个字节
*	形    参:data 1字节数据
*	返 回 值: 无
*********************************************************************************************************
*/
void I2C_Send_Byte(uint8_t data)
{LPC_I2C->DAT=data;LPC_I2C->CONCLR =(1<<3); //开始发送数据 清SIwhile(!(LPC_I2C->CONSET&(1<<3)));//等待数据发送完成 SI置位
}/*
*********************************************************************************************************
*	函 数 名: I2C_Recieve_Byte()
*	功能说明: 接收一个字节
*	形    参:无
*	返 回 值: 一字节接收数据
*********************************************************************************************************
*/
uint8_t I2C_Recieve_Byte(void)
{LPC_I2C->CONCLR =(1<<3);//开始接受数据  清SIwhile(!(LPC_I2C->CONSET&(1<<3)));//等待接受数据完成 SI置位return (uint8_t)LPC_I2C->DAT;
}

I2C.h

#ifndef _I2C_H_
#define _I2C_H_#include <LPC11xx.h>void I2CInit(void);
void I2C_Start(void);
void I2C_Stop(void);
void I2C_Send_Byte(uint8_t data);
uint8_t I2C_Recieve_Byte(void);#endif

打开串口,效果如下

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CSS 小技巧 —— CSS 实现 Tooltip 功能-鼠标 hover 之后出现弹层

CSS 小技巧 —— CSS 实现 Tooltip 功能-鼠标 hover 之后出现弹层 1. 两个元素实现 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><title>纯 CSS 实现 Tooltip 功能-鼠标 hover 之后出现弹层</titl…

微信小程序医院挂号系统

第3章 系统设计 3.1系统体系结构 系统的体系结构非常重要&#xff0c;往往决定了系统的质量和生命周期。针对不同的系统可以采用不同的系统体系结构。本系统为微信小程序医院挂号系统&#xff0c;属于开放式的平台&#xff0c;所以在管理端体系结构中采用B/s。B/s结构抛弃了固…

开源堡垒机 JumpServer 社区版实战教程:一步步构建企业安全运维环境

文章目录 开源堡垒机 JumpServer 社区版实战教程&#xff1a;一步步构建企业安全运维环境一、访问JumpServer1.1 登录1.2 功能模块1.3 系统设置1.3.1 基本设置1.3.2 邮件设置 二、用户管理2.1 场景2.2 创建用户2.3 用户登录密码重置 三、资产管理3.1 准备工作3.2 登录控制台3.3…

小红书八股面经一份(JAVA开发)

1. zmysql索引结构 mysql索引底层采用的是b树的结构&#xff0c;一开始mysql的索引采用的是b树的结构&#xff0c;当数据量达到一定程度的时候&#xff0c;b树存在深度过大的问题&#xff0c;那么磁盘io次数就会飞速上升&#xff0c;导致查询效率慢。b树就很好的解决了这个问题…

redis 缓存击穿问题与解决方案

前言1. 什么是缓存击穿?2. 如何解决缓存击穿?怎么做?方案1: 定时刷新方案2: 自动续期方案3: 定时续期 如何选? 前言 当我们使用redis做缓存的时候,查询流程一般是先查询redis,如果redis未命中,再查询MySQL,将MySQL查询的数据同步到redis(回源),最后返回数据 流程图 为什…

路由过滤方法与常用工具

引言 在前面我们已经学习了路由引入&#xff0c;接下来我们就更进一步来学习路由过滤 前一篇文章&#xff1a;重发布&#xff1a;路由引入&#xff08;点击即可&#xff09; 路由过滤 定义&#xff1a;路由器在发布或者接收消息时&#xff0c;可能需要对路由信息进行过滤。 作用…

网络分析工具—WireShark的安装及使用

Wireshark 是一个广泛使用的网络协议分析工具&#xff0c;常被网络管理员、开发人员和安全专家用来捕获和分析网络数据包。它支持多种网络协议&#xff0c;能够帮助用户深入理解网络流量、诊断网络问题以及进行安全分析。 Wireshark 的主要功能 数据包捕获与分析&#xff1a; …

anolis os 8.9安装jenkins

一、系统版本 # cat /etc/anolis-release Anolis OS release 8.9 二、安装 # dnf install -y epel-release # wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo # rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.…

Java 进阶day14XML Dom4j 工厂模式 Base64

目录 知识点1、XML 概念XML约束 知识点2、XML解析 Dom4j&#xff08;Dom for java&#xff09;XPath 知识点3、工厂模式知识点4、Base64 知识点1、XML 概念 XML的全称为&#xff08;eXtensible Markup Language&#xff09;&#xff0c;是一种可扩展的标记语言。 XML的作用…

软件测试面试题及答案解析,2025最新版

1、什么是兼容性测试?兼容性测试侧重哪些方面? 参考答案: 兼容测试主要是检查软件在不同的硬件平台、软件平台上是否可以正常的运行&#xff0c;即是通常说的软件的可移植性。 兼容的类型&#xff0c;如果细分的话&#xff0c;有平台的兼容&#xff0c;网络兼容&#xff0…

【云安全】云原生-K8S- kubeconfig 文件泄露

什么是 kubeconfig 文件&#xff1f; kubeconfig 文件是 Kubernetes 的配置文件&#xff0c;用于存储集群的访问凭证、API Server 的地址和认证信息&#xff0c;允许用户和 kubectl 等工具与 Kubernetes 集群进行交互。它通常包含多个集群的配置&#xff0c;支持通过上下文&am…

无人机遥感图像拼接及处理实践技术:生态环境监测、农业、林业等领域,结合图像拼接与处理技术,能够帮助我们更高效地进行地表空间要素的动态监测与分析

近年来&#xff0c;无人机技术在遥感领域的应用越来越广泛&#xff0c;尤其是在生态环境监测、农业、林业等领域&#xff0c;无人机遥感图像的处理与分析成为了科研和业务化工作中的重要环节。通过无人机获取的高分辨率影像数据&#xff0c;结合图像拼接与处理技术&#xff0c;…

网络工程师 (33)VLAN注册协议——GVRP协议

前言 VLAN注册协议——GVRP&#xff08;GARP VLAN Registration Protocol&#xff09;是一种用于在网络中动态管理VLAN成员关系的网络协议。 一、基本概念 GVRP是GARP&#xff08;Generic Attribute Registration Protocol&#xff0c;通用属性注册协议&#xff09;的一种具体应…

在实体机和wsl2中安装docker、使用GPU

正常使用docker和gpu&#xff0c;直接命令行安装dcoker和&#xff0c;nvidia-container-toolkit。区别在于&#xff0c;后者在于安装驱动已经cuda加速时存在系统上的差异。 1、安装gpu驱动 在实体机中&#xff0c;安装cuda加速包&#xff0c;我们直接安装 driver 和 cuda 即可…

使用stm32控制esp01s

title: 使用stm32控制esp01s date: 2025年2月9日 18:41:20 tags: 单片机模块使用 categories: stm32 description: 使用stm32控制esp01s连接WiFi查看内容等操作 前言 使用stm32f103控制esp01s是步入物联网的第一步&#xff0c;接下来的文章会详细讲解如何使用stm32控制esp01s…

PT8042 双触控双输出触摸 IC

1. 产品概述 PT8042 是一款电容式触摸控制 ASIC &#xff0c;支持双通道触摸输入和双路同步开关输出&#xff0c;可引脚配置 同步输出的有效电平。 PT8042 实现触摸同步开关控制。适用于雾化器、车载用品、电子玩具、 消费类电子产品等领域&#xff0c;具有低功耗、高抗…

【AI学习】DeepSeek-R1-Distill的意义和影响

在写完上一篇文章《DeepSeek为什么这么火爆&#xff1f;解密梁文锋的深谋远虑》后&#xff0c;又想到了一个新的问题。 在DeepSeek R1的技术报告中&#xff0c;还有这样一个技术&#xff1a;蒸馏赋予小模型推理能力。这项技术的意义和影响是什么&#xff1f; 先看看这个技术&…

qml ToolBar详解

1、概述 在 QML 中&#xff0c;ToolBar 是一种常用的 UI 组件&#xff0c;通常位于窗口的顶部或底部&#xff0c;用于提供一系列的操作按钮、菜单或其他交互元素。它可以帮助用户快速访问应用程序的常用功能&#xff0c;提高用户操作的便捷性。ToolBar 可以包含多个 ToolButto…

视频理解新篇章:Mamba模型的探索与应用

人工智能咨询培训老师叶梓 转载标明出处 想要掌握如何将大模型的力量发挥到极致吗&#xff1f;叶老师带您深入了解 Llama Factory —— 一款革命性的大模型微调工具&#xff08;限时免费&#xff09;。 1小时实战课程&#xff0c;您将学习到如何轻松上手并有效利用 Llama Facto…

Flutter项目试水

1基本介绍 本文章在构建您的第一个 Flutter 应用指导下进行实践 可作为项目实践的辅助参考资料 Flutter 是 Google 的界面工具包&#xff0c;用于通过单一代码库针对移动设备、Web 和桌面设备构建应用。在此 Codelab 中&#xff0c;您将构建以下 Flutter 应用。 该应用可以…