搜索
bottom↓
回复: 12

用51读写RX8025 奇怪的现象,IIC读写方面的问题。。。

[复制链接]

出0入0汤圆

发表于 2011-7-25 10:30:57 | 显示全部楼层 |阅读模式
在用STC的51模拟IIC读写RX8025,在读写过程中不能按指定寄存器来读写。无论指定的是哪个寄存器,读写寄存器都是从00H开始。
有空的朋友,可以帮忙看下么,先谢谢了.


具体如下:采用11.0592MHZ + 1T模式
unsigned char IIC_err;
sbit SDA = P1^7;
sbit SCL = P1^6;
#define        R_TIME  0x64   
#define S_SDA        (SDA = 1)
#define S_SCL         (SCL = 1)
#define C_SDA        (SDA = 0)
#define C_SCL   (SCL = 0)
/***********************************IIC 开始******************************/

void I2cDelay(void)
{
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();       
}

/***************************************************************************/
//SCL'''''''''''''\____
//SDA'''''''\____

void Start(void)
{            
        S_SCL;
        S_SDA;
        I2cDelay();
        C_SDA;
        I2cDelay();
        C_SCL;  //产生下降沿
}

/***************************************************************************/
//SCL____/''''''''''''''
//SDA______/''''''''
void Stop(void)
{   
        C_SDA;
        I2cDelay();
        S_SCL;
        I2cDelay();       
        S_SDA;//产生上升沿//结速
}

/***************************************************************************/
//SCL__/'1'''\__/''2''\__/''3''\__/''4''\__/''5''\__/''6''\__/''7''\__/''8''\__/''9''\__
//SDA_<M::::::><:::::::><:::::::><:::::::><:::::::><:::::::><:::::::><::::::L>\__ACK__从设备返回
unsigned char Write8Bit(unsigned char input)
{
        unsigned char temp;
        temp = 8;
        while(temp--)
        {
                if(input&0x80)
                {
                        S_SDA;
                }
                else
                {
                        C_SDA;
                }
                I2cDelay();
                S_SCL;  
                I2cDelay();
                C_SCL;  
                input <<= 1;
        }
        S_SDA;        //发送完1字节后释放总线       
        I2cDelay();
        S_SCL;//上升沿检测信号
        I2cDelay();
        if(SDA)//检测ACK
        {

                C_SCL;
        I2cDelay();
                S_SDA;
                return 1;
        }
        C_SCL;
        I2cDelay();
        S_SDA;
    return 0;//有ACK       
}
/***************************************************************************/
//SCL__/'1'''\__/''2''\__/''3''\__/''4''\__/''5''\__/''6''\__/''7''\__/''8''\__/''9''\__
//SDA_<M::::::><:::::::><:::::::><:::::::><:::::::><:::::::><:::::::><::::::L>\__ACK__->主设备返回

unsigned char Read8Bit(unsigned char Ack)
{
        unsigned char temp,rbyte=0;
        for(temp=0;temp<8;temp++)
        {
                I2cDelay();
                rbyte=rbyte<<1;
                S_SCL;  
                I2cDelay();
                if(SDA)rbyte++;//下降沿前读取数据
                C_SCL;

        }
        if(Ack)//回应ACK
        {
           SDA = 0;
        }
        else
        {
           SDA = 1;
        }
        I2cDelay();
        S_SCL;//第9个脉冲
        I2cDelay();
        C_SCL;
        I2cDelay();
        S_SDA;//释放总线
        return(rbyte);
       
}
void WriteI2cPage(unsigned char DAdd,unsigned int add,unsigned char *str,unsigned char len)
{
        IIC_err = 0;
        Start();
        IIC_err += Write8Bit(DAdd);
        if(DAdd == E_PROM)
        {
        IIC_err += Write8Bit(add>>8);
        }
        IIC_err += Write8Bit(add);//写入地址
        for(;len > 0;len--)
        {
         IIC_err += Write8Bit(*str);
          str++;
        }
        Stop();
}

void ReadI2cPage(unsigned char DAdd,unsigned int add,unsigned char *str,unsigned char len)
{
        IIC_err = 0;
        Start();
        IIC_err += Write8Bit(DAdd);
        if(DAdd == E_PROM)
        {
        IIC_err += Write8Bit(add>>8);
        }
        IIC_err += Write8Bit(add);
        Start();
        IIC_err += Write8Bit(DAdd+1);
        for(;len > 1;len--)
        {
          *str=Read8Bit(1);
          str++;
        }
        *str = Read8Bit(0);
        Stop();
}
/*IIC 结束*/

