I²C通信

STM32的I2C通信 STM32的两个GPIO引脚,分别用于SCL和SDA,按照I2C规约的时序,像控制LED灯那样控制引脚输出,若是接收数据时则读取SDA线上的电平,那就可以实现I2C通信了,这也是我们在51单片机上的“软件模拟协议”做法。但是STM32上还配有I2C控制器片上外设,只要配置好该外设,它就可以依据规约产生通讯信号。收/发数据置于缓存寄存器中,cpu只要检测该外设的状态和数据寄存器就能完成数据收发。但是利 阅读详情

I²C通信

1.1简介

​ IIC(Inter-Integrated Circuit)总线是一种由NXP(原PHILIPS)公司开发的两线式串行总线,用于连接微控制器及其外围设备。多用于主控制器和从器件间的主从通信,在小数据量场合使用,传输距离短,任意时刻只能有一个主机等特性。

在 CPU 与被控 IC 之间、IC 与 IC 之间进行双向传送,高速 IIC 总线一般可达 400kbps 以上。

当总线上有多个主机同时启用总线时,IIC也具备冲突检测和仲裁的功能来防止错误产生。

1.2硬件层

在这里插入图片描述

IIC一共有且仅有两条总线: 一条是数据线SDA,一条是时钟线SCL。
注:IIC采用漏极开路即高阻状态,适用于输入/输出,其可独立输入/输出低电平和高阻状态,若需要产生高电平,则需使用外部上拉电阻

1.3通信

1.3.1总时序图

在这里插入图片描述
在这里插入图片描述

1.3.2起始信号

SCL保持高电平,SDA完成一个下降沿。

在这里插入图片描述

1.3.3传送地址码

SCL和SDA均为高电平表示逻辑1,SCL为高电平SDA为低电平表示逻辑0。

需要注意的是在每传送一个字节数据后,需要从机返回一个应答信号(SDA下降沿)。

在这里插入图片描述

1.3.3.1如何更改发送数据

拉低SCL,此时允许发送器更改SDA信号,更改结束重新拉高SCL信号。

1.3.4结束

SCL为高电平时SDA完成上升沿,这与起始信号相反。表示一次通信结束。

在这里插入图片描述

1.3.5收发数据

在这里插入图片描述

注:若两个设备之间已建立连接,想改变数据传送方向,可不发送停止信号而重新发送一次起始信号(即不交出总线的使用权)。
在这里插入图片描述

2、应用实例(与AT24C02结合)

#include <reg51.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char

unsigned char sec; //定义计数值,每过 1 秒,sec 加 1
unsigned int tcnt; //定时中断次数
bit write = 0; //写 24C08 的标志;
sbit sda = P2 ^ 0; 
sbit scl = P2 ^ 1; 
sbit dula = P2 ^ 6;
sbit wela = P2 ^ 7;
unsigned char j, k;

void delay(unsigned char i) { //延时程序
	for (j = i; j > 0; j--)
		for (k = 125; k > 0; k--);
}

uchar code table[] = {
	//数码管编码
	0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,
	0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71
};

void display(uchar bai_c, uchar sh_c) { 
	dula = 0;
	P0 = table[bai_c];
	dula = 1;
	dula = 0;
	wela = 0;
	P0 = 0x7e;
	wela = 1;
	wela = 0;
	delay(5);
	dula = 0;
	P0 = table[sh_c];
	dula = 1;
	dula = 0;
	wela = 0;
	P0 = 0x7d;
	wela = 1;
	wela = 0;
	delay(5);
}

/////////24C02 读写驱动程序////////////////////
void delay1(unsigned char x) { //延时子函数
	unsigned int i;
	for (i = 0; i < x; i++);
}

