产品概述

单片机i2c程序 单片机I2C通讯代码详解

小编 2024-11-24 产品概述 23 0

单片机I2C通讯代码详解

单片机I2C通讯代码详解

I2C协议标准代码

1. 起始信号&停止信号

起始信号:当 SCL 线是高电平时 SDA 线从高电平向低电平切换。

停止信号:当 SCL 线是高电平时 SDA 线由低电平向高电平切换。

2. 起始信号代码

void I2cstart() //起始信号

{

SDA=1;

Delay8us();

SCL=1;

Delay8us();

SDA=0;

Delay8us();

SCL=0;

Delay8us();

}

3. 停止信号代码

void I2cstop() //停止信号

{

SDA=0;

Delay8us();

SCL=1;

Delay8us();

SDA=1;

Delay8us();

}

4.发送一个字节

unsigned char I2cSendByte(unsigned char dat) //CPU向设备发送一个字节

{

unsigned char a=0,b=0;

for(a=0;a<8;a++)

{

SDA=dat>>7;

dat=dat<<1;

Delay8us();

SCL=1;

Delay8us();

SCL=0;

Delay8us();

}

SDA=1;

Delay8us();

SCL=1;

while(SDA) //等待设备应答

{

b++;

if(b>200)

{

SCL=0;

Delay8us();

return 0; //设备无应答,返回0,并跳出此程序

}

}

SCL=0;

Delay8us();

return 1; //设备有应答,返回1,并跳出此程序

}

5.读取一个字节

unsigned char I2cReadByte() //CPU向设备读取一个字节

{

unsigned char a=0,dat=0;

SDA=1;

Delay8us();

for(a=0;a<8;a++)

{

SCL=1;

Delay8us();

dat<<=1;

dat|=SDA;

Delay8us();

SCL=0;

Delay8us();

}

return dat; //返回dat,并跳出此程序

}

6. 向24C02地址addr,写数据dat

void At24c02Write(unsigned char addr,unsigned char dat) //向24C02地址addr,写数据dat

{

I2cstart(); //启动

I2cSendByte(0xa0); //发送24C02设备地址

I2cSendByte(addr); //发送24C02寄存器地址

I2cSendByte(dat); //发送数据

I2cstop(); //停止

}

7. 读取24C02寄存器addr中的数据

unsigned char At24c02Read(unsigned char addr) //读取24C02寄存器addr中的数据

{

unsigned char num;

I2cstart(); //开始

I2cSendByte(0xa0); //发送24C02设备地址-写

I2cSendByte(addr); //发送24C02寄存器地址

I2cstart(); //改变传输方式,重新开始

I2cSendByte(0xa1); //发送24C02设备地址-读

num=I2cReadByte(); //接收数据并保存至num

I2cstop(); //停止

return num; //返回读取值num

}

8.I2C写数据八个步骤

第一步,发送一个起始信号。

第二步,发送7bit从机地址,即24C02的地址。此处需要注意,发送数据时,无法发送7bit数据,此处发送了7bit地址+1bit读写选择位,即发送7bit+r/w。最低位为1表示读,为0表示写。

第三步,产生一个ACK应答信号,此应答信号为从机器件产生的应答。

第四步,发送寄存器地址,8bit数据。

第五步,产生一个ACK应答信号,此应答信号为从机器件产生的应答。

第六步,发送一个数据,8bit数据。

第七步,产生一个ACK应答信号,此应答信号为从机器件产生的应答信号。

第八步,发送一个停止信号。

9. I2C读数据十一个步骤

第一步,发送一个起始信号。

第二步,发送7bit从机地址,即24C02的地址。此处需要注意,发送数据时,无法发送7bit数据,此处发送了7bit地址+1bit读写选择位,即发送7bit+r/w。最低位为1表示读,为0表示写。

第三步,产生一个ACK应答信号,此应答信号为从机器件产生的应答。

第四步,发送寄存器地址。

第五步,产生一个ACK应答信号,此应答信号为从机器件产生的应答。

第六步,再次发送一个起始信号。

