AT24C02的驱动编写

I2C协议

AT24C02的通信协议是I2C,下面对I2C协议做个简单介绍。

I2C协议由两根总线进行数据传输,一条是时钟线(SCL),用于传输时钟脉冲信号,一条是数据线(SDA),用于传输数据。话不多说,下面来看看一串数据是怎么传输的吧

此处贴出时序图

时序图

让我们分析一下不同的信号代表的是什么指令。

Start

SCL为高电平时SAD由高电平转为低电平,则为开始。

void Start()
{
	SDA=1;
	delay10us();
	SCL=1;
	delay10us();
	SDA=0;
	delay10us();
	SCL=0;
	delay10us();
}
End

SCL为高电平时,SAD由低电平转为高电平时,则为结束。

void End()
{
	SDA=0;
	delay10us();
	SCL=1;
	delay10us();
	SDA=1;
	delay10us();
}
如何传输一位:

SDA保持不变,SCL经过一个上升沿,一段时间高电平,一个下降沿后,便读取一位数据。

例如想要传输1,则需要SDA先转为高电平,SCL经过一个上升沿,一段时间高电平,一个下降沿后,数据1便传输过去了。

应答的理解:

I2C协议规定传输完8位数据后,接收数据方必须给出应答。

即接收数据方在接收完完整的8位数据后,会向发出数据方传输1位应答信号。传输为0则为应答,传输为1则为非应答。

发出数据方在接收到应答后再决定是否继续传输数据。

如何产生应答:

在发送完8位数据后,主机需保证SDA为高电平,再将SCL由低电平转为高电平,等待应答。

发送一字节数据:
uchar WriteByte(uchar info)
{
	uchar a,b;
	for(a=0;a<8;a++)
	{
		SDA=info>>7;
		info<<=1;
		delay10us();
		SCL=1;
		delay10us();
		SCL=0;
		delay10us();
	}//此处为发送完一字节信息
	SDA=1;
	delay10us();
	SCL=1;
	while(SDA)
	{
		b++;
		if(b>200)
		{
			SCL=0;
			delay10us();
			return 0;
		}
	}//此处为等待应答,并将应答与否作为参数返回
	SCL=0;
	delay10us();
	return 1;
}
读取一字节数据:
uchar Read()
{
	uchar out=0,i;
	SDA=1;
	delay10us();
	for(i=0;i<8;i++)
	{
		SCL=1;
		delay10us();
		out<<=1;
		out|=SDA;
		delay10us();
		SCL=0;
		delay10us();
	}
	SDA=0;
	delay10us();
	return out;
}
从机地址的理解:

I2C协议支持多设备,通过对从机地址的访问,对不同设备进行通信。

D7~D1 位组成从机的地址。D0位是数据传送方向位,为“ 0”时表示主机向从机写数据,为“1”时表示主机由从机读数据。

AT24C02的地址D7~D4位默认为1010。

数据传输格式:

红色为主机行为。

主机向从机写数据:

S–>从机地址+0–>A–>date–>A–>date–>~A–>E

主机向从机读数据:
S–>从机地址+1–>A–>date–>A–>date–>~A–>E

其中S是Start,E是End,A是应答


AT24C02

AT24C02的读写规则:

AT24C02芯片规定数据的传输为地址+数据,即规定从机地址后的下一位为数据地址。

对数据进行操作之前必须写入数据地址。

主机向从机写数据:

S–>从机地址+0–>A–>数据地址–>A–>date–>~A–>E

主机向从机读数据:
S–>从机地址+0–>A–>数据地址–>A–>S–>从机地址+1–>A–>date–>~A–>E

写入数据:
//从指定地址开始写入数据
uchar WriteDate(uchar add,uchar date)
{
	uchar k=0;
	Start();
	WriteByte(0xa0);
	WriteByte(add);
	WriteByte(date);
	End();
	return k;
	
}
读入数据:
uchar ReadDate(uchar add,uchar date)
{
	uchar out;
	Start();
	WriteByte(0xa0);
	WriteByte(add);
	Start();
	WriteByte(0xa1);
	out=Read();
	End();
	return out;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值