void flash() //延时子函数
{ ; ; }
void x24c08_init() { //24c02 初始化子程序
	scl = 1;
	flash();
	sda = 1;
	flash();
}
void start() { //启动 I2C 总线
	sda = 1;
	flash();
	scl = 1;
	flash();
	sda = 0;
	flash();
}
void stop() { //停止 I2C 总线
	sda = 0;
	flash();
	scl = 1;
	flash();
	sda = 1;
	flash();
}
void writex(unsigned char j) { //写一个字节
	unsigned char i, temp;
	temp = j;
	for (i = 0; i < 8; i++) {
		temp = temp << 1;
		scl = 0;
		flash();
		sda = CY;
		flash();
		scl = 1;
		flash();
	}
	scl = 0;//释放
	flash();//
	sda = 1;//为了读取应答信号(低电平)
	flash();//
}
unsigned char readx() { //读一个字节
	unsigned char i, j, k = 0;
	scl = 0;
	flash();
	sda = 1;//释放
    flash();
	for (i = 0; i < 8; i++) {
		scl = 1;//读总线
		flash();
        j = sda;
		k = (k << 1) | j;
		scl = 0;
        flash();
	}
	flash();
	return (k);
}
void clock() { //I2C 总线应答子函数
	uchar i = 0;
	scl = 1;//高电平可以读取信号
	flash();
	while ((sda == 1) && (i < 255))//没有收到应答信号
		i++;
	scl = 0;//第九个时钟拉低
	flash();
}
////////从 24c02 的地址 address 中读取一个字节数据/////
unsigned char x24c08_read(unsigned char address) {
	unsigned char i;
	start();
	writex(0xa0);//高四位1010 低三位000 最后一位为0
	clock();
	writex(address);//寄存器地址
	clock();
	start();
	writex(0xa1);//最后一位的1为读数据信号
	clock();
	i = readx();
	stop();
	delay1(10);
	return (i);
}
//////向 24c02 的 address 地址中写入一字节数据 info/////
void x24c08_write(unsigned char address, unsigned char info) {
	start();
	writex(0xa0);
	clock();
	writex(address);
	clock();
	writex(info);
	clock();
	stop();
}
void t0(void) interrupt 1 using 0 { //定时中断服务函数
	TH0 = (65536 - 50000) / 256; //0.5s
	TL0 = (65536 - 50000) % 256; 
	tcnt++; 
	if (tcnt == 20) { //计满 20 次(1 秒)时
		tcnt = 0; 
		sec++;//读秒
		write = 1; //1 秒写一次 24C02
		if (sec == 100) { //定时 100 秒,在从零开始计时
			sec = 0;
		}
	}
}
void main() { 
	unsigned char i;
	TMOD = 0x01; 
	ET0 = 1;
	EA = 1;
	x24c08_init(); 
	sec = x24c08_read(2); //读出保存的数据赋于 sec
	TH0 = (65536 - 50000) / 256; 
	TL0 = (65536 - 50000) % 256; 
	TR0 = 1; //启动定时器
	while (1) {
		i = 10;
		while (i--) {
			display(sec / 10, sec % 10);
		}
		if (write == 1) { //判断计时器是否计时一秒
			write = 0; //清零
			x24c08_write(2, sec); //在 24c02 的地址 2 中写入数据 sec
		}
	}
}
嵌入式笔记:常用接口之详解I2C总线 I2C (也称为 IIC) 是一种同步、多主、低速的串行通信协议,只需要两根线即可实现设备之间的数据传输,广泛应用于各种嵌入式设备中,这点在下文原理部分会进一步介绍。 阅读详情

相关推荐

Linux下的I2C通信

linux下的i2c通信。

zxz_Fine的博客 1916

【科普贴】I2C接口详解——偏硬件解析

一、 I2C接口简介 I2C最早是Philips公司开发的一款简单的双向总线,实现有效的IC控制。把这个总线写成Inter IC 简称IIC或I2C(PS:说白了2就是两个“I”的意思。) I2C总线一些特征: 1、 只有两根线分别是串行数据线(SDA),串行时钟线(SCL)。 2、 每个连接到总线的器件有唯一一个地址。 3、 总线中可以存在一个主机多个从机的模式,也存在多个主机的模式(实际应用非常少,本文不做累述)。 4、 使用串行8位双向数据传输方式。有标准模式(Standard mode)传输速度达1