第七步,发送7bit从机地址,即24C02的地址。此处需要注意,发送数据时,无法发送7bit数据,此处发送了7bit地址+1bit读写选择位,即发送7bit+r/w。最低位为1表示读,为0表示写。

第八步,产生一个ACK应答信号,此应答信号为从机器件产生的应答。

第九步,读取一个字节(8bit)的数据。

第十步,产生一个ACK应答信号,此应答信号为CPU产生。

第十一步,产生一个停止信号。

I2C技术汇总,一文弄懂I2C,含下载资料

I2C基础资料:

点击蓝色链接可下载 《I2C总线规范》《I2C总线应用系统设计》等资料_可编程器件-面包板社区

资料:I2C 学习心得 资料:I2C 学习心得_可编程器件-面包板社区

I2C总线详解,概述+时序+C语言模拟(代码) 最新下载-电子技术资料下载中心-面包板社区

更多I2C下载资料:带你理解I2C总线数据传输方式_电子技术基础-面包板社区

I2C是inter-integrated circuit的缩写,又名为TWI,只需要用两条物理线进行传输,分别命名为SDA和SCL, 用于传输serial data和serial clock。I2C工作时分为主从工作模式,而在同总线上可以存在多个主机。每一个连接到总线的器件都可以通过唯一的地址与总线连接,主机控制主机为发送器模式或是接收器模式。多个主机控制时可以通过冲突检测和仲裁防止数据被破坏。I2C总线有几种不同速率的工作模式,标准模式的速率为100kbps,快速模式下速率为400kbps,在高速模式下速率可达到3.4Mbps。整理下I2C基本的传输方式。“I2C”的那些坑_嵌入式系统与MCU-面包板社区本文主要针对 i2c 设备,讲解如何解决 i2c 设备主机与从机直接无法正常数据交互的问题,侧重点是针对硬件设计不太合理、i2c 设备设计不标准导致总线故障的情况,并且通过分析现象,提出解决方案。

区分理解:

总结的很到位!一文讲透I2C和SPI总线协议_电子技术基础-面包板社区在数字通信协议簇中,IIC和SPI常称为“小”协议,相对Ethernet, USB, SATA, PCI-Express等传输速度达数百上千兆字节每秒的总线。但是,我们不能忘记的是各种总线的用途是什么。“大”协议是用于系统外的整个系统之间通信的,“小”协议是用于系统内各芯片间的通信,没有迹象表明“大”协议有必要取代“小”协议。IIC和SPI的存在和流行体现了“够用就好”的哲学。回应文首,IIC和SPI如此的流行,它是任何一位嵌入式工程师必备的工具。I2C与SMBus之间的技术差异_工业电子与自动化-面包板社区关于I2C与SMBus,许多人很少去谈论与了解两者的细节差异,包括很多国外的简报,文章也经常将两者混写、交杂描述、交替运用。确实,在一般运用下,I2C Bus与SMBus没有太大的差别,从实际接线上看也几乎无差异,甚至两者直接相连多半也能相安无误地正确互通并运作。不过若真要仔细探究,其实还是有诸多不同,如果电子设计工程师不能明辨两者的真实差异,那么在日后的开发设计的验证纠错阶段必然会产生困扰,为此本文将从各层面来说明I2CBus与SMBus的细微区别,期望能为各位带来些许帮助。SPI、I2C、UART、I2S、GPIO、SDIO、CAN,你能分清楚吗_模拟技术-面包板社区SPI和I2C总线协议心得_嵌入式系统与MCU-面包板社区

I2C协议的实现:

零基础学FPGA(十一)初入江湖之i2c通信-面包板社区I2C的verilog实现 I2C的verilog实现-面包板社区I2C详细注解_Verilog I2C详细注解_Verilog-面包板社区DSP28335 I2C外设的相关总结 【博客大赛】DSP28335 I2C外设的相关总结【DSP】-面包板社区

