单片机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线,完全用软件来模拟。既然是软件模拟,自然是可以模拟成主机运行,也可以模拟...