zangqihu的博客 2万+

STM32——I2C通信

多用于主控制器和从器件间的主从通信,在小数据量场合使用,传输距离短,任意时刻只能有一个主机等特性。I2C是同步半双工的工作模式。

qq_67520019的博客 3256

I2C接口简介

主机是初始化总线的数据传输并产生允许传输的时钟信号的器件。常见的I2C总线依传输速率的不同而有不同的模式:标准模式(100Kbit/s)、低速模式(10Kbit/s),但时钟频率可被允许下降至零,这代表可以暂停通信。而新一代的I2C总线可以和更多的节点(支持10比特长度的地址空间)以更快的速率通信:快速模式(400Kbit/s)、高速模式(3.4Mbit/s)。2、 每个连接到总线的器件都可以通过唯一的地址和一直存在的简单的主机/从机关系软件设定地址,主机可以作为主机发送器或主机接收器;

大音希声 3869

通信协议 —— I2C不再模糊

在传输数据时,主设备会按照一定的节奏,也就是SCL时钟信号的节拍,把数据一位一位地放在SDA线上传给从设备,从设备则在每个时钟节拍去读取SDA线上的数据,就像一个人按照一定的节奏说话,另一个人按照这个节奏听和理解。总线上的每个从设备(最多可达128或112个)都有一个自己的“名字”,也就是从机地址,就像每个人都有自己的名字一样,主设备想要和某个从设备交流,就得先叫出这个从设备的名字,然后从设备听到自己的名字才会回应。主设备在发起通信时,首先要发送从设备的地址,以便在总线上唯一标识要与之通信的从设备。

改变自己现在能改变的,珍惜自己现在所拥有的 4489

【裸机开发】I2C 通信接口(一)—— I2C 通信时序协议及通信流程

【裸机开发】I2C 通信接口(一)—— I2C 通信时序协议及通信流程

challenglistic的博客 4539

【硬件接口】I2C总线接口

I2C总线是一种非常常用的总线,其多用于一个主机(或多个)与单个或多个从设备通讯的场景。下图1所示,表明了多种不同的外设可以共享这种只需要两根线便可以进行交互的总线上,相对于其他接口来说,这也是I2C总线可以提供的最大优势之一。图1展示了一个典型的用于嵌入式系统中的I2C总线,其上挂载了多种从设备。作为主机的微处理器可以通过I2C控制着IO拓展、不同传感器、EEPROM、多个ADC/多个DAC等。所有这些设备只需要通过来自主机的两根引脚来控制。图1:I2C总线示意图。

cgk123的博客 3053

树莓派学习-I2c通信

前言由于之前参加了学校的飞兆杯的比赛,题目是循迹小车,由于缺乏对于ldc1314芯片使用知识以及个人的能力原因,项目并没有做出来,但是还是学习了很多东西的。其中以树莓派的I2C通信为最。一、I2C简介I2C(Inter-Integrated Circuit)总线是由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。是微电子通信控制领域广泛采用的一种总线标准。它是同步通信的一种特殊

qq_38686298的博客 9116

I2C通信——I2C通信的理论介绍

以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除 。

主要记录嵌入式学习与开发过程。 1万+

I2C接口

I2C总线是一种简单的方法来连接多个芯片,特别是fpga / cpld。 I2C总线的特点但它是如何工作的一个I2C总线至少需要一个I2C主总线和一个I2C从总线。I2C主服务器是一个事务启动器(主服务器可以向从服务器写或从服务器读)。 I2C从站是一个事务接收端(从站可以向主站写入或从主站读取)。I2C波形这是它在公共汽车上的样子。 这是对地址为0x51的EEPROM的写操作,包含2个数据字节0x50和0x0F。 一个I2C事务以一个“开始”条件开始,后面是我们想要与之通信的设备地址,一个比特表示我们

