RTC时钟芯片替换代码移植-IIC通信
Posted LFC_SS
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RTC时钟芯片替换代码移植-IIC通信相关的知识,希望对你有一定的参考价值。
1、问题
RTC时钟芯片由爱普生RX-8010SJ更换成大普INS5710A,两者都是IIC通信,更换大普芯片后时钟不走、以及报掉电错误。仿真分析原因是CPU和RTC芯片收发数据延时不够导致,根据爱普生芯片手册,8010收发数据不采取延时,但大普芯片采用同样方式读取不行(需要加延时)
2、RX-8010SJ手册说明(以读取数据为例)
(1)寄存器读操作时序图
指定地址读操作:
1)CPU 发送开始条件[S]
2)CPU 传输RX-8010SJ 的从地址,用R/W 位设定写模式
3)检测从RX-8010SJ 发出的ACK 信号
4)CPU 传输读寄存器的地址到8010SJ
5)检测从RX-8010SJ 发出的ACK 信号
6)CPU 发送RESTART 条件[Sr]
7)CPU 传输RX-8010SJ 的从地址,用R/W 位设定读模式
8)检测从RX-8010SJ 发出的ACK 信号
9)从8010SJ 中读取步骤(4)指定的寄存器内容
10) CPU 发送ACK 信号给8010SJ
11) 如果有需要可重复(9)和(10)步骤,读取的地址自动增加
12) CPU 发送一个‘1’作为ACK 信号
13) CPU 发送停止信号[P]
(2)软件范例-I2C 读写程序 C语言
/***************************************************************
** 函数原型: bit readEEone(uchar instr,uchar addr,uchar num); **
** 功 能: 从8010 中读取num 个字节的数据,采用序列读操作方 **
** 式从片内Address 地址开始连续读取数据.8010 不接 **
** 受指定的地址则返回0(FALSE). **
***************************************************************/
unsigned char readEEone(unsigned char addr,unsigned char num)
{
unsigned char i;
IC_start();
if(IC_WriteByte(WRITE)==0)
{
IC_stop(); return(0);
}
if(IC_WriteByte(addr)==0)
{
IC_stop(); return(0);
}
IC_start();
if(IC_WriteByte(READ)==0)
{
IC_stop(); return(0);
}
for(i=0;i<num-1;i++)
{
EEbuf[i]=IC_ReadByte();
SDA_DIR=I2C_OUTPUT;
RX-8010SJ
SDA=0; /** Send ACK **/
SCL=1;
}
EEbuf[num-1]=IC_ReadByte();
SDA_DIR=I2C_OUTPUT;
SDA=1; /** Send Read End **/
nop();
SCL=1;
IC_stop();
return(1);
}
(3)代码
TByte RX8010Read ( TByte rReg )
{
TByte rReadData;
RX8010_OperationStartUp(); //start
RX8010SendByte ( d8010DeviceSlaveWriteReg ); //slave device adress
RX8010SendByte ( rReg ); //data adress
RX8010_OperationStartUp(); //restart
RX8010SendByte ( d8010DeviceSlaveReadReg ); //slave device adress
rReadData = RX8010ReceiveByte();
mRX8010DataOutput();
mRX8010DataClear();
mRX8010ClockSet();
mRX8010DataOutput();
mRX8010DataSet();
mNop();
mRX8010ClockSet();
RX8010_OperationEnd();
return ( rReadData );
}
3、大普INS5710A手册说明(以读取数据为例)
(1)寄存器读操作时序图
先用写模式写要读的寄存器地址,然后设置成读模式读取寄存器数据。
(1)CPU发送开始[S]
(2)CPU发送I2C总线接口从地址,在R/W 位设置为写模式
(3)CPU接收I2C总线接口的ACK
(4)CPU发送读地址给I2C总线接口
(5)CPU接收I2C总线接口的ACK
(6)CPU发送重新开始[Sr]
(7)CPU发送I2C总线接口从地址,在R/W 位设置为读模式
(8)CPU接收I2C总线接口的ACK
(9)CPU接收I2C总线接口读到的数据
(10)CPU接收I2C总线接口的ACK
(11)如果读多字节,重复步骤(9)和(10),地址自增
(12)CPU发送ACK
(13)CPU发送停止[P]
(2)代码
TByte RX8010Read ( TByte rReg )
{
TByte rReadData;
TByte count;
RX8010_OperationStartUp(); //start
RX8010SendByte ( d8010DeviceSlaveWriteReg ); //slave device adress
mRX8010ClockClear();
for(count=0; count<20u; count++)
{
RTC_Nop();//TC_Nop()等于12个mNop()
}
RX8010SendByte ( rReg ); //data adress
for(count=0; count<20u; count++)
{
RTC_Nop();
}
mRX8010ClockSet();
mRX8010DataSet();
for(count=0; count<20u; count++)
{
RTC_Nop();
}
RX8010_OperationStartUp(); //restart
RX8010SendByte ( d8010DeviceSlaveReadReg ); //slave device adress
for(count=0; count<20u; count++)
{
RTC_Nop();
}
rReadData = RX8010ReceiveByte();
mRX8010DataOutput();
mRX8010DataClear();
for(count=0; count<20u; count++)
{
RTC_Nop();
}
RX8010_OperationEnd();
return ( rReadData );
}
以上是关于RTC时钟芯片替换代码移植-IIC通信的主要内容,如果未能解决你的问题,请参考以下文章