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通信的主要内容,如果未能解决你的问题,请参考以下文章

IIC协议

FPGA基础设计:IIC协议

IIC通信协议总结

IIC通信协议总结

IIC通信协议总结

IIC通信协议总结