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

2020-01-20 18: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 结束*/
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
12条回答
wanglemima
1楼-- · 2020-01-20 23:23
UP...
wanglemima
2楼-- · 2020-01-21 01:32
最神奇的地方在于,在读写EEPROM的时候,可以按地址,正常读写...
keen9327
3楼-- · 2020-01-21 05:30
这情况可能和程序关系不大,看看RX8025资料,有的芯片需要先写一次寄存器地址什么的才能再写数据
wanglemima
4楼-- · 2020-01-21 07:30
嗯,看资料上和EEPROM操作是一样的,除了地址长度,8025是一个字节,EEPROM一般是两个字节,其它一样。
资料如下:

点击此处下载 ourdev_660850YOJR45.pdf(文件大小:663K) (原文件名:RX8025.pdf)
wanglemima
5楼-- · 2020-01-21 08:25
 精彩回答 2  元偷偷看……
njzr
6楼-- · 2020-01-21 13:48
8025的地址在高半字节,看资料要仔细!
你的读是从0开始顺序读的吧?所以发现不了

一周热门 更多>