您的位置 首页 ADAS

用IIC总线读取E2PROM存储器数据

简单介绍一下I2C总线原理:IIC总线是PHLIPS公司推出的一种串行总线,是具备多主机系统所需的包括总线裁决和高低速器件同步功能的高性能串行

简略介绍一下I2C总线原理:
IIC总线是PHLIPS公司推出的一种串行总线,是具有多主机体系所需的包含总线判决和高低速器材同步功用的高性能串行总线。
IIC总线只要两根双向信号线。一根是数据线SDA,另一根是时钟线SCL。 (记住这个就够了,其他都是废话!)
II C总线进行数据传送时,时钟信号为高电平期间,数据线上的数据有必要保持稳定,只要在时钟线上的信号为低电平期间,数据线上的高电平或低电平状况才答应改变。

留意到IIC总线是需求接上拉电阻的!由于连到IIC总线的器材的输出根本为开漏输出.

开端和中止信号 :SCL线为高电平期间,SDA线由高电平向低电平的改变表明开端信号;SCL线为高电平期间,SDA线由低电平向高电平的改变表明中止信号。下图一望而知。


数据传送格局(1)字节传送与应对
每一个字节有必要确保是8位长度。数据传送时,先传送最高位(MSB),每一个被传送的字节后边都有必要跟从一位应对位(即一帧共有9位)。假如一段时间内没有收到从机的应对信号,则主动以为从机已正确接收到数据。
对数据时进行位操作,即来一个SCL一直高电平就写入或许读出一位数据,这个一定要清楚!


下面介绍ATMEL公司的串行E2PROM产品——AT24C系列
AT24C01:128字节(128×8位);
AT24C02:256字节(256×8位);
AT24C04:512字节(512×8位)AT24C08:1K字节(1K×8位);
AT24C16:2K字节(2K×8位);

本次试验用的是AT24C02,所以存储器的地址有256字节(在I%&&&&&%总线寻址中读取存储器首地址时首地址的规模为0~256,由于AT24C02的容量为256字节)

下面是AT24C02的电路图,留意到SDA和SCL均有衔接10K的上拉电阻,本试验中SDA接89C52的P2.0口,SCL接89C52的P2.1口。

AT24C02的芯片地址如下图,1010为固定,A0,A1,A2正好与芯片的1,2,3引角对应,为当时电路中的地址挑选线,三根线可挑选8个芯片一起衔接在电路中,当要与哪个芯片通讯时传送相应的地址即可与该芯片树立衔接,TX-1B试验板上三根地址线都为0。最终一位R/W为告知从机下一字节数据是要读仍是写,0为写入,1为读出。


AT24C02的芯片地址(0xa0为写,0xa1为读)

恣意地址写入数据和恣意地址读取数据别离如下图所示
读取数据:


留意,读数据的时分也要先进行写操作,意图是写入器材地址以寻觅适宜的器材,当器材与地址匹配时,器材会宣布一个应对信号,这样就可以让单片机确认该读哪个器材,这样就可以开端读取数据了.
写入数据:

下面是程序:
#include
#define uchar unsigned char
sbit sda=P2^0;
sbit scl=P2^1;
uchar a;
void delay() //延时2us
{ ;; }
void start() //开端信号
{
sda=1;
delay();
scl=1;
delay();
sda=0;
delay();
}
void stop() //中止
{
sda=0;
delay();
scl=1;
delay();
sda=1;
delay();
}
void respons() //应对
{
uchar i;
scl=1;
delay();
while((sda==1)&&(i<250))i++;
scl=0;
delay();
}
void init() //初始化
{
sda=1;
delay();
scl=1;
delay();
}
void write_byte(uchar date) //写数据函数
{
uchar i,temp;
temp=date;

for(i=0;i<8;i++)
{
temp=temp<<1;
scl=0;
delay();
sda=CY;
delay();
scl=1;
delay();
//scl=0;
// delay();
}
scl=0;
delay();
sda=1; //数据总线开释,养成良好习惯
delay();
}
uchar read_byte() //读数据函数
{
uchar i,k;
scl=0;
delay();
sda=1; //数据总线开释,使总线处于闲暇状况
delay();
for(i=0;i<8;i++)
{
scl=1;
delay();
k=(k<<1)|sda; //一次读一位,从SDA的最低位读起
scl=0;
delay();
}
return k;
}
void delay1(uchar x)
{
uchar a,b;
for(a=x;a>0;a–)
for(b=100;b>0;b–);
}
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();
start();
write_byte(0xa1);
respons();
date=read_byte();
stop();
return date;
}
void main()
{
init();
write_add(23,0xaa);
delay1(100); //此延时非常重要,单片机在写和读数据之间需求加一延时,不然单片机不能
//正常呼应读操作
P1=read_add(23);
while(1);
}

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

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

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

微信扫一扫关注我们

返回顶部