STM32 I2C 难点 STM32 I2C 难点---这个不错,留着慢慢研究-面包板社区STM32的I2C协议操作 【博客大赛】STM32的I2C协议操作-面包板社区STM32’s I2C 硬件BUG引发的血案 STM32’s I2C 硬件BUG引发的血案(转来的资料)-面包板社区STM32学习笔记之I2C深入探究 【博客大赛】STM32学习笔记之I2C深入探究-面包板社区STM32 硬件I2C总结 STM32 硬件I2C总结-面包板社区51的I2C协议操作 【博客大赛】51的I2C协议操作-面包板社区嵌入式开发中的I2C协议 嵌入式开发中的i2c协议_嵌入式系统与MCU-面包板社区I2C总线与24C02存储器的测试源代码程序 【原创】I2C总线与24C02存储器的测试源代码程序(一)-面包板社区I2C相关知识及GPIO模拟I2C I2C相关知识及GPIO模拟I2C-面包板社区在C2000上使用GPIO模拟I2C通信 在C2000上使用GPIO模拟I2C通信_嵌入式系统与MCU-面包板社区I2C在MSP MCU上的应用,说的很透彻很详细 I2C在MSP MCU上的应用,说的很透彻很详细_嵌入式系统与MCU-面包板社区单片机模拟I2C总线及AT24C01应用实例 单片机模拟I2C总线及AT24C01应用实例-面包板社区Arduino之:深入浅出I2C通信 【转】I2C通信-面包板社区五分钟搞定Arduino I2C LCD Display 五分鐘搞定Arduino I2C LCD Display-面包板社区

相关问答

51 单片机I2C 总线读一个字节if(SDA==1)retc=retc+1;是什么意思?

上面2个函数看起来像是用IO模拟I2C接口的例子,如果有现成的I2C接口,那么这些事情都是由CPU的I2Ccore实现的,也就是硬件实现的。如果需要IO模拟,那么就需要...

labview的 程序 怎样刷入 单片机 ?

方法一找个仪器(示波器,daq)读电平时序自己解析,方法二找个i2c的转换芯片转串口或usb或者芯片提供dll,方法三搞个单片机自己写下位机解析时序再用串口传到电...

单片机 、光耦

1系统总体结构原理粮食在储藏期间,由于受环境、气候和通风条件等因素的变化,粮仓内温度或湿度会发生异常,这极易造成粮食的霉烂、或发生虫害。那么...

单片机 新唐下面求注释.void I2C _Ctrl(uint8_tstart,uint8_tst...

[最佳回答]#define__IOvolatilevolatile的英语原意思是“易变”的,用来修饰变量,表示这个变量是要时时从内存中读取的,避免编译器做程序优化的时候,从寄存...

如何解决 I2C 器件死锁的问题?

正常情况下,I2C总线协议能够保证总线正常的读写操作。但是在某些异常情况下会导致I2C总线锁死。例如主控制器突然复位、或者I2C总线上存在干扰、或者电源异常...

一根 I2C 总线怎么同时连接2个温度传感器?

温度传感器一般输出是模拟信号,要输入到单片机就需要经过模数(ad)转换,可以考虑加ad转换芯片,当然有些单片机本身是有模拟输入口的,由内部进行ad转换。也有...

单片机 能否通过总线通讯控制多个传感器?

回答如下:是的,单片机可以通过总线通讯控制多个传感器。单片机通常具有多个通信接口,如I2C、SPI、UART等,可以通过这些接口与传感器进行通信。传感器可以通过...

低成本 单片机 中,怎样用更少的IO实现更多的按键?会不稳定吗?

低成本单片机中,怎样用更少的IO实现更多的按键有很多方法的可以用AD检测法,行列矩阵扫描法,各有各的好处。适用于不同的场合。AD检测法如果你的单片机有ADC...

单片机 一个IO口如何控制两颗发光二极管(LED)?

单片机的一个GPIO只能输出0和1两种状态,如果控制一个LED灯的话,可以实现LED的亮灭控制。两个LED具有四个状态:1)同时亮;2)同时灭;3)一个亮一个灭;4)一个灭...单...

PIC中 I2C 通信从模式和主模式分别指什么意思?

早期的PIC单片机,没有I2C的硬件模块支持,要完成I2C的通信,必须通过两根普通I/O线,完全用软件来模拟。既然是软件模拟,自然是可以模拟成主机运行,也可以模拟...

猜你喜欢