您的位置 首页 IOT

AVR TWI读写读写典范

/***************************************************AVRTWI读写读写范例**************作者:HJJourAVR*******编译器

/***********************************************

**** AVR TWI读写读写典范 ***
**** ***
**** 作者: HJJourAVR ***
**** 编译器:WINAVR20050214 ***
***********************************************/
/*
本程序简略的演示了怎么运用ATMEGA16的TWI 读写AT24C02 IIC EEPROM
TWI协议
(即IIC协议,请仔细参阅IIC协议的内容,不然底子就不能把握)
一主多从的运用,M16作主机
(M16做从机和多主多从的运用不多,请自行参阅相关文档)
中止形式
(因为AVR的速度很高,而IIC的速度相对较低,
选用查询形式会长时刻独占CPU,令CPU的利用率显着下降。
特别是IIC速度受环境影响只能低速通讯时,对体系的实时性发生严峻的影响。
查询形式能够参阅其它文档和软件模仿IIC的文档)
AT24C02/04/08的操作特色

出于简化程序考虑,各种数据没有对外输出,学习时主张运用JTAG ICE硬件仿真器
*/

#include <avr/io.h>
#include
#include interrupt.h>
#include
//时钟定为外部晶振7.3728MHz,F_CPU=7372800
#include
//界说了各种形式下的情况码列表(TWSR已屏蔽预分频位),本文后边附上中文描绘

//管脚界说
#define pinSCL0//PC0 SCL
#define pinSDA1//PC1 SDA
//为稳妥起见,最好在SCL/SDA接上1~10K的外部上拉电阻到VCC。

#define fSCL100000//TWI时钟为100KHz
//预分频系数=1(TWPS=0)
#if F_CPU < fSCL*36
#define TWBR_SET 10;//TWBR有必要大于等于10
#else
#define TWBR_SET (F_CPU/fSCL-16)/2;//核算TWBR值
#endif

#define TW_ACT(1<//TWCR只能IN/OUT,直接赋值比逻辑运算(|= &=)更节约空间

#define SLA_24CXX0xA0//24Cxx系列的厂商器材地址(高四位)
#define ADDR_24C020x00
// AT24C02的地址线A2/1/0悉数接地,SLAW=0xA0+0x00<<1+0x00,SLAR=0xA0+0x00<<1+0x01

//TWI_操作情况
#define TW_BUSY0
#define TW_OK1
#define TW_FAIL2
//TWI_读写指令情况
#define OP_BUSY0
#define OP_RUN1

//TWI读写操作公共过程
#define ST_FAIL0//犯错情况
#define ST_START1//START情况查看
#define ST_SLAW2//SLAW情况查看
#define ST_WADDR3//ADDR情况查看
//TWI读操作过程
#define ST_RESTART4//RESTART情况查看
#define ST_SLAR5//SLAR情况查看
#define ST_RDATA6//读取数据情况查看,循环n字节
//TWI写操作过程
#define ST_WDATA7//写数据情况查看,循环n字节

#define FAIL_MAX20//重试次数最大值

//界说大局变量
unsigned char ORGDATA[8]=
{0xAA,0xA5,0x55,0x5A,0x01,0x02,0x03,0x04};//原始数据
unsigned char CMPDATA[8];//比较数据
unsigned char BUFFER[256];//缓冲区,能够装载整个AC24C02的数据

struct str_TWI//TWI数据结构
{
volatile unsigned charSTATUS;//TWI_操作情况
unsigned charSLA;//从设备的器材地址
unsigned intADDR;//从设备的数据地址
unsigned char*pBUF;//数据缓冲区指针
unsigned intDATALEN;//数据长度
unsigned charSTATE;//TWI读写操作过程
unsigned charFAILCNT;//失利重试次数
};

struct str_TWI strTWI;//TWI的数据结构变量

//仿真时在watch窗口,监控这些大局变量。

