七、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 | 保留 | |
| 2 | AA | 声明应答标志,为0返回非应答信号 |
| 3 | SI | I2C中断标志,I2C状态改变时SI置位 |
| 4 | STO | 停止标志,总线检测到停止条件自动清零 主模式下发送停止条件 从模式下从错误状态中恢复 |
| 5 | STA | 开始标志,进入主模式,发送起始条件或重复起始条件 |
| 6 | I2EN | 接口使能 |
| 7 | 保留 |
7.3.2 I2C控制清零寄存器 I2C0CONCLR
写1将I2C0CONSET中的寄存器相应位清零
| 位 | 符号 | 描述 |
| 1:0 | 保留 | |
| 2 | AAC | 声明应答清零 |
| 3 | SIC | 中断清零 |
| 4 | 保留 | |
| 5 | STAC | START标志位清零 |
| 6 | I2ENC | 接口禁能 |
| 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有效 | |
| 0 | MM_ENA | 监控模式使能 SDA输出被强制为高电平,防止I2C模块向总线输出数据 |
| 1 | ENA_SCL | SCL输出使能 模块可以与正常操作中相同方式控制时钟线 可以使得有足够时间相应I2C中断 |
| 3 | MATCHALL | 选择中断寄存器匹配 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)与从设备通信时的重要标识。
| 位 | 符号 | |
| 0 | GC | 通用调用使能位,识别通用调用地址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
打开串口,效果如下