小柚子的博客 2432

Zlib1.2.11源码编译(Win10+VS2019)

下载 下载网址: zlib Home Site 得到文件: 解压缩到“D:\SourceCodes\zlib-1.2.11” 使用CMake配置、生成并打开项目 将CMakeLists.txt拖入CMake,配置(Configure): 生成(Generate) 打开项目(Open Project),CMake调用VS2019打开项目 生成debug版本 构建项目ALL_BUILD。成功生成debug版本 在“D:\Sourc...

Alexabc3000的专栏 1893

I2C通信全面解析

1. 物理接口: SCL + SDA (1)SCL(serial clock):时钟线,传输CLK信号,一般是I2C主设备向从设备提供时钟的通道。 (2)SDA(serial data):数据线,通信数据都通过SDA线传输 2. 通信特征:串行、同步、非差分、低速率 (1)I2C属于串行通信,所有的数据以位为单位在SDA线上串行传输。 (2)同步通信就是通信双方工作在同一个时钟下,一般...

taotongning的博客 3万+

Pixel 5 Root, 安装Xposed框架, 解锁5G教程

Pixel 5 5G手机root 教程 前几天买的手机终于到货了,现在又开始折腾了,经过我的努力,现在已经拥有root权限了。

Ender_Zhao的博客 3万+

I2C通信协议详解和通信流程分析

1、I2C通信特征 1.1、物理接口:SCL + SDA 1.2、通信特征:串行、同步、非差分、低速率 1.3、通信模式:主设备+从设备 1.4、可以多个设备挂在一条总线上 1.5、主要用途 2、I2C控制器的结构框图 3、I2C控制器的模式 4、I2C的时序分析 4.1、时序介绍 4.2、通信起始条件和结束条件 4.3、数据有效性 4.4、响应ACK 4.5、I2C总线的三种状态 5、I2C总线的读/写数据操作 6、I2C的操作流程 6.1、主设备写数据 6.2、主设备读数据 7、I2C通信的主发送模式流

weixin_42031299的博客 6万+

Verilog基础知识11(异步FIFO为什么使用格雷码(gray-code) )

需求说明:Verilog设计 内容       :第一部分 异步FIFO为什么使用格雷码                   第二部分 格雷码在异步FIFO中的使用 来自       :时间的诗 第一部分 异步FIFO为什么使用格雷码 原文:http://www.cnblogs.com/kxk_kxk/p/3931591.html 异步FIFO通

时间的诗 8888

从7V到28V宽压输入,手把手教你设计一个5V/3A的DCDC电源模块(附MPS1584选型与原理图避坑)

本文详细解析了基于MPS1584芯片的7V至28V宽压输入到5V/3A输出的DCDC电源模块设计全流程。从电源架构选择、原理图设计要点到实际调试经验,涵盖了输入保护电路、功率转换核心电路及系统级优化测试,帮助工程师规避常见设计陷阱,实现高效稳定的电源解决方案。

weixin_33712987的博客 499

I2C 通信详解

对于指定设备(Slave Address),在指定地址(Reg Address)下,写入指定数据(Data)。对于指定设备(Slave Address),在指定地址(Reg Address)下,读取从机数据(Data),依次循环上述过程8次,即可接收一个字节(主机在接收之前,需要释放SDA)类似 123 木头人游戏。SCL 低电平期间,主机将数据位依次放到SDA线上。:SCL高电平期间,SDA从高电平切换到低电平。:SCL高电平期间,SDA从低电平切换到高电平。(主机在接收之前,需要释放SDA)

Outside_的博客 1万+

【暂时完结】Prescan学习笔记

Prescan学习记录1. Prescan基础知识1.1 Conventions·坐标1.2 Road segment·道路片段1.2.1 让一个路段连接其他两个路段1.2.2 配置车道线1.2.3 Road marking·道路标志1.3 Trajectory·轨迹1.3.1 建立一个Path·路径1.3.2 配置Speedprofile1.3.3 Synchronization of Trajectories·轨迹同步1.3.4 Multiple trajectories · 多轨迹分配 1. Pres