//AT24C02的读写函数(包含随机读,连续读,字节写,页写)
//依据sla的最低位决议(由中止程序中判别)
//bit0=1 TW_READ 读
//bit0=0 TW_WRITE 写
// sla器材地址(不能搞错)
//addrEEPROM地址(0~1023)
//*ptr读写数据缓冲区
//len读数据长度(1~1024),写数据长度(1 or 8 or 16)
// 回来值是否能履行当时操作
unsigned char TWI_RW(unsigned char sla,unsigned int addr,unsigned char *ptr,unsigned int len)
{
unsigned char i;
if (strTWI.STATUS==TW_BUSY)
{//TWI忙,不能进行操作
return OP_BUSY;
}
strTWI.STATUS=TW_BUSY;
i=(addr>>8)<<1;
i&=0x06;//考虑了24C04/08的EEPROM地址高位放在SLA里边
strTWI.SLA=sla+i;
strTWI.ADDR=addr;
strTWI.pBUF=ptr;
strTWI.DATALEN=len;
strTWI.STATE=ST_START;
strTWI.FAILCNT=0;
TWCR=(1< return OP_RUN;
}

/*
TWI中止函数
这个函数流程仅仅考虑了器材地址后有一个字节数据(指令)地址的IIC器材
(大部分IIC接口器材都是这种类型,常见的例如AT24C01/02/04/08/16,DS1307,DS1721等)
关于有两个字节数据地址的IIC器材(例如AT24C32/64/128/256等大容量EEPROM),请稍作改动

//依据strTWI.SLA的最低位决议
//bit0=1 TW_READ 读
//bit0=0 TW_WRITE 写

尽管中止服务程序很长,但每次只履行一个 case,所以耗时并不长。
*/
SIGNAL(SIG_2WIRE_SERIAL)
{//IIC中止
unsigned char action,state,status;
action=strTWI.SLA&TW_READ;//取操作形式
state=strTWI.STATE;
status=TWSR&0xF8;//屏蔽预分频位
if ((status>=0x60)||(status==0x00))
{//总线过错或从机形式引发的中止,不予处理
return;
}
switch(state)
{
case ST_START://START情况查看
if(status==TW_START)
{//发送start信号成功
TWDR=strTWI.SLA&0xFE;//发送器材地址写SLAW
TWCR=TW_ACT; //触发下一步动作,一同清start发送标志
}
else
{//发送start信号犯错
state=ST_FAIL;
}
break;
case ST_SLAW://SLAW情况查看
if(status==TW_MT_SLA_ACK)
{//发送器材地址成功
TWDR=strTWI.ADDR;//发送eeprom地址
TWCR=TW_ACT; //触发下一步动作
}
else
{//发送器材地址犯错
state=ST_FAIL;
}
break;
case ST_WADDR://ADDR情况查看
if(status==TW_MT_DATA_ACK)
{//发送eeprom地址成功
if (action==TW_READ)
{//读操作形式
TWCR=(1< }
else
{//写操作形式
TWDR=*strTWI.pBUF++; //写第一个字节
strTWI.DATALEN–;
state=ST_WDATA-1;//下一步将跳到WDATA分支
TWCR=TW_ACT; //触发下一步动作
}
}
else
{//发送eeprom地址犯错
state=ST_FAIL;
}
break;
case ST_RESTART://RESTART情况查看,只需读操作形式才干跳到这儿
if(status==TW_REP_START)
{//发送restart信号成功
TWDR=strTWI.SLA;//发器材地址读SLAR
TWCR=TW_ACT; //触发下一步动作,一同清start发送标志
}
else
{//重发start信号犯错
state=ST_FAIL;
}
break;
case ST_SLAR://SLAR情况查看,只需读操作形式才干跳到这儿
if(status==TW_MR_SLA_ACK)
{//发送器材地址成功
if (strTWI.DATALEN–)
{//多个数据
TWCR=(1< }
else
{//只需一个数据
TWCR=TW_ACT;//设定NAK,触发下一步动作
}
}
else
{//发送器材地址犯错
state=ST_FAIL;
}
break;
case ST_RDATA://读取数据情况查看,只需读操作形式才干跳到这儿
state–;//循环,直到读完指定长度数据
if(status==TW_MR_DATA_ACK)
{//读取数据成功,但不是最终一个数据
*strTWI.pBUF++=TWDR;
if (strTWI.DATALEN–)
{//还有多个数据
TWCR=(1< }
else
{//预备读最终一个数据
TWCR=TW_ACT;//设定NAK,触发下一步动作
}
}
else if(status==TW_MR_DATA_NACK)
{//现已读完最终一个数据
*strTWI.pBUF++=TWDR;
TWCR=(1< strTWI.STATUS=TW_OK;
}
else
{//读取数据犯错
state=ST_FAIL;
}
break;
case ST_WDATA://写数据情况查看,只需写操作形式才干跳到这儿
state–;//循环,直到写完指定长度数据
if(status==TW_MT_DATA_ACK)
{//写数据成功
if (strTWI.DATALEN)
{//还要写
TWDR=*strTWI.pBUF++;
strTWI.DATALEN–;
TWCR=TW_ACT; //触发下一步动作
}
else
{//写够了
TWCR=(1< strTWI.STATUS=TW_OK;
//发动写指令后需求10ms(最大)的编程时刻才干真实的把数据记录下来
//编程期间器材不呼应任何指令
}
}
else
{//写数据失利
state=ST_FAIL;
}
break;
default:
//过错情况
state=ST_FAIL;
break;
}

if (state==ST_FAIL)
{//过错处理
strTWI.FAILCNT++;
if (strTWI.FAILCNT {//重试次数未超出最大值,
TWCR=(1< }
else
{//不然中止
TWCR=(1< strTWI.STATUS=TW_FAIL;
}
}
state++;
strTWI.STATE=state;//保存情况
}

int main(void)
{
unsigned char i;
//上电默许DDRx=0x00,PORTx=0x00 输入,无上拉电阻
PORTA=0xFF;//不必的管脚使能内部上拉电阻。
PORTB=0xFF;
PORTC=0xFF;//SCL,SDA使能了内部的10K上拉电阻
PORTD=0xFF;

//TWI初始化
TWSR=0x00;//预分频=0^4=1
TWBR=TWBR_SET;
TWAR=0x00;//主机形式,该地址无效
TWCR=0x00;//封闭TWI模块
sei();//使能大局中止
strTWI.STATUS=TW_OK;

TWI_RW(SLA_24CXX+(ADDR_24C02<<1)+TW_WRITE,0x10,&ORGDATA[0],8);
//从0x10地址开端写入8个字节数据
while(strTWI.STATUS==TW_BUSY);//等候操作完结
if (strTWI.STATUS==TW_FAIL)
{
//操作失利?
}
_delay_ms(10);//延时等候编程完结
while(1)
{
i=TWI_RW(SLA_24CXX+(ADDR_24C02<<1)+TW_READ,0x10,&CMPDATA[0],8);
//从0x10地址开端读出8个字节数据
while(strTWI.STATUS==TW_BUSY);//等候操作完结
//假如不加等候,则需求检测回来值i才干知道当时操作是否履行了
// 0 OP_BUSY 之前的操作没完结,没履行当时操作
// 1 OP_RUN 当时操作履行中
if (strTWI.STATUS==TW_FAIL)
{
//操作失利?
}
//读取成功,比照ORGDATA和CMPDATA的数据

i=TWI_RW(SLA_24CXX+(ADDR_24C02<<1)+TW_READ,0x00,&BUFFER[0],256);
//从0x00地址开端读出256个字节数据(整个ATC24C02)
while(strTWI.STATUS==TW_BUSY);//等候操作完结
};
}
/*
两线串行接口总线界说
两线接口TWI很适合于典型的处理器运用。
TWI协议答应体系设计者只用两根双向传输线就能够将128个不同的设备互连到一同。
这两根线一是时钟SCL,一是数据SDA。外部硬件只需求两个上拉电阻,每根线上一个。
一切衔接到总线上的设备都(有必要)有自己的地址。
留意:便是说不能有两个相同地址的设备
TWI协议处理了总线裁定的问题。

一切 TWI 兼容的器材的总线驱动都是漏极开路或集电极开路的。这样就完结了对接口操作十分要害的线与功用。
TWI器材输出为”0”时,TWI总线会发生低电平。
当一切的TWI器材输出为三态时,总线会输出高电平,答应上拉电阻将电压拉高。
留意:为确保一切的总线操作,但凡与TWI 总线衔接的AVR 器材有必要上电。

与总线衔接的器材数目受如下条件约束:
总线电容要低于400pF,并且能够用7 位从机地址进行寻址。
两个不同的标准,一种是总线速度低于100 kHz,而别的一种是总线速度高达400 kHz。

SCL和SDA引脚
SCL与SDA为MCU的 TWI接口引脚。
引脚的输出驱动器包含一个波形斜率约束器以满意TWI 标准。
引脚的输入部分包含尖峰按捺单元以去除小于50ns 的毛刺。
当相应的端口设置为SCL与SDA引脚时,能够使能I/O口内部的10K上拉电阻,这样可省掉外部的上拉电阻
留意:假如要作高速通讯或许从机数量较多,最好仍是外接适宜的上拉电阻

比特率发生器单元
TWI作业于主机形式时,比特率发生器操控时钟信号SCL的周期。
详细由TWI情况寄存器TWSR的预分频系数以及比特率寄存器TWBR设定。
当TWI作业在从机形式时,不需求比照特率或预分频进行设定,但从机的CPU时钟频率有必要大于TWI时钟线SCL频率的16倍。
留意,从机可能会延伸SCL 低电平的时刻,然后下降TWI 总线的均匀时钟周期。
SCL的频率依据以下的公式发生:
fSCL=fCPU/((16+2(TWBR)(4^TWPS))
TWBR = TWI比特率寄存器的数值
TWPS = TWI情况寄存器预分频的数值
Note:TWI 作业在主机形式时,TWBR 值应该不小于10,不然主机会在SDA 与 SCL 发生过错输出作为提示信号。
问题呈现于TWI 作业在主机形式下,向从机发送Start + SLA + R/W 的时分(不需求真的有从机与总线衔接)。

操控单元
操控单元监听TWI 总线,并依据 TWI 操控寄存器TWCR 的设置作出相应的呼应。
当TWI总线上发生需求运用程序干涉处理的事情时,TWI 中止标志位TWINT 置位。
鄙人一个时钟周期, TWI 情况寄存器TWSR 被标明这个事情的情况码字所更新。
在其它时刻里,TWSR 的内容为一个标明无事情发生的特别情况字。
一旦TWINT 标志方位”1”,时钟线SCL 即被拉低,暂停TWI 总线上的数据传输,让用户程序处理事情。
鄙人列情况呈现时, TWINT 标志方位位:
? 在TWI 传送完START/REPEATED START 信号之后
? 在TWI 传送完SLA+R/W 数据之后
? 在TWI 传送完地址字节之后
? 在TWI 总线裁定失利之后
? 在TWI 被主机寻址之后( 播送方法或从机地址匹配)
? 在TWI 接纳到一个数据字节之后
? 作为从机作业时, TWI 接纳到STOP 或REPEATED START 信号之后
? 因为不合法的START 或STOP 信号形成总线过错时

TWI 寄存器阐明

TWI 比特率寄存器- TWBR
? Bits 7..0 – TWI 比特率寄存器
TWBR 为比特率发生器分频因子。
比特率发生器是一个分频器,在主机形式下发生SCL时钟频率。
比特率核算公式请见前面的[比特率发生器单元]

TWI 操控寄存器- TWCR
TWCR 用来操控TWI操作。
它用来使能TWI,经过施加START到总线上来发动主机拜访,发生接纳器应对,发生STOP 情况,以及在写入数据到TWDR 寄存器时操控总线的暂停等。
这个寄存器还能够给出在TWDR 无法拜访期间,企图将数据写入到TWDR 而引起的写入抵触信息。
? Bit 7 – TWINT: TWI 中止标志
当TWI 完结当时作业,期望运用程序介入时TWINT 置位。
若SREG 的I 标志以及TWCR寄存器的TWIE 标志也置位,则MCU 履行TWI 中止例程。
当TWINT 置位时, SCL信号的低电平被延伸。
TWINT 标志的清零有必要经过软件写”1” 来完结。
履行中止时硬件不会主动将其改写为”0”。
要留意的是,只需这一位被清零,TWI 当即开端作业。
因而,在清零TWINT 之前一定要首要完结对地址寄存器TWAR,情况寄存器TWSR,以及数据寄存器TWDR 的拜访。
? Bit 6 – TWEA: 使能TWI 应对
TWEA 标志操控应对脉冲的发生。
若TWEA 置位,呈现如下条件时接口宣布ACK 脉冲:
1. 器材的从机地址与主机宣布的地址相符合
2. TWAR 的TWGCE 置位时接纳到播送呼叫
3. 在主机/ 从机接纳形式下接纳到一个字节的数据
将TWEA 清零能够使器材暂时脱离总线。
置位后器材从头康复地址辨认。
? Bit 5 – TWSTA: TWI START 情况标志
当CPU 期望自己成为总线上的主机时需求置位TWSTA。
TWI 硬件检测总线是否可用。
若总线闲暇,接口就在总线上发生START 情况。
若总线忙,接口就一向等候,直到检测到一个STOP 情况 ,然后发生START 以声明自己期望成为主机。
发送START之后软件有必要清零TWSTA。
? Bit 4 – TWSTO: TWI STOP 情况标志
在主机形式下,假如置位TWSTO,TWI 接口将在总线上发生STOP 情况,然后TWSTO主动清零。
在从机形式下,置位TWSTO 能够使接口从过错情况康复到未被寻址的情况。
此刻总线上不会有STOP 情况发生,但TWI 回来一个界说好的未被寻址的从机形式且开释SCL 与SDA 为高阻态。
? Bit 3 – TWWC: TWI 写磕碰标志
当TWINT 为低时写数据寄存器TWDR 将置位TWWC。
当TWINT 为高时,每一次对TWDR 的写拜访都将更新此标志。
? Bit 2 – TWEN: TWI 使能
TWEN 位用于使能TWI操作与激活TWI接口。
当TWEN位被写为”1”时,TWI引脚将I/O引脚切换到SCL 与SDA 引脚,使能波形斜率约束器与尖峰滤波器。
假如该位清零, TWI接口模块将被封闭,一切TWI 传输将被中止。
? Bit 0 – TWIE: 使能TWI 中止
当SREG 的I 以及TWIE 置位时,只需TWINT 为”1”, TWI 中止就激活。

TWI 情况寄存器- TWSR
? Bits 7..3 – TWS: TWI 情况
这5位用来反映TWI 逻辑和总线的情况。
不同的情况代码将会在后边的部分描绘。
留意从TWSR 读出的值包含5 位情况值与2 位预分频值。
检测情况位时设计者应屏蔽预分频位为”0”。这使情况检测独立于预分频器设置。
? Bits 1..0 – TWPS: TWI 预分频位
这两位可读/ 写,用于操控比特率预分频因子。
预分频系数为4的n次方
核算比特率的公式见前面的[比特率发生器单元]

TWI 数据寄存器- TWDR
在发送形式, TWDR 包含了要发送的字节;
在接纳形式, TWDR 包含了接纳到的数据。
当TWI 接口没有进行移位作业(TWINT 置位) 时这个寄存器是可写的。
在第一次中止发生之前用户不能够初始化数据寄存器。
只需TWINT 置位,TWDR 的数据便是安稳的。
在数据移出时,总线上的数据一同移入寄存器。
TWDR 总是包含了总线上呈现的最终一个字节,除非MCU 是从掉电或省电形式被TWI 中止唤醒。此刻TWDR 的内容没有界说。
总线裁定失利时,主机将切换为从机,但总线上呈现的数据不会丢掉。
ACK 的处理由 TWI逻辑主动办理, CPU 不能直接拜访ACK。
? Bits 7..0 – TWD: TWI 数据寄存器
依据情况的不同,其内容为要发送的下一个字节,或是接纳到的数据。

TWI(从机) 地址寄存器-TWAR
TWAR 的高7 位为从机地址。
作业于从机形式时,TWI 将依据这个地址进行呼应。
主机形式不需求此地址。
在多主机体系中, TWAR需求进行设置以便其他主机拜访自己。
TWAR 的LSB 用于辨认播送地址 (0x00)。
器材内有一个地址比较器。一旦接纳到的地址和本机地址共同,芯片就恳求中止。
? Bits 7..1 – TWA: TWI 从机地址寄存器
其值为从机地址。
? Bit 0 – TWGCE: 使能TWI 播送辨认
置位后MCU 能够辨认TWI 总线播送。

运用TWI
AVR的TWI接口是面向字节和根据中止的。
一切的总线事情,如接纳到一个字节或发送了一个START 信号等,都会发生一个TWI 中止。
因为TWI 接口是根据中止的,因而TWI接口在字节发送和接纳过程中,不需求运用程序的干涉。
TWCR寄存器的TWI中止答应位[TWIE]和大局中止答应位[I]一同决议了运用程序是否呼应TWINT标志位发生的中止恳求。
假如TWIE 被清零,运用程序只能选用轮询TWINT 标志位的方法来检测TWI 总线情况。
当TWINT 标志方位”1” 时,标明TWI 接口完结了当时的操作,等候运用程序的呼应。
在这种情况下,TWI 情况寄存器TWSR 包含了标明当时TWI 总线情况的值。
运用程序能够读取TWCR 的情况码,判别此刻的情况是否正确,并经过设置TWCR 与TWDR 寄存器,决议鄙人一个TWI 总线周期TWI 接口应该怎么作业。

各种形式下的情况码列表(TWSR已屏蔽预分频位)
twi.h里边有界说,现附上中文描绘

主机发送情况码
#define TW_START0x08//START已发送
#define TW_REP_START0x10//重复START已发送
#define TW_MT_SLA_ACK0x18//SLA+W 已发送收到ACK
#define TW_MT_SLA_NACK0x20//SLA+W 已发送接纳到NOT ACK
#define TW_MT_DATA_ACK0x28//数据已发送接纳到ACK
#define TW_MT_DATA_NACK0x30//数据已发送接纳到NOT ACK
#define TW_MT_ARB_LOST0x38//SLA+W 或数据的裁定失利

主机接纳情况码
//#define TW_START0x08//START已发送
//#define TW_REP_START0x10//重复START已发送
#define TW_MR_ARB_LOST0x38//SLA+R 或NOT ACK 的裁定失利
#define TW_MR_SLA_ACK0x40//SLA+R 已发送接纳到ACK
#define TW_MR_SLA_NACK0x48//SLA+R 已发送接纳到NOT ACK
#define TW_MR_DATA_ACK0x50//接纳到数据ACK 已回来
#define TW_MR_DATA_NACK0x58//接纳到数据NOT ACK已回来

从机接纳情况码
#define TW_SR_SLA_ACK0x60//自己的SLA+W 现已被接纳ACK已回来
#define TW_SR_ARB_LOST_SLA_ACK0x68//SLA+R/W 作为主机的裁定失利;自己的SLA+W 现已被接纳ACK 已回来
#define TW_SR_GCALL_ACK0x70//接纳到播送地址ACK 已回来
#define TW_SR_ARB_LOST_GCALL_ACK 0x78//SLA+R/W 作为主机的裁定失利;接纳到播送地址ACK已回来
#define TW_SR_DATA_ACK0x80//曾经以自己的SLA+W被寻址;数据现已被接纳ACK已回来
#define TW_SR_DATA_NACK0x88//曾经以自己的SLA+W被寻址;数据现已被接纳NOT ACK已回来
#define TW_SR_GCALL_DATA_ACK0x90//曾经以播送方法被寻址;数据现已被接纳ACK已回来
#define TW_SR_GCALL_DATA_NACK0x98//曾经以播送方法被寻址;数据现已被接纳NOT ACK已回来
#define TW_SR_STOP0xA0//在以从机作业时接纳到STOP或重复START

从发送情况码
#define TW_ST_SLA_ACK0xA8//自己的SLA+R 现已被接纳ACK 已回来
#define TW_ST_ARB_LOST_SLA_ACK0xB0//SLA+R/W 作为主机的裁定失利;自己的SLA+R 现已被接纳ACK 已回来
#define TW_ST_DATA_ACK0xB8//TWDR 里数据现已发送接纳到ACK
#define TW_ST_DATA_NACK0xC0//TWDR 里数据现已发送接纳到NOT ACK
#define TW_ST_LAST_DATA0xC8//TWDR 的一字节数据现已发送(TWAE = “0”);接纳到ACK

其它情况码
#define TW_NO_INFO0xF8//没有相关的情况信息;TWINT = “0”
#define TW_BUS_ERROR0x00//因为不合法的START 或STOP 引起的总线过错

AT24C02/04/08 IIC接口EEPROM的特色
(不同公司的24系列EEPROM特性有部分不同,请参阅数据手册)
1 AT24C02/04/08 是一个2K/4K/8K位串行CMOS E2PROM 内部含有256/512/1024 个8位字节
2 AT24C02有一个8 字节页写缓冲器,AT24C04/08/16 有一个16字节页写缓冲器
3 经过器材地址输入端A0,A1,A2能够完结将最多
8个24C02器材
4个24C04器材
2个24C08器材
一同衔接到总线上
4 写操作
1 字节写
2 页写 AT24C02是8字节/页 AT24C04/08是16字节/页
留意:页写的地址只在当时页主动累加,页地址范围内循环。
发动写指令后需求10ms(最大)的编程时刻才干真实的把数据记录下来,编程期间器材不呼应任何指令
5 读操作
1 当即地址读 地址主动累加,即为前次读/写操作地址+1(本程序不支持该操作)
2 随机读 指定地址读一个字节
3 连续读 连续读操作可经过当即读或随机读操作发动,由主机宣布NAK和STOP来中止读操作
读操作时地址计数器在AT24C02/04/08整个地址内添加,这样整个寄存器区域在可在一个读操作内悉数读出
循环读取,读到最终一个地址后,从第一个地址持续开端读
6 写保护功用,由WP引脚操控,WP=VCC时,24C02的高1K位,24C04的高2K位,24C08的悉数8K位都变成只读,不能写入.

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/yingyong/iot/272540.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部