相关文章:
七、I2C通信读取LM75B温度
7.1 概述 I2C(Inter-Integrated Circuit)是一种同步、多主从、串行通信协议,由飞利浦公司开发,主要用于短距离通信,尤其在集成电路之间。 7.1.1 主要特点 两线制:仅需SDA(数据线)…...
Python 调用 Azure OpenAI API
在人工智能和机器学习快速发展的今天,Azure OpenAI 服务为开发者提供了强大的工具来集成先进的 AI 能力到他们的应用中。本文将指导您如何使用 Python 调用 Azure OpenAI API,特别是使用 GPT-4 模型进行对话生成。 准备工作 在开始之前,请确保您已经: 拥有一个 Azure 账户…...
Spring Boot 配置JPA数据库主从读写分离失败及解决办法
因为是老项目, Spring Boot 是1.4, 使用 AbstractRoutingDataSource 来做主从切换, 配置切面类在进入事务时切换成主库, 但实际运行起来却失败, 写操作路由到了从库 查了很多文章, 试了很多方法都无效, 包括修改注解 Transactional 的 propagation 属性, 清空主从标记等等 打…...
基于华为云镜像加速器的Docker环境搭建与项目部署指南
基于华为云镜像加速器的Docker环境搭建与项目部署指南 一、安装Docker1.1 更新系统包1.2 安装必要的依赖包1.3 移除原有的Docker仓库配置(如果存在)1.4 添加华为云Docker仓库1.5 安装Docker CE1.6 启动Docker服务1.7 验证Docker是否安装成功1.8 添加华为云镜像加速器地址二、…...
讲解下SpringBoot中MySql和MongoDB的配合使用
在Spring Boot中,MySQL和MongoDB可以配合使用,以充分发挥关系型数据库和非关系型数据库的优势。MySQL适合处理结构化数据,而MongoDB适合处理非结构化或半结构化数据。以下是如何在Spring Boot中同时使用MySQL和MongoDB的详细讲解。 1. 添加依…...
CSS 属性选择器详解与实战示例
CSS 属性选择器是 CSS 中非常强大且灵活的一类选择器,它能够根据 HTML 元素的属性和值来进行精准选中。在实际开发过程中,属性选择器不仅可以提高代码的可维护性,而且能够大大优化页面的样式控制。本文将结合菜鸟教程的示例,从基础…...
2025 游戏试玩打码平台PHP源码
源码介绍 2025 游戏试玩打码平台PHP源码 开发语言:PHP 数据库:MySQL 源码程序采用yii框架phpMysql语言开发 功能完善,无后门 程序功能有: 1.游戏试玩功能 2.广告体验功能 3.打码功能 4.新人任务 5.开启宝箱功能 6.站长联盟功能 7.兑换商城功…...
【Matlab算法】基于人工势场的多机器人协同运动与避障算法研究(附MATLAB完整代码)
📚基于人工势场的多机器人协同运动与避障算法研究 摘要1. 引言2. 方法说明2.1 人工势场模型2.2 运动控制流程3. 核心函数解释3.1 主循环结构3.2 力计算函数4. 实验设计4.1 参数配置4.2 测试场景5. 结果分析5.1 典型运动轨迹5.2 性能指标6. 总结与建议成果总结改进方向附录:完…...
自动化办公|xlwings 数据类型和转换
xlwings 数据类型和转换:Python 与 Excel 的桥梁 在使用 xlwings 进行 Python 和 Excel 数据交互时,理解两者之间的数据类型对应关系至关重要。本篇将详细介绍 Python 数据类型与 Excel 数据类型的对应关系,以及如何进行数据类型转换。 一、…...
北斗导航 | 基于多假设解分离(MHSS)模型的双星故障监测算法(MATLAB代码实现——ARAIM)
===================================================== github:https://github.com/MichaelBeechan CSDN:https://blog.csdn.net/u011344545 ===================================================== 双星故障监测算法 一、多星故障MHSS模型流程1、数据预处理2、构建假设模…...
部署 ollama + deepseek + open-webui 遇到的常见问题与解决建议
前言 前面部署了 ollama deepseek open-webui 这里聊聊部署过程中遇到的一些问题和解决方案。 包含 ollama 容器部署 和 本地部署 中所遇问题和解决方案。 1. ollama proxy 网络代理问题 ollama 容器部署 用不了 http https 的 proxy 代理(配全局都没用…...
sql难点
一、 假设你有一个查询,需要根据 id 是否为 null 来动态生成 SQL 条件: xml复制 <select id"getResources" resultType"Resource">SELECT * FROM resources<where><if test"id ! null">and id <!…...
oracle表分区--范围分区
文章目录 oracle表分区分区的原因分区的优势oracle表分区的作用oracle表分区类型一、范围分区二、 创建分区表和使用:1、按照数值范围划分2、按照时间范围3、MAXVALUE2. 向现有表添加新的分区3、 分区维护和重新组织(合并/删除) oracle表分区…...
mysql读写分离与proxysql的结合
上一篇文章介绍了mysql如何设置成主从复制模式,而主从复制的目的,是为了读写分离。 读写分离,拿spring boot项目来说,可以有2种方式: 1)设置2个数据源,读和写分开使用 2)使用中间件…...
elment-plus的表单的其中一项通过了验证再去走别的函数怎么写,不是全部内容通过验证
<template> <el-form ref"formRef" :model"formData" :rules"formRules"> <el-form-item label"身份证号" prop"idCard"> <el-input v-model"formData.idCard" blur"getDetail()"…...
蓝桥杯试题:归并排序
一、问题描述 在一个神秘的岛屿上,有一支探险队发现了一批宝藏,这批宝藏是以整数数组的形式存在的。每个宝藏上都标有一个数字,代表了其珍贵程度。然而,由于某种神奇的力量,这批宝藏的顺序被打乱了,探险队…...
Untiy3d 铰链、弹簧,特殊的物理关节
(一)铰链组件 1.创建一个立方体和角色胶囊 2.给角色胶囊挂在控制脚本和刚体 using System.Collections; using System.Collections.Generic; using UnityEngine;public class plyer : MonoBehaviour {// Start is called once before the first execut…...
Visual Studio 进行单元测试【入门】
摘要:在软件开发中,单元测试是一种重要的实践,通过验证代码的正确性,帮助开发者提高代码质量。本文将介绍如何在VisualStudio中进行单元测试,包括创建测试项目、编写测试代码、运行测试以及查看结果。 1. 什么是单元测…...
Leetcode - 周赛435
目录 一、3442. 奇偶频次间的最大差值 I二、3443. K 次修改后的最大曼哈顿距离三、3444. 使数组包含目标值倍数的最少增量四、3445. 奇偶频次间的最大差值 II 一、3442. 奇偶频次间的最大差值 I 题目链接 本题使用数组统计字符串 s s s 中每个字符的出现次数,然后…...
CentOS本机配置为时间源
CentOS本机配置为时间源 安装chrony,默认已安装修改配置文件 /etc/chrony.conf客户端配置 安装chrony,默认已安装 yum -y install chrony修改配置文件 /etc/chrony.conf # cat /etc/chrony.conf | grep -Ev "^$|#" server ceph00 iburst dri…...
算法之 数论
文章目录 质数判断质数3115.质数的最大距离 质数筛选204.计数质数2761.和等于目标值的质数对 2521.数组乘积中的不同质因数数目 质数 质数的定义:除了本身和1,不能被其他小于它的数整除,最小的质数是 2 求解质数的几种方法 法1,根…...
Android车机DIY开发之软件篇(十二) AOSP12下载编译
Android车机DIY开发之软件篇(十二) AOSP12下载编译 sudo apt-get update sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev gcc-multilib gmultilib libc6-dev-i386 lib32ncurses5-dev libx11-dev lib32z-dev ccache libgl1-mesa-…...
docker 导出导入
1第一步骤docker save docker save -o database-export-4.1.0.tar database-export-4.1.0.jar:latest 2检查镜像ls -l, 注意:文件可能没有其他文件导出权限:chmod 644 database-export-4.1.0.tar 3在新的服务器导入: docker load -i databa…...
OSPF高级特性(3):安全特效
引言 OSPF的基础我们已经结束学习了,接下来我们继续学习OSPF的高级特性。为了方便大家阅读,我会将高级特性的几篇链接放在末尾,所有链接都是站内的,大家点击即可阅读: OSPF基础(1):工…...
基于SSM的农产品供销小程序+LW示例参考
1.项目介绍 系统角色:管理员、农户功能模块:用户管理、农户管理、产品分类管理、农产品管理、咨询管理、订单管理、收藏管理、购物车、充值、下单等技术选型:SSM,Vue(后端管理web),uniapp等测试…...
自然语言处理NLP入门 -- 第二节预处理文本数据
在自然语言处理(NLP)中,数据的质量直接影响模型的表现。文本预处理的目标是清理和标准化文本数据,使其适合机器学习或深度学习模型处理。本章介绍几种常见的文本预处理方法,并通过 Python 代码进行示例。 2.1 文本清理…...
android launcher拖动图标释放错位
由于为了设备流畅把所有动画效果设置为0.5,不设置为0是因为锁屏在开机时会有闪黑屏的现象。在此背景下,测试发现在拖动桌面图标时,在图标动画过程中错位时释放图标,则图标会留在错位的位置,不会自动对齐。 原因就是动…...
小结:OSPF的网络类型,LSA
OSPF(Open Shortest Path First)是一个基于链路状态的内部网关协议(IGP)。以下是对OSPF网络类型、LSA类型、序列号与Age作用,以及相关配置指令的详细讲解。 一、OSPF的网络类型 OSPF支持多种网络类型,不同…...
Unity URP的2D光照简介
官网工程,包括2d光照,动画,动效介绍: https://unity.com/cn/blog/games/happy-harvest-demo-latest-2d-techniques https://docs.unity3d.com/6000.0/Documentation/Manual/urp/Lights-2D-intro.html 人物脸部光照细节和脚上的阴影…...
笔试题笔记#3
1 一道bfs,唯一不同的是要对单链表中后继节点的编号排序 #include<bits/stdc.h> using namespace std;const int N10000;vector<int> headofNode[N]; int n,m; int d; bool st[N]; int parent[N]; vector<int> ans;void PrintAns(int i){//cout…...

