I2C总结及RX8025驱动编写.docx
《I2C总结及RX8025驱动编写.docx》由会员分享,可在线阅读,更多相关《I2C总结及RX8025驱动编写.docx(9页珍藏版)》请在冰豆网上搜索。
I2C总结及RX8025驱动编写
一、I2C
1.I2C概要
I2C总线由SDA和SCL构成的2线式双向通信,通过组合这2个信号,进行通信的开始/停止/数据传送/应答等接收信号。
非通信时:
SDA、SCL都保持高电平。
通信的开始和结束通过SCL处于高电平,切上升或者下降SDA来控制。
数据的传送及发送信号时的SDA线上的数据变更在SCL线低电平区间进行,接收信号侧在SCL线处于高电平区间进行读取数据,任何情况下,都在SCL线的每一计时器脉冲以1bit逐步进行。
I2C总线的器件没有通常的逻辑器件所具有的芯片选择引脚,代之以对的是器件分配从地址,当接收器的从地质与选择从地址一致时,开始通信。
2.I2C通信的开始和停止
3.I2C通信的数据传送
4.I2C确认应答
5.I2C从地址
6、I2C的写数据顺序格式
7、I2C的读数据顺序格式
注:
RX8025官方手册中是错误的,经过测试,读顺序应该为上图。
二、RX8025AC驱动
#include"myiic.h"
#include"delay.h"
voidDelayus(u16us)
{
u16i;
for(i=0;i__nop();
}
voidIIC_Start(void)
{
SDA_OUT();//sdaÏßÊä³ö
SCL_1
SDA_1
Delayus(10);
SDA_0
Delayus(10);
SCL_0
Delayus(10);
}
voidIIC_Stop(void)
{
u8i;
SDA_OUT();SDA_0
Delayus(10);
SCL_1
Delayus(10);
SDA_1
for(i=0;i<5;i++)
{
Delayus(10);
}
}
u8IIC_Wait_Ack(void)
{
u8ucErrTime=0;
SDA_IN();//SDAÉèÖÃΪÊäÈë
Delayus(10);
Delayus(10);
while(READ_SDA)
{
ucErrTime++;
if(ucErrTime>250)
{
IIC_Stop();
return1;
}
}
SCL_0//ʱÖÓÊä³ö0
return0;
}
voidIIC_Ack(void)
{
SDA_OUT();
SDA_0;
Delayus(10);
SCL_1
Delayus(10);
SCL_0
Delayus(10);
}
voidIIC_NAck(void)
{
SDA_OUT();
SDA_1;
Delayus(10);
SCL_1
Delayus(10);
SCL_0
Delayus(10);
}
voidIIC_Send_Byte(u8txd)
{
u8i;
SDA_OUT();
for(i=0;i<8;i++)
{
if(txd&0x80)SDA_1
elseSDA_0
txd<<=1;
Delayus(10);
SCL_1
Delayus(10);
SCL_0
}
Delayus(10);
SCL_1
Delayus(10);
SCL_0
}
u8IIC_Read_Byte(unsignedcharack)
{
u8i,receive=0;
SDA_IN();//SDAÉèÖÃΪÊäÈë
for(i=0;i<8;i++)
{
SCL_1
Delayus(10);
receive<<=1;
if(READ_SDA)receive|=0x01;
SCL_0
Delayus(10);
}
SDA_OUT();
returnreceive;
}
voidR8025AC_Read(u8sadd,u8*buf,u8len)
{
u8i;
IIC_Start();
IIC_Send_Byte(0x64);
IIC_Send_Byte(sadd<<4|0x01);
IIC_Start();
IIC_Send_Byte(0x65);
for(i=0;i{
buf[i]=IIC_Read_Byte
(1);
IIC_Ack();
}
buf[i]=IIC_Read_Byte(0);
IIC_NAck();
IIC_Stop();
}
voidR8025AC_Write(u8sadd,u8*buf,u8len)
{
u8i;
IIC_Start();
IIC_Send_Byte(0X64);
IIC_Send_Byte(sadd<<4);
for(i=0;i{
IIC_Send_Byte(buf[i]);
}
IIC_Stop();
}
特别说明:
RX8025严格意义上是不需要初始化和“软启动”的,除非你需要设定RX8025的闹钟、12/24小时格式、初试时间。
一旦给RX8025上电,它就自动跑起来了。
只需要读它的寄存器就可以得到时间参数了。