I2C之AT24C04总结
AT24C04的原理与应用
4.2 I2C器件AT24C04的原理与应用I2C(Inter-Integrated Circuit)总线是一种由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。
I2C总线产生于上世纪80年代,最初为音频和视频设备开发,如今主要在服务器管理中使用,其中包括单个组件状态的通信。
I2C总线最主要的优点是其简单性和有效性。
由于接口直接在组件之上,因此I2C 总线占用的空间非常小,减少了电路板的空间和芯片管脚的数量,降低了互联成本。
总线的长度可高达25英尺,并且能够以10Kbps的最大传输速率支持40个组件。
I2C总线的另一个优点是,它支持多主控(multimastering),其中任何能够进行发送和接收的设备都可以成为主总线。
一个主控能够控制信号的传输和时钟频率。
当然,在任何时间点上只能有一个主控。
4.2.21 I2C总线的构成和信号类型一、I2C总线的构成I2C总线是由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据。
在CPU 与被控IC之间、IC与IC之间进行双向传送,最高传送速率100kbps,采用7位寻址,但是由于数据传输速率和应用功能的迅速增加,I2C总线也增强为快速模式(400Kbits/s)和10位寻址以满足更高速度和更大寻址空间的需求。
各种被控制电路均并联在这条总线上,但就像电话机一样只有拨通各自的号码才能工作,所以每个电路和模块都有唯一的地址。
在信息的传输过程中,I2C总线上并接的每一模块电路既是主控器(或被控器),又是发送器(或接收器),这取决于它所要完成的功能。
CPU发出的控制信号分为地址码和控制量两部分,地址码用来选址,即接通需要控制的电路,确定控制的种类;控制量决定该调整的类别(如对比度、亮度等)及需要调整的量。
这样,各控制电路虽然挂在同一条总线上,却彼此独立,互不相关。
二、I2C总线的信号类型I2C总线在传送数据过程中共有三种类型信号,它们分别是:起始信号、终止信号和应答信号。
AT24系列的读写注意事项
AT24系列的读写注意事项AT24系列的读写注意事项所看过的对24系列I2C读写时序描述最准确最容易理解的资料,尤其是关于主从器件的应答描述和页写描述,看完后明白了很多。
关于页写的描述,网络上绝大部分范程都没提到页写时的数据地址必须是每页的首地址才能准确写入,而且如果写入超过一页的数据会循环覆盖当前页的数据。
关于IIC总线I2C总线:i2c总线是Philips 公司首先推出的一种两线制串行传输总线。
它由一根数据线(SDA)和一根时钟线(SDL)组成。
i2c总线的数据传输过程如图3所示,基本过程为:1、主机发出开始信号。
2、主机接着送出1字节的从机地址信息,其中最低位为读写控制码(1为读、0为写),高7位为从机器件地址代码。
3、从机发出认可信号。
4、主机开始发送信息,每发完一字节后,从机发出认可信号给主机。
5、主机发出停止信号。
I2C总线上各信号的具体说明:开始信号:在时钟线(SCL)为高电平其间,数据线(SDA)由高变低,将产生一个开始信号。
停止信号:在时钟线(SCL)为高电平其间,数据线(SDA)由低变高,将产生一个停止信号。
应答信号:既认可信号,主机写从机时每写完一字节,如果正确从机将在下一个时钟周期将数据线(SDA)拉低,以告诉主机操作有效。
在主机读从机时正确读完一字节后,主机在下一个时钟周期同样也要将数据线(SDA)拉低,发出认可信号,告诉从机所发数据已经收妥。
(注:读从机时主机在最后1字节数据接收完以后不发应答,直接发停止信号)。
注意:在I2C通信过程中,所有的数据改变都必须在时钟线SCL 为低电平时改变,在时钟线SCL为高电平时必须保持数据SDA信号的稳定,任何在时钟线为高电平时数据线上的电平改变都被认为是起始或停止信号。
作为一种非易失性存储器(NVM),24系列EEPROM使用的很普遍,一般作为数据量不太大的数据存储器。
下面总结一下其应用的一些要点。
从命名上看,24CXX中XX的单位是kbit,如24C08,其存储容量为8k bit,即1k Byte=1024 Byte。
I2C操作时序问题总结(内附大量实用代码和详解)
I2C 总线在单片机操作中用到的很多。
特别是以I2C总线进行数据和命令传输的器件,比如AT24C02存储芯片等。
特此做了相关操作过程中经常用到的操作和一些操作的解释。
相信看完之后,肯定会对I2C总线有深刻的理解。
I2C总线操作(从高位开始进行读写操作)写操作时序启动之后先进行一个字节的指令写入操作,然后进行应答;在进行字节数据的传送;然后再进行应答;I2C读操作时序基本上与写操作相同,不同的是读操作只需进行指令的写入,不写数据(应该不绝对),最后主机产生非应答信号,结束数据的读取;在对E2PROM(24C02)进行操作时,写入写操作指令后,然后写入需要操作的存储器地址号,最后写入数据。
且每个存储器地址只能赋值一次,重复对该存储器地址赋值会使前一个数据丢失。
读操作过程中需对将指令改写为读指令,在读取数据时需要写入指令指明需要读出数据时的存储器地址号下面是对24C02的写操作和读操作void write_add(uchar address,uchar date){start();write_byte(0xa0); //写指令respons();write_byte(address); //写入要操作的存储器地址respons();write_byte(date); //写入存储器数据respons();stop();}uchar read_add(uchar address){uchar date;start();write_byte(0xa0); //写入指令respons();write_byte(address); //写入读取操作时,要读取的存储器地址respons();stop();start();write_byte(0xa1); //写入指令,进行读操作respons();date=read_byte(); //进行读取数据norespons();stop();return date;}void main(){init();write_add(23,0xcc); //写入存储器地址号为23中,数据为0xcc delay1(100);P1=read_add(23); //读入存储器地址号为23中的数据,并将数据赋值给P1口,通过数码管显示while(1); //停留在此处}I2C串行总线的操作程序起始信号(时钟线为高,数据线由高变低):void AT24C04_Start(){SDA = 1; //拉高数据线 SCL = 1; //拉高时钟线 Delay5us(); //延时SDA = 0; //产生下降沿 Delay5us(); //延时SCL = 0; //拉低时钟线}结束信号:(时钟线为高,数据线由低变高)void AT24C04_Stop(){SDA = 0; //拉低数据线 SCL = 1; //拉高时钟线 Delay5us(); //延时SDA = 1; //产生上升沿 Delay5us(); //延时}字节传输:(每个字节为8位,一个字节带一个相应位)发送数据:void AT24C04_SendByte(BYTE dat){BYTE i;for (i=0; i<8; i++) //8位计数器{dat <<= 1; //移出数据的最高位SDA = CY; //送数据口SCL = 1; //拉高时钟线Delay5us(); //延时SCL = 0; //拉低时钟线,以便下一次传送数据 Delay5us(); //延时}AT24C04_RecvACK();}接收数据:BYTE AT24C04_RecvByte(){BYTE i;BYTE dat = 0;SDA = 1; //使能内部上拉,准备读取数据for (i=0; i<8; i++) //8位计数器{dat <<= 1;SCL = 1; //拉高时钟线Delay5us(); //延时dat |= SDA; //读数据SCL = 0; //拉低时钟线以便下一个数据传送 Delay5us(); //延时}return dat;数据响应:每次数据传输成功后,接收器件发送一个应答信号,当第九个信号产生时,产生应答信号的器件将SDA拉低。
IIC 重点详解 个人总结
单片机的重点知识1<IIC协议>:1、IIC协议说明:I2C总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化。
AT24C02的芯片地址如下图,1010为固定,A0,A1,A2正好与芯片的1,2,3引角对应,为当前电路中的地址选择线,三根线可选择8个芯片同时连接在电路中,当要与哪个芯片通信时传送相应的地址即可与该芯片建立连接,我所使用的实验板上三根地址线都为0。
最后一位R/W为告诉从机下一字节数据是要读还是写,0为写入,1为读出。
AT24C02的芯片地址(0xa0为写,0xa1为读)任一地址写入格式任一地址读取数据格式2、程序详解IO口模拟IIC:起始和终止信号:SCL线为高电平期间,SDA线由高电平向低电平的变化表示起始信号;SCL线为高电平期间,SDA线由低电平向高电平的变化表示终止信号。
void start()//起始信号{SDA=1;Delay_us(10);SCL=1;Delay_us(10);SDA=0;Delay_us(10);Void stop()//终止信号{SDA=0;Delay_us(10);SCL=1;Delay_us(10);SDA=1;Delay_us(10);}数据传送格式(1)字节传送与应答每一个字节必须保证是8位长度。
数据传送时,先传送最高位(MSB),每一个被传送的字节后面都必须跟随一位应答位(即一帧共有9位)。
如果一段时间内没有收到从机的应答信号,则自动认为从机已正确接收到数据。
Void ack()//应答信号{uchar i;SCL=1;Delay_us(10);While((SDA==1)&&(i==250)) i++;//如果SDA=0则表示已经应答或者等待一会,就默认已经应答SCL=0;Delay();}Void noack()//非应答信号{SDA=1;Delay();SCL=1;Delay();//SCL有变化时,SDA保持不变,即非应答SCL=0;Delay();}void init()//初始化信号{scl=1;sda=1;}/////////////////////写一个字节//////////////////////void iicwr_byte(uchar dat){uchar i;scl=0; //只有在时钟线上的信号为低电平时,数据线上的高电平或低电平才允许变化(补:时钟线为高电平时,才能进行读写) delay();for(i=0;i<8;i++)//每一个字节,必须保持8位的数据长度{if(dat&0x80)//数据传送时,先传送最高位MSB{sda=1;}else{sda=0;}dat=dat<<1;//左移delay();scl=1; //时钟线为高电平时,才能进行读写delay();scl=0; //进行数据读写时,拉低时钟线,以保持数据稳定,有效delay();}sda=1; //每传送完一位就将数据线释放,以便下一位数据的传送;delay();}//////////////////////读一个字节////////////////////// uchar iicre_byte(){uchar i,dat;scl=0;delay();sda=1; //数据线释放delay();for(i=0;i<8;i++){scl=1; //时钟线为高电平时,才能进行读写delay();dat=dat<<1;//判断8次,移位7次if(sda==1){dat++;//自增,个位加1}scl=0;//拉低时钟线,以保证数据的稳定,和读出数据的正确性 delay();}return dat;}//////////////////////写操作/////////////////////void write_byte(uchar address,uchar dat)//指定地址写一个字节数据{init(); //初始化start();iicwr_byte(0xa0);//写器件地址(a是地址固定部分(1010),0的前三位是选择位,第四位0为写;若第四位为1,则是读;)ack();iicwr_byte(address);//写器件内部存储器地址ack();iicwr_byte(dat);//数据ack();stop();}//////////////////////读操作////////////////////uchar read_byte(uchar address) //指定地址读一个字节数据{uchar dat;start();iicwr_byte(0xa0);ack();iicwr_byte(address);ack();start();iicwr_byte(0xa1);//读ack();dat=iicre_byte();//读出的给datstop();return dat;}写好以下的几个函数:void start();//起始信号Void stop();//终止信号Void ack(); //应答信号Void noack();//非应答信号void init(); //初始化信号void iicwr_byte(uchar dat);//写一个字节uchar iicre_byte(); //读一个字节void write_byte(uchar address,uchar dat);//写操作uchar read_byte(uchar address); //读操作就距离成功使用IIC协议就行数据传输,只剩一步之遥了。
I2C之AT24C04总结
I2C之AT24C04总结济南职业学院电子工程系朱志强1、AT24C04介绍2、AT24C04之准备工作3、AT24C04之小试牛刀4、对应源程序2010年7月28日1、AT24C04介绍关于I2C的介绍,这里就不用说了,直接介绍24C04了。
24C04是4K位串行CMOS E2PROM。
引脚的认识:SCL 串行时钟引脚SDA 串行数据/地址A0、A1、A2 器件地址输入端WP 写保护(WP 管脚连接到Vcc,所有的内容都被写保护(只能读)。
当WP 管脚连接到Vss 或悬空,允许器件进行正常的读/写操作。
)2、AT24C04之准备工作首先,我们先查看一下实验板上面的接线图。
如图1所示。
图1 24c04连接图我们要注意的第一点是器件地址全部是0,即接地处理。
第二点是读写保护WP接地,意味着我们可以随意存取。
第三点是我们要用到的引脚连接到了P3^6和P3^7上。
在这里还要提醒一下,就是引脚上一定要有上拉电阻!阻值在470~1k 都可以的,具体的数值可以参考相关的手册。
在程序里我们需要先做以下定义:sbit AT24C04_SCL=P3^7;sbit AT24C04_SDA=P3^6;在写这个程序的时候,要使用到键盘,不用太多按键,我们暂时只用四个。
把实验板上面的跳线JP8接到“-”端上,使第一行的按键变为独立键盘就可以了。
线路图如图2所示。
图2 键盘部分电路图键盘这部分我就不说了吧,直接附上我用到的这部分程序,在我的程序中,并没有判断按键是否松开,而是使用的延时,这样的好处是一直按着按键,数据会一直在变化,要不然,频繁的按真的很累人。
转到按键程序对于里面用到的延时函数,一个是US级延时函数,一个是ms级延时函数,分别调用一下是延时2us和1ms。
对于显示部分吧,使用的就是LCD1602显示了。
这部分程序参见这里。
显示程序说完了这些,准备的就差不多了,我们可以对着PDF写AT24C04程序了。
3、AT24C04之小试牛刀我们打破PDF中的介绍顺序,按照实际写程序时的顺序分开分析。
单片机学习项目 (11) I2C总线器件AT24C04及其应用
单片机学习项目项目11-I2C总线器件AT24C04及其应用一:电路原理电路在LED流水灯电路基础上设计,单片机的P2.6连接AT24C04的SDA端口,P3.7连接SCL,为保证数据传输正确,端口接上拉电阻。
电路见5-8所示。
二:程序设计主程序调用AT24C04子程序,在程序运行之前,需对AT24C04初始化。
程序清单如下:/*预处理*/#include<reg51.h>#include”AT24C04.c” //主程序包含AT24C04子程序/*延时函数*/void delay(unsigned int x){while(x--);}/*主函数*/void main(void){init_24c04();while(1){write_add_dat_24c04(1,0x0f); //地址1保存数据0x0fdelay(300);write_add_dat_24c04(2,0xf0); //地址2保存数据0xf0delay(300);P0 = read_add_dat_24c04(1); //读地址1保存数据0x0f,并在P0口显示 delay(50000);P0 = read_add_dat_24c04(2); //读地址2保存数据0xf0,并在P0口显示 delay(50000);}}/*结束*/三、24C04驱动#include<intrins.h>#define uchar unsigned char#define nop _nop_()sbit sda = P1^7;sbit scl = P1^1;/*I2C总线启动*/void start_24c04(void){sda = 1;nop;scl = 1;nop;sda = 0;nop;scl = 0;}/*I2C总线停止*/void stop_24c04(void){sda = 0;nop;scl = 1;nop;sda = 1;nop;}/*应答程序*/void ack_24c04(void){uchar i = 255;scl = 1;nop;while(sda && i--);scl = 0;nop;}/*I2C总线初始化*/void init_24c04(void)//该函数可以省去{sda = 1;nop;//常态scl = 0;nop;//常态}/*读取一个字节*/uchar read_onebyte_24c04(void){uchar i,dat;sda = 1; // 释放总线for(i = 0;i < 8;i++){scl = 1;dat = dat << 1;if(sda)dat = dat | 0x01;//先读取数据的高位,放到dat的低位 scl = 0;}sda = 1;scl = 0;return(dat);}/*写入一个字节*/void write_onebyte_24c04(uchar dat){uchar i;for(i = 0;i < 8;i++){sda = (bit)(dat & 0x80);//先发送数据的高位dat = dat << 1;scl = 1;scl = 0;}sda = 1;scl = 0;}/*对某个地址写一个字节的数据*/void write_add_dat_24c04(uchar add,uchar dat){start_24c04();write_onebyte_24c04(0xa0);ack_24c04();write_onebyte_24c04(add);ack_24c04();write_onebyte_24c04(dat);ack_24c04();stop_24c04();}/*读取某个地址一个字节的数据*/uchar read_add_dat_24c04(uchar add){uchar dat;start_24c04();write_onebyte_24c04(0xa0);ack_24c04();write_onebyte_24c04(add);ack_24c04();start_24c04();write_onebyte_24c04(0xa1);ack_24c04();dat = read_onebyte_24c04();stop_24c04();return(dat);}/*结束*/四、仿真运行本例程序Proteus仿真结果见图5-9所示,图中LED连接采用网络标号。
EEPROM---AT24Cxx应用介绍
EEPROM---AT24Cxx应⽤介绍结论:1、读写AT24CXX芯⽚,根据容量有多种⽅式:⼀、容量为AT24C01~AT24C16,⾸先发送设备地址(8位地址),再发送数据地址(8位地址),再发送或者接受数据。
⼆、AT24C32/AT24C64~AT24C512,⾸先发送设备地址(8位地址),再发送⾼位数据地址,再发送地位数据地址,再发送或者接受数据。
三、容量AT24C1024的芯⽚,是把容量⼀和容量⼆的⽅法结合,设备地址中要⽤⼀位作为数据地址位,存储地址长度是17位。
2、它的设备地址根据容量不同有区别: 1)、AT24C01~AT24C16:这⼀类⼜分为两类,分别为AT24C01/AT24C02和AT24C04~AT24C16;他们的设备地址为⾼7位,低1位⽤来作为读写标⽰位,1为读,0为写。
*1*、AT24C01/AT24C02。
AT24C01/AT24C02的A0、A1、A2引脚作为7位设备地址的低三位,⾼4为固定为1010B,低三位A0、A1、A2确定了AT24CXX的设备地址,所以⼀根I2C线上最⼤可以接8个AT24CXX,地址为1010000B~1010111B。
*2*、AT24C04~AT24C16的 A0、A1、A2只使⽤⼀部分,不⽤的悬空或者接地(数据⼿册中写的是悬空不接)。
举例:AT24C04只⽤A2、A1引脚作为设备地址,另外⼀位A0不⽤悬空,发送地址中对应的这位(A0)⽤来写⼊页寻址的页⾯号,⼀根I2C线上最⼤可以接4个,地址为101000xB~101011xB 2)、AT24C32/AT24C64:和AT24C01/AT24C02⼀样,区别是,发送数据地址变成16位。
注意事项:对AT24C32来说,WP置⾼,则只有四分之⼀受保护,即0x0C00-0x0FFF。
也就是说保护区为1KBytes。
对于低地址的四分之三,则不保护。
所以,如果数据较多时,可以有选择地存储。
EEPROM I2C操作说明知识讲解
E E P R O M I2C操作说明I2C协议2条双向串行线,一条数据线SDA,一条时钟线SCL。
SDA传输数据是大端传输,每次传输8bit,即一字节。
支持多主控(multimastering),任何时间点只能有一个主控。
总线上每个设备都有自己的一个addr,共7个bit,广播地址全0.系统中可能有多个同种芯片,为此addr分为固定部分和可编程部份,细节视芯片而定,看datasheet。
1.1 I2C位传输数据传输:SCL为高电平时,SDA线若保持稳定,那么SDA上是在传输数据bit;若SDA发生跳变,则用来表示一个会话的开始或结束(后面讲)数据改变:SCL为低电平时,SDA线才能改变传输的bit1.2 I2C开始和结束信号开始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。
结束信号:SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。
1.3 I2C应答信号Master每发送完8bit数据后等待Slave的ACK。
即在第9个clock,若从IC发ACK,SDA会被拉低。
若没有ACK,SDA会被置高,这会引起Master发生RESTART或STOP流程,如下所示:1.4 I2C写流程写寄存器的标准流程为:1. Master发起START2. Master发送I2C addr(7bit)和w操作0(1bit),等待ACK3. Slave发送ACK4. Master发送reg addr(8bit),等待ACK5. Slave发送ACK6. Master发送data(8bit),即要写入寄存器中的数据,等待ACK7. Slave发送ACK8. 第6步和第7步可以重复多次,即顺序写多个寄存器9. Master发起STOP写一个寄存器写多个寄存器1.5 I2C读流程读寄存器的标准流程为:1. Master发送I2C addr(7bit)和w操作1(1bit),等待ACK2. Slave发送ACK3. Master发送reg addr(8bit),等待ACK4. Slave发送ACK5. Master发起START6. Master发送I2C addr(7bit)和r操作1(1bit),等待ACK7. Slave发送ACK8. Slave发送data(8bit),即寄存器里的值9. Master发送ACK10. 第8步和第9步可以重复多次,即顺序读多个寄存器读一个寄存器读多个寄存器1.前言对于大多数工程师而言,I2C永远是一个头疼的问题。
第二节-I2C器件AT24C04的原理与应用
I2C总线的传输协议与数据传送 4.2.3 I2C总线的传输协议与数据传送
I2C规程运用主/从双向通讯。 I2C规程运用主/从双向通讯。器件发送数据 规程运用主 到总线上,则定义为发送器, 到总线上,则定义为发送器,器件接收数据则定 义为接收器。 义为接收器。主器件和从器件都可以工作于接收 和发送状态。总线必须由主器件( 和发送状态。总线必须由主器件(通常为微控制 控制,主器件产生串行时钟(SCL) 器)控制,主器件产生串行时钟(SCL)控制总 线的传输方向,并产生起始和停止条件。SDA线 线的传输方向,并产生起始和停止条件。SDA线 上的数据状态仅在SCL为低电平的期间才能改变, SCL为低电平的期间才能改变 上的数据状态仅在SCL为低电平的期间才能改变, SCL为高电平的期间 SDA状态的改变被用来表示 为高电平的期间, SCL为高电平的期间,SDA状态的改变被用来表示 起始和停止条件。如下图4 起始和停止条件。如下图4-2-5所示
图4-2-5 串行总线上的数据传送顺序
一、控制字节 在起始条件之后,必须是从器件的控制字节, 在起始条件之后,必须是从器件的控制字节,其 中高四位为器件类型识别符( 中高四位为器件类型识别符(不同的芯片类型有 不同的定义,EEPROM一般应为1010), 一般应为1010),接着三位 不同的定义,EEPROM一般应为1010),接着三位 为片选,最后一位为读写位,当为1时为读操作, 为片选,最后一位为读写位,当为1时为读操作, 时为写操作。从器件的控制字节如下图4 为0时为写操作。从器件的控制字节如下图4-2-6 所示
图3-2-7 顺序读时序图
主机可以采用不带I2C总线接口的单片机, 主机可以采用不带I2C总线接口的单片机,如 I2C总线接口的单片机 AT89C51、AT89C2051等单片机 等单片机, AT89C51、AT89C2051等单片机,利用软件实现 I2C总线的数据传送 总线的数据传送, I2C总线的数据传送,即软件与硬件结合的信号 模拟。 模拟。 一、典型信号模拟时序图 为了保证数据传送的可靠性,标准的I2C I2C总 为了保证数据传送的可靠性,标准的I2C总 线的数据传送有严格的时序要求。I2C总线的起 线的数据传送有严格的时序要求。I2C总线的起 始信号、终止信号、发送“ 及发送“ 始信号、终止信号、发送“0”及发送“1”的模 拟时序如下图4 所示: 拟时序如下图4-2-8所示:
AT24Cxx系列EEPROM应用笔记
4.1.开始 START CONDITION
主器件通过发送一个起始信号启动发送过程。这个信号的时序要求是当 SCL 为高时,SDA 出现一个由低到高的跳变。时序图如下(图 3)。
图 4 开始时序
4.2.应答信号 ACKNOWLEDGE
I²C 总线数据传送时,每成功地传送一个字节数据后,接收器都必须产生一个应答信号。 应答的器件在第 9 个时钟周期时将 SDA 线拉低(发送一个 0),表示其已收到一个 8 位数据。 AT24Cxx 在接收到起始信号和从器件地址之后响应一个应答信号,如果器件已选择了写操作, 则在每接收一个 8 位字节之后响应一个应答信号。
-6-
PDF 文件使用 "pdfFactory Pro" 试用版本创建
7. 读操作
AT24Cxx 系列 EEPROM 应用笔记
对 AT24Cxx 读操作的初始化方式和写操作时一样,仅把 R/W 位置为 1,有三种不同的读操 作方式:读当前地址内容、读随机地址内容、读顺序地址内容。
AT24Cxx 系列 EEPROM 是由美国 Mcrochip 公司出品,1-512K 位的支持 I2C 总线数据传送 协议的串行 CMOS E2PROM,可用电擦除,可编程自定时写周期(包括自动擦除时间不超过 10ms, 典型时间为 5ms)的。串行 E2PROM 一般具有两种写入方式,一种是字节写入方式,还有另一 种页写入方式。允许在一个写周期内同时对 1 个字节到一页的若干字节的编程写入,1 页的大小 取决于芯片内页寄存器的大小。其中,AT24C01 具有 8 字节数据的页面写能力,AT24C02/04/08/16 具有 16 字节数据的页面写能力,AT24C32/64 具有 32 字节数据的页面写能力。
AT24C04中文资料
Maplead MCU Development Board24. AT24C04 芯片的 I2C 总线读写4K(512×8)AT24C04 E2PEOMAT24C04 是 ATMEL 公司生产的 4K bit(512Bytes)E2PROM 芯片,该芯片 采用 I2C 总线设计,主要性能指标与 AT24C02 类似,不同点为: 容量为 AT24C02 的两倍,分为两部分存储空间,每部分 256bytes。
有 2 个器件地址选择脚,一个 I2C 总线最多能够挂接 4 个 AT24C04 器件。
32 页,每页 16 字节,每次可连续写入 16 字节数据。
WP 引脚为高电平时,AT24C04 的 0~255 地址空间的数据被写保护。
需要 9 位的地址进行数据寻址。
AT24C04 的引脚定义图 24-1 AT24C02 引脚定义 表 24-1 AT24C02 引脚定义引脚定义 1. A0 2. A1,A2 3. GND 4. SDA 5. SCL 6. WP 7. VCC 空引脚。
器件地址设定引脚。
电源地。
数据口。
同步时钟口。
写保护口。
电源。
说明A0 为空引脚,A1,A2 口为器件地址设定口,通过 A1,A2 口来设定 AT24C04 的器件地址 WP 口接低电平时,可以对整个 AT24C04 器件的 512 个字节进行读写操作。
当 WP 口接高电平后,器件前 256 个地址的数据被保护,只能读,不可写入,后 256 个字节数据可进行读写操作。
172Maplead MCU Development BoardAT24C04 的从器件寻址图 24-2 AT24C04 的器件及数据空间地址 AT24C04 的器件地址由两个引脚决定,分别为 A1,A2 引脚。
AT24C04 的数据空间由 P0 位决定,如图 24-2 所示,当 P0 为“0”时,将对 AT24C04 的 0~255 空间的数据进行操作;当当 P0 为“1”时,将对 AT24C04 的 256~511 空间的数据进行操作。
AT24Cxx芯片读写--IIC总线
AT24Cxx芯片读写--IIC总线AT24Cxx芯⽚读写--IIC总线型号容量器件寻址字节(8位) ⽚次装载字节数AT24C01 128×8 1010A2A1A0 R/W 8AT24C02 256×8 1010A2A1A0 R/W 8AT24C04 512×8 1010A2A1P0 R/W 16AT24C08 1024×8 1010A2P1P0 R/W 16AT24C16 2048×8 1010P2P1P0 R/W 16AT24C32 4096*8 1010A2A1A0 R/W 32AT24C64 8192*8 1010A2A1A0 R/W 32AT24C128 16384*8 1010A2A1A0 R/W 64AT24C256 16384*8 1010A2A1A0 R/W 64AT24C系列 E2PROM接⽚及地址选择设备地址:24xx系列的可以通过修改外的地址引脚来设置不同的地址.IIC地址的确定,AT24C系列的,24c01,02 1K/2K EEPROM 在⽚条IIC总线上可以挂8个,地址由A2,A1,A0确定;24C04 4k EEPROM 只有A2,A1的做地址位,这样⽚条IIC总线上能挂4个设备,A0是⽚来确定内部页地址的,A0在芯⽚上没有线连接的(NA); 24C08, 8k EEPROM 使⽚A2来确定地址线,A1,A0位是在确定内部页地址的,⽚条IIC总线能扩展2⽚; 24C16 16k,A2A1A0都是确定内部页地址的;⽚条总线上只能挂1个⽚个这样的设备.但在AT24C32 ,24C64中⽚有改变,32,64中发送的内部地址都是发2次,⽚地址和低地址,这样有16位地址位可以确定内部地址,就不需要⽚A2A1A0来确定地址了.控制器的读写时序AT24C01---AT24C16读: 发设备地址---> 送8位地址---->发设备地址--->读取--->NOACK--->停⽚;写:发设备地址--->送8位地址----->写数据--->停⽚;AT24C32.AT24C64读:发设备地址--->送⽚8位地址--->送低8位地址--->发设备地址--->读取----->NOACK--->停⽚写:发设备地址--->送⽚8位地址----->送低8位地址---->写数据--->停⽚;。
I2C时序分析和基础知识总结
• 接收器件收到一个完整的数据字节后,有可能需要完成 一些其它工作,如处理内部中断服务等,可能无法立刻接收 下一个字节,这时接收器件可以将SCL线拉成低电平,从而 使主机处于等待状态。直到接收器件准备好接收下一个字节 时,再释放SCL线使之为高电平,从而使数据传送可以继续 进行。
1、关于400pF负载电容
(1)波形畸变:电容越大,其滤波效果越明显。当这个电容过大时,很明显 部分通讯信号会被滤除,引起波形畸变,I2C将可能会产生误码,从而无法正常 通信。
(2)总线驱动能力:负载电容决定了总线在某一速率下的稳定性。当输出为 高时,电流通过上拉电阻对负载电容充电。上拉越大,电容越大,所需要的时间 就越长,如果超过了通信周期的10%,那么这个上升沿就太缓了,相应的建立时 间会受到影响。
当所有有关的器件数完了它们的低电平周期后,时钟线被释放并变成高 电平,之后器件时钟和SCL线的状态没有差别,而且所有器件会开始数它们 的高电平周期。首先完成高电平周期的器件会再次将SCL线拉低,这样产生 的同步SCL 时钟的低电平周期由低电平时钟周期最长的器件决定,而高电平 周期由高电平时钟周期最短的器件决定。
但如果从机要完成一些其他功能后才能接收或发送下一个完 整的数据字节,那么可以使时钟信号保持低电平迫使主机进入等 待状态。这也是唯一一个从机改变主机时钟的情况。
当从机准备好接受下一个字节时,释放时钟线SCL,数据传 输继续。
• (2)数据帧格式 • I2C总线上传送的数据信号是广义的,既包括地
址信号,又包括真正的数据信号。
• 在起始信号后必须传送一个从机的地址(7位), 第8位是数据的传送方向位(R/),用“0”表示主 机发送数据(T),“1”表示主机接收数据(R)。 每次数据传送总是由主机产生的终止信号结束。 但是,若主机希望继续占用总线进行新的数据传 送,则可以不产生终止信号,马上再次发出起始 信号对另一从机进行寻址。
I2C之AT24C04总结
I2C之A T24C04总结(总30页)-CAL-FENGHAI.-(YICAI)-Company One1-CAL-本页仅作为文档封面,使用请直接删除I2C之AT24C04总结济南职业学院电子工程系朱志强1、AT24C04介绍2、AT24C04之准备工作3、AT24C04之小试牛刀4、对应源程序2010年7月28日1、AT24C04介绍关于I2C的介绍,这里就不用说了,直接介绍24C04了。
24C04是4K位串行CMOS E2PROM。
引脚的认识:SCL 串行时钟引脚SDA 串行数据/地址A0、 A1、 A2 器件地址输入端WP 写保护(WP 管脚连接到Vcc,所有的内容都被写保护(只能读)。
当WP 管脚连接到Vss 或悬空,允许器件进行正常的读/写操作。
)2、AT24C04之准备工作首先,我们先查看一下实验板上面的接线图。
如图1所示。
图1 24c04连接图我们要注意的第一点是器件地址全部是0,即接地处理。
第二点是读写保护WP接地,意味着我们可以随意存取。
第三点是我们要用到的引脚连接到了P3^6和P3^7上。
在这里还要提醒一下,就是引脚上一定要有上拉电阻!阻值在470~1k都可以的,具体的数值可以参考相关的手册。
在程序里我们需要先做以下定义:sbit AT24C04_SCL=P3^7;sbit AT24C04_SDA=P3^6;在写这个程序的时候,要使用到键盘,不用太多按键,我们暂时只用四个。
把实验板上面的跳线JP8接到“-”端上,使第一行的按键变为独立键盘就可以了。
线路图如图2所示。
图2 键盘部分电路图键盘这部分我就不说了吧,直接附上我用到的这部分程序,在我的程序中,并没有判断按键是否松开,而是使用的延时,这样的好处是一直按着按键,数据会一直在变化,要不然,频繁的按真的很累人。
转到按键程序对于里面用到的延时函数,一个是US级延时函数,一个是ms级延时函数,分别调用一下是延时2us和1ms。
对于显示部分吧,使用的就是LCD1602显示了。
推荐-I2C24C04与蜂鸣器课程设计说明书 精品
目录第一章课程设计的目的-------------------------------------------------3 第二章元器件介绍-----------------------------------------------------------3 2.1芯片引脚功能图------------------------------------------------------------------3 2.2 元器件清单-------------------------------------------------------------------------6第三章硬件设计----------------------------------------------------------------6 3.1蜂鸣器放大电路-----------------------------------------------------6 3.2系统硬件设计图-----------------------------------------------------------7 3.3焊接电路板----------------------------------------------------------------7 第四章软件设计---------------------------------------------------------------------------11 4.1程序设计----------------------------------------------------------------------------------11 参考文献-------------------------------------------------------------------14设计小结-------------------------------------------------------------------15第一章课程设计的目的程序运行后会首先将14个音符索引字节写入24C04,然后再反复读取这些音符并演奏。
基于51单片机IIC通信的AT24C02学习笔记
基于51单⽚机IIC通信的AT24C02学习笔记引⾔最近在学习⼏种串⾏通信协议,感觉收获很多,这篇⽂章是学习IIC总线协议的第⼀篇⽂章,以后还会再写⼀篇关于PCF8591 IIC通信的ADDA转换芯⽚的⽂章.关于IIC总线IIC 即Inter-Integrated Circuit(集成电路总线),这种总线类型是由飞利浦半导体公司在⼋⼗年代初设计出来的⼀种简单、双向、⼆线制、同步串⾏总线,主要是⽤来连接整体电路(ICS) ,IIC是⼀种多向控制总线,也就是说多个芯⽚可以连接到同⼀总线结构下,同时每个芯⽚都可以作为实时数据传输的控制源。
主要包括启始、停⽌、读、写、应答信号。
这种⽅式简化了信号传输总线接⼝。
IIC总线上可以挂多个器件,⽽每个器件都有唯⼀的地址,这样可以标识通信⽬标。
数据的通信的⽅式采⽤主从⽅式,主机负责主动联系从机,⽽从机则被动回应数据。
关于AT24C02AT24C02是⼀个2K位串⾏CMOS E2PROM,内部含有256个8位字节,CATALYST公司的先进CMOS技术实质上减少了器件的功耗。
AT24C02有⼀个8字节页写缓冲器。
该器件通过IIC进⾏操作,有⼀个专门的功能。
在单⽚机上的应⽤⼴泛,可以实现掉电数据不丢失功能。
IIC总线数据有效性的规定SCL=1期间,SDA必须保持稳定,SCL=0时,SDA才允许改变。
IIC 总线的⼏种信号1.起始和终⽌信号:从时序图可以看出,起始信号为,SCL=1,SDA下降沿;终⽌信号为SCL=1,SDA为上升沿,保持的时间是有限制的:具体的程序实现如下:起始信号:SDA=1保持时间⼤于4。
7us,随后SDA=0保持时间⼤于4us/*SDA下降沿*/void start(){SDA = 1; //顺序不能反了,先是SDA=1;SCL = 1;delay();SDA = 0;delay();}终⽌信号:SDA=0保持时间⼤于4us,随后SDA=1保持时间⼤于4。
AT24C04在电子设计中的作用
AT24C04在电子设计中的作用【摘要】本文介绍了EEPROM器件AT24C04的基本使用方式,通过51单片机与AT24C04建立I2C串行通信方式,实现AT24C04的读、写操作。
以AT24C04为例,详细说明了EERPOM 在电子设计中的实际应用价值。
【关键词】EEPROM;I2C通信;单片机控制;掉电存储1前言EEPROM,即电可擦可编程只读存储器,是一种掉电后数据不丢失的存储器件。
它常用于存放硬件设置数据和保存记录设备数据,防止掉电后数据丢失。
本文介绍了AT24C04,作为一种串行总线存储器,它具有体积小、引脚少、功耗低等特点,是EEPROM器件在电子设计中的应用价值体现。
2AT24C04的基本介绍AT24C04是Atmel公司的一款I2C串行EEPROM,其工作电压范围宽,VCC工作在1.7-5.5伏,兼容51单片机的TTL电平。
芯片引脚分布图如图2-1所示:A1、A2为芯片的引脚地址,SCL和SDA为I2C总线接口的串行时钟线与数据线。
WP为写保护引脚,当芯片写保护时,WP为高电平,智能对器读操作,不能改写内部数据,从而起到硬件保护作用,当WP为低电平时,才能实现对器件的写操作。
芯片引脚少,外围电路简单,减少了布局布线空间。
3AT24C04的控制过程使用STC89C51单片机实现对AT24C04的控制,实质是建立单片机与EEPROM芯片的I2C通信。
相比RS232和SPI通信而言,I2C的时序要复杂一些。
SCL与SDA的建立关系是,在SCL高电平时,SDA数据保持,在SCL低电平时,SDA数据变化。
AT24C04的操作可分为写单字节,写多字节,读单字节和读多个存储字节。
以写单一字节为例,起始信号完成后输入器件地址和读写状态。
“1”表示读操作,“0”表示写操作。
等待从设备(AT24C04)的应答信号。
接收到应答信号后主设备(单片机)向从设备(AT24C04)发送所写地址(8位),等待应答信号,写入地址对应数据(8位),等待应答信号,以停止信号终止本次写操作。
关于I2C的总结
关于I2C的总结
这两天在看I2C,为了加深印象,把我遇到的一些问题写出来吧。
1
最先遇到的问题是AT24C02的操作时序,AT24C02内部有一个指针,指向
储存空间的某一个字节,另外AT24C系列支持页操作,对于AT24C02一个页
是8字节,也就是说地址的高5位是页地址,在同一次写入中,页地址不变,
低3位地址一次增加,当增加到7之后再加1就变成0了,而由于页地址不变,相当于指针回到了页首,如果继续写那前面的内容会被覆盖。
写数据的时序,
先是I2C的开始信号,发送设备地址,之后写入希望写入的数据地址,然后依
次写入数据。
当然,可以只写一个字节的数据。
对于读取,是不存在页的概念的,时序是先发送启动信号,然后发送设备地
址(注意,是写设备的时候的地址,也就是说最低位是1),接着发送数据地址,完了之后重新发送一次启动信号,接着就可以读取了,读取完一个字节的数据
后要发送一个ACK,对于最后一个字节的数据要发送一个NACK来告诉
AT24C数据已经接收完毕,之后发送结束信号断开连接即可。
也可以只接收一
个数据,这时候一个ACK都没有,第一次接收好直接发送一个NACK。
24C02的内部有连续的子地址空间,对这些空间进行n个字节的连续读/写时,都具有地址自动加1功能。
只要设定好要读/写的器件内起始子地址及字节数,
就能完成整个操作。
注意:对于24C02连续写的字节数不应超过页容量8,一
次连续写所形成的总线传送结束后(主机发出停止信号后),24C02执行内部擦写过程,大约需要10ms左右,24C02不再应答主器件的任何请求。
24C02内。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
I2C之AT24C04总结济南职业学院电子工程系朱志强1、AT24C04介绍2、AT24C04之准备工作3、AT24C04之小试牛刀4、对应源程序2010年7月28日1、AT24C04介绍关于I2C的介绍,这里就不用说了,直接介绍24C04了。
24C04是4K位串行CMOS E2PROM。
引脚的认识:SCL 串行时钟引脚SDA 串行数据/地址A0、A1、A2 器件地址输入端WP 写保护(WP 管脚连接到Vcc,所有的内容都被写保护(只能读)。
当WP 管脚连接到Vss 或悬空,允许器件进行正常的读/写操作。
)2、AT24C04之准备工作首先,我们先查看一下实验板上面的接线图。
如图1所示。
图1 24c04连接图我们要注意的第一点是器件地址全部是0,即接地处理。
第二点是读写保护WP接地,意味着我们可以随意存取。
第三点是我们要用到的引脚连接到了P3^6和P3^7上。
在这里还要提醒一下,就是引脚上一定要有上拉电阻!阻值在470~1k 都可以的,具体的数值可以参考相关的手册。
在程序里我们需要先做以下定义:sbit AT24C04_SCL=P3^7;sbit AT24C04_SDA=P3^6;在写这个程序的时候,要使用到键盘,不用太多按键,我们暂时只用四个。
把实验板上面的跳线JP8接到“-”端上,使第一行的按键变为独立键盘就可以了。
线路图如图2所示。
图2 键盘部分电路图键盘这部分我就不说了吧,直接附上我用到的这部分程序,在我的程序中,并没有判断按键是否松开,而是使用的延时,这样的好处是一直按着按键,数据会一直在变化,要不然,频繁的按真的很累人。
转到按键程序对于里面用到的延时函数,一个是US级延时函数,一个是ms级延时函数,分别调用一下是延时2us和1ms。
对于显示部分吧,使用的就是LCD1602显示了。
这部分程序参见这里。
显示程序说完了这些,准备的就差不多了,我们可以对着PDF写AT24C04程序了。
3、AT24C04之小试牛刀我们打破PDF中的介绍顺序,按照实际写程序时的顺序分开分析。
第一项是我们要用她,那就要知道她是怎么开始吧?这就是I2C总线时序中的开始和停止。
时序图如下。
图3 开始停止时序有一个需要注意的地方,就是当SCL为高电平时,所有的SDA的变化都会被认为是开始或停止信号。
所以,我们必须注意,在对SDA进行操作之前,一定要注意SCL的值。
例如在我们写开始信号之前,我们没法判断两个信号的具体电位,那么我们就要做最坏的打算。
首先SDA=1,然后SDA=0,此间要让SCL保持在高电平。
为保证SCL为高电平,我们要用SCL=1指令使SCL保持在高电平。
SCL放在什么位置就成了重点。
如果我们SDA变为高电平之前,这样却成了SCL=1后SDA=1,形成了停止信号!!这个是我们要避免的,那么我们就要让SDA变化的时候,全部避开SCL为高电平段。
程序如下。
void I2C_START(){//AT24C04_SCL=0;delayus(1);//这样做有些繁琐,我们可以直接不用,因为我们跳出//所有的子函数时,都会让SCL=0!!!AT24C04_SDA=1;delayus(1);//注意先后顺序AT24C04_SCL=1;delayus(1);AT24C04_SDA=0;delayus(1);//下降沿开始AT24C04_SCL=0;delayus(1);}我们以同样的思维,可以得到停止子函数,如下。
void I2C_STOP(){AT24C04_SCL=0;delayus(1);AT24C04_SDA=0;delayus(1);AT24C04_SCL=1;delayus(1);AT24C04_SDA=1;delayus(1);//上升沿停止}下面我们来看一下写的时序。
图4 写时序时序的第一部分给我们展现了一个第八位数据写完后的情况,也就是说要有一个ACK应答信号。
具体关于ACK应答信号的内容,可以参考器件手册。
第二部分是从开始到停止。
至于时序图中给出的时间我们可以不用考虑。
只需要记住,当SDA变化时SCL为0,SDA变化完后,SCL在变为1来告知24C04接收数据线上的信号。
具体的实现函数如下所示。
void I2C_Wdata(unsigned char data4){unsigned char i;unsigned char temp;temp=data4;for(i=0;i<8;i++){AT24C04_SCL=0;temp=temp<<1;//先发送高位AT24C04_SDA=CY;delayus(1);AT24C04_SCL=1;delayus(1);}AT24C04_SCL=0;delayus(1);}这里还需要注意的一点是我们每当SDA或者SCL变化一次,就会调用一下delayus(1)来延时2us,是用来稳定信号和保证信号保持的时间。
上面是写的时序,我们还要有读的子函数啊……其实,读得时序和写的时序差不多,只不过是反过来的。
既然是读,发送方就是24C04,接收方式单片机。
每次都是让SCL为1,使得24C04掌握对SDA的控制权。
而单片机的任务就是在把SCL拉高后,监视SDA的变化并读出SDA上的数据。
下面就是读的子函数。
unsigned char I2C_Rdata(){unsigned char i;unsigned char temp;unsigned char k;AT24C04_SCL=0;delayus(1);AT24C04_SDA=1;//等待24C02发回来的信号for(i=0;i<8;i++){AT24C04_SCL=1;delayus(1);if(AT24C04_SDA==1)k=1;elsek=0;temp=temp<<1;temp=temp|k;//读数据时高位在前AT24C04_SCL=0;}delayus(1);return temp;}此时,我们还需要添加上ACK回应信号。
我们先来看看它的时序图。
图5 ACK 应答信号从时序图我们可以看出,ACK就是24C04还给单片机的一个低电平信号,它发生在第九个时钟脉冲上。
如果我们用不到哪个ACK的话,我们只需要给出第九个时钟脉冲就可以了。
示例程序如下。
void I2C_ACK(){unsigned char i;//可以去掉AT24C04_SCL=1;delayus(1);while((AT24C04_SDA==1)&&(i<511))//这部分可以去掉i++;//可以去掉AT24C04_SCL=0;delayus(1);}以上三个是读写的重要子函数,加上开始和停止,有关于AT24C04的函数部分,都是由这五个组成的。
下面我们来分析一下可操作的和写。
先来分析写字节函数吧。
下面是它的时序图。
图6 字节写时序从时序图中我们可以看到,第一部分是开始(START),这部分调用开始函数就可以了。
第二部分器件地址,这个是由单片机发送给24C04的,选用写子函数就可以了。
别忘了还有一个ACK应答。
第三部分是字节地址,就是你想把要存储的数据存储到哪个单元里。
第四部分是发送要存储的数据。
第五部分就是停止部分(STOP)。
现在我们来分析一下什么是器件地址吧。
在I2C总线的协议中,某些器件被指定为特定的地址,这个特定的地址占用了器件地址的前四位。
具体的怎么定义的可以参考部分资料。
I2C器件的手册里也给出了自己的器件地址。
我们以AT24C04的器件地址为例分析吧。
图7 AT24C04的器件地址A2,A1是我们自己可以选择的,对应的是可以接地或者接高电平。
a8是可以用单片机控制的,但是我们的实验板上直接当做A0给接地处理了。
这样做虽然是使器件地址变简单了,但是,24c04有一半的存储区域我们没有用到,也就相当于用了一个AT24C02了。
最后一位读写控制位,从非号“¯”我们看出,此位是1表示读,此位是0则表示写!!!那么我们就可以得到对24C04写的器件地址是0XA0,读的器件地址是0XA1(见图1)。
由此我们就可以按顺序写出字节写的子函数了。
如下所示。
void I2C_xie(unsigned char data5,unsigned char data6){I2C_START();I2C_Wdata(0xa0);//写入型总线I2C_ACK();I2C_Wdata(data5);//写入数据的存储地址I2C_ACK();I2C_Wdata(data6);//待写入的数据I2C_ACK();I2C_STOP();}我们在用同样的方法分析一下选择性读的时序。
时序图如下。
图8 选择性读时序图有这个图我们可以分析到如下的选择性读子函数。
unsigned char I2C_du(unsigned char data7){unsigned char data8;I2C_START();I2C_Wdata(0xa0);//写入型总线I2C_ACK();I2C_Wdata(data7);//需要读出数据的地址I2C_ACK();I2C_START();//再一次重新开始I2C_Wdata(0xa1);//读出型总线I2C_ACK();data8=I2C_Rdata();//转存读出的数据I2C_STOP();return data8;//返回读出的数据}现在我们基本上就把AT24C04的读写的部分完成了。
至于PDF中提到的其他的用法,大家可以自己琢磨琢磨。
比如,下面是页写的时序图。
图9 页写时序图我们就得到了如下的页写程序。
/* ***********************************************************AT24C04页写函数变量:data5 页写首地址data6 页写的数据的个数* ***********************************************************/void I2C_YExie(unsigned char data5,unsigned char data6){unsigned char *p;unsigned char i;unsigned char k;p=tab;//unsigned char tab[]={// "0123456789"// };k=data6;I2C_START();I2C_Wdata(0xa0);I2C_ACK();I2C_Wdata(data5);I2C_ACK();for(i=0;i<k;i++){I2C_Wdata(*p++);I2C_ACK();}I2C_STOP();}4、对应源程序最后附上全体函数,有利于大家临摹学习。