出0入0汤圆

 楼主| 发表于 2011-7-25 11:09:24 | 显示全部楼层
UP...

出0入0汤圆

 楼主| 发表于 2011-7-25 11:10:46 | 显示全部楼层
最神奇的地方在于,在读写EEPROM的时候,可以按地址,正常读写...

出0入0汤圆

发表于 2011-7-25 11:36:46 | 显示全部楼层
这情况可能和程序关系不大,看看RX8025资料,有的芯片需要先写一次寄存器地址什么的才能再写数据

出0入0汤圆

 楼主| 发表于 2011-7-25 11:51:05 | 显示全部楼层
嗯,看资料上和EEPROM操作是一样的,除了地址长度,8025是一个字节,EEPROM一般是两个字节,其它一样。
资料如下:

点击此处下载 ourdev_660850YOJR45.pdf(文件大小:663K) (原文件名:RX8025.pdf)

出0入0汤圆

 楼主| 发表于 2011-7-26 08:41:46 | 显示全部楼层
up...

出0入0汤圆

发表于 2011-7-26 12:00:59 | 显示全部楼层
8025的地址在高半字节,看资料要仔细!
你的读是从0开始顺序读的吧?所以发现不了

出0入0汤圆

 楼主| 发表于 2011-7-26 14:16:06 | 显示全部楼层
嗯,多谢谢楼上,从高半字节开始按0-F读取,可以读出,现在全是零。不知道怎么回事?重设时间,读出也是零。。。



下图点击可放大,最小的高脉冲在2US左右。
以下是按0x00,0x10,x20,低次读出。

(原文件名:写.jpg)


(原文件名:读.JPG)


以下是之前发送数据按低半字节从0-F读数据


(原文件名:012.jpg)
这是0-2三个地址读出的数据,返回虽然正确,却不符合预期。



(原文件名:456.jpg)
这是从4-6三个地址读出的,写的地址的时候就已经出错了,具体原因,不详。



(原文件名:lx.jpg)
这是从0地址开始,连续读出。返回正确,符合预期。。

出0入0汤圆

 楼主| 发表于 2011-7-26 16:15:12 | 显示全部楼层
继续up...

出0入0汤圆

发表于 2011-7-28 17:09:50 | 显示全部楼层
看得有点乱,看起来最上图与最下图的结果基本吻合,唯一的区别是地址0的数据不对。
怀疑楼主是不是认为0X65以后还要发一次地址啊?实际上0X65后的8个SCL脉冲已经在输出地址0的数据了,而此时主器件还在输出0,因为线与的关系所以抓出的波形此字节显示为全0,然后主器件切换为输入所以后面的字节都是对的了。正确的读序列是写完64、地址、SART、65后立刻开始接收。
上述描述纯属猜测

出0入0汤圆

发表于 2011-7-29 14:59:51 | 显示全部楼层
楼主,你的问题解决了没有?我最近也在用这个时钟芯片,也是有很多问题,能不能请教您一下呀,可以帮我一下吗?感激不尽

出0入0汤圆

 楼主| 发表于 2011-7-29 15:43:22 | 显示全部楼层
回复【9楼】njzr  
看得有点乱,看起来最上图与最下图的结果基本吻合,唯一的区别是地址0的数据不对。
怀疑楼主是不是认为0x65以后还要发一次地址啊?实际上0x65后的8个scl脉冲已经在输出地址0的数据了,而此时主器件还在输出0,因为线与的关系所以抓出的波形此字节显示为全0,然后主器件切换为输入所以后面的字节都是对的了。正确的读序列是写完64、地址、sart、65后立刻开始接收。
上述描述纯属猜测
-----------------------------------------------------------------------

多谢回复,已经解决问题了,程序没有问题,只是在数据读取的时候,按高字节地址读取。在写完数据后,应该当将数据线释放。
看了下时钟芯片,是R8025AC,与当前的芯片手册8025T不符,完全参见8025AC的资料后,正常了。
资料如下。
点击此处下载 ourdev_661887ANOVGI.pdf(文件大小:474K) (原文件名:RX8025SANB.pdf)
参照最后的读写顺序就可以了

出0入0汤圆

发表于 2015-7-7 17:28:10 | 显示全部楼层
您好,请问您一下,您在最后的函数里,定义Dadd=E-PROM,这里的E-PROM是什么含义呢
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-7 21:22

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表