dreautumn的博客 1万+

什么是I2C通信

ARM体系-I2C通信 一、什么是I2C 1、I2C总线是由Philips公司开发的一种简单、双向二线制同步串行总线。它只需要两根线即可在连接于总线上的设备之间传送信息。 2、主设备用于启动总线传送数据,并产生时钟以开放传送的设备,此时任何被寻址的设备均被认为是从设备.总线上主设备和从设备、发数据设备和收数据设备的关系不是恒定的,而取决于此时数据传送方向。 3、如果主设备要发送数据给从设备,则主设备首先要寻址从设备,然后主动发送数据至从设备,最后由主设备终止数据传送;如果主设备要接收从设备的数据,首先由主设

weixin_46089486的博客 6646

西门子Simotion运动控制

SIMOTION

rjimhcd的博客 3024

【C#程序员入门AI】必知的一些知识

2026年C#调用AI,核心就4个概念+3种方式4个概念:大模型(大脑)、嵌入(数字密码)、向量(载体)、Agent(超级助理)3种方式:云端API(快)、本地模型(隐私)、混合部署(最佳)不用怕复杂,跟着这个思路走,你就能从“AI小白”变成“C# AI开发能手”,把AI集成到你的.NET项目里,提升效率、创造价值!

人工智能AI技术 410

I2C通信协议详细讲解

I2C协议讲解讲解流程我们为什么要学习I2C通信I2C协议简介:I2C物理层特点I2C协议层写数据读数据读和写数据通讯的起始和停止信号地址及数据方向 讲解流程 我们为什么要学习I2C通信 Stm32的最常用的板间通信有很多,有I2C、SPI、CAN;I2C通信协议是我们stm32板间通信比较常用的、也是比较简单的。话不多说,那么我们就去了解学习一下简单的I2C通信吧。 I2C协议简介: I2C 通讯协议(Inter-Integrated Circuit)是由 Phiilps 公司开发的,由于它引脚少,硬件实

Hello_STM32的博客 3万+

STM32实战开发(65):STM32摄像头图像采集开发教程

我们将会详细介绍如何使用STM32进行摄像头控制、图像数据采集以及如何将采集到的图像数据传输到其他设备进行处理。通过这篇博客,您将能够掌握STM32与摄像头模块的图像采集技术,应用于各种图像处理场景。为了确保STM32能够正确接收图像数据,我们需要配置STM32的GPIO引脚,并通过外部中断捕获这些信号。为了实现更高效的图像采集,可以通过DMA进行数据传输,将图像数据直接从GPIO引脚存储到内存中。通过DMA传输,我们可以将采集到的图像数据直接存储在内存中的一个缓冲区,然后进行后续的图像处理。

2201_76125393的博客 2540

通信协议篇——I2C通信

通信协议篇——I2C通信

Yongxiang的博客 5122

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

I2C 通信 I2C 通信第 1 部分 – Arduino 到 Arduino

在以后的文章中,我们将了解如何构建自己的 I2C 设备、如何使用 I2C 连接 Raspberry Pi 和 Arduino,以及如何进行一些高级 I2C 配置,包括在一条 I2C 总线上使用多个主设备。由于“闪光速率”是由时间延迟指定的,发送的数字越大,闪光速率就越长。我将向您展示的实验是使用两个 Arduino Unos 完成的,但您也可以使用其他型号的 Arduino,前提是相应地更改引脚。由于我们需要一次发送一个字节的数据,因此我们将“Hello”中的字符分成数组中的各个项目,然后将它们逐一发送。

sxstj的博客 3892

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

上一篇: 51单片机定时器中断
下一篇: 软件控制硬件电路
FuYu5228
博客等级 码龄4年 16粉丝 26原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值