用dsPIC33的IO口模拟IIC,与ISL12026通讯 问题

2020-02-08 09:32发布

用dsPIC33的IO口模拟IIC,与ISL12026通讯,
硬件连接:
RG12-----12026 SCL
RG13-----12026 SDA
调试时发现程序一直停在发送函数“Send_Data”的 while(PORTGbits.RG13);处,
也就是一直在等12026的ASK信号,但没有应答,SCL和SDA的上拉用的是1.2K电阻,没找到合适的,是不是小了?
程序参考了本站莫老的帖子“http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=1733895&bbs_page_no=1&bbs_id=3020”
现在就是想请教各位老师我的程序的问题到底在哪了?
问题的起因:dsPIC33不带EEPROM,外部只剩RG12、13两脚,我以前用的DS1302存储空间太小,而且是SPI协议,
所以现在换了有4K EEPROM的ISL12026,就不会搞IIC了。
谢谢各位老师看到此帖后赐教,期盼您的回复。

我试验的程序如下:


                // 地址  R/W
//  EEPROM->1010    |     |
//                   111    0
//  RTC   ->1101

#define RTC_White_Addr  0xde
#define RTC_Read_Addr   0xdf
#define EEPROM_White_Addr  0x6e
#define EEPROM_Read_Addr   0x6f

#define  Clock_SCL   LATGbits.LATG12
#define  Clock_SDA   LATGbits.LATG13


void I2C_Start (void) //IIC开始      
{   
    TRISGbits.TRISG12=0; //SCL置输出   
    TRISGbits.TRISG13=0; //SDA输出
        Clock_SDA=1;
        asm("nop");
        Clock_SCL=1;
        Delay(8);
        Clock_SDA=0;
        Delay(8);
        Clock_SCL=0;
        Delay(8);
}


void I2C_Stop(void)     //iic结束   
{   
        Clock_SDA=0;
        Delay(8);
        Clock_SCL=1;
        Delay(8);
        Clock_SDA=1;
        Delay(8);
        TRISGbits.TRISG12=1; //释放IIC线
        TRISGbits.TRISG13=1;

}   



void Send_Data (unsigned char Data)
{        unsigned char loop;
        for(loop=8;loop>0;loop--)//送器件寻址地址
                {
                Clock_SDA = Data & 0x1;
                Clock_SCL = 1;
                Data = Data>>1;
                Delay(8);//asm("nop");
                Clock_SCL = 0;
                Delay(8);               
                }
        TRISGbits.TRISG13 = 1; //SDA脚置为输入
        asm("nop");
    while(PORTGbits.RG13);//等待SDA为0,即ACK为0
    TRISGbits.TRISG13 = 0; //SDA脚置为输出
        asm("nop");       
  }


void Clock_I2C_RTC_ByteWrite(unsigned char Data, unsigned int WriteAddr)  // 时钟数据字节写
{
        unsigned char  Addr_H,Addr_L;   
        Addr_L = WriteAddr &  0x00ff;   //低8位地址
        Addr_H = WriteAddr >> 8;        //高8位地址        
        I2C_Start();//  IIC开始
//        Clock_SCL = 0;          //时钟线拉低
        Send_Data(RTC_White_Addr);//送器件寻址地址
        Send_Data(Addr_H);//送目标地址H
        Send_Data(Addr_L);//送目标地址L
        Send_Data(Data);//送数据       
           I2C_Stop(); //IIC结束
}


unsigned char Clock_I2C_RTC_RandomRead(unsigned int ReadAddr) //时钟数据随机读
{   
  unsigned  Addr_H,Addr_L,Data;
        Addr_L = ReadAddr & 0x00ff;   //低8位地址
        Addr_H = ReadAddr>> 8;        //高8位地址        

  Clock_I2C_RTC_ByteWrite(0x02,0x003F);  //进入时钟  这两个指令必须加,不然时钟始终读写不成功
  Clock_I2C_RTC_ByteWrite(0x06,0x003F);

  
        I2C_Start();//  IIC开始
        Send_Data(RTC_White_Addr);//送RTC写寻址地址
        Send_Data(Addr_H);//送目标地址H
        Send_Data(Addr_L);//送目标地址L

        I2C_Start();//  IIC再开始
        Send_Data(RTC_Read_Addr);//送RTC读寻址地址
        Data = Receive_Data();//读数据
           I2C_Stop(); //IIC结束
        return Data;
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
2条回答
fangjikun
1楼-- · 2020-02-08 10:51
// 地址  R/W
//  EEPROM->1010    |     |  
//                   111    0   (1:读  0:写)
//  RTC   ->1101
fangjikun
2楼-- · 2020-02-08 14:43
ISL12026还真是不好用,
现在已经能够通讯了,可以随机读出CCR的状态,比如电池供电时SR的状态是0X80,这是对的,还有PWR的内容是0x40,这也是对的
但是,现在的问题是:
1、随机读出的时间是两秒跳一次,即秒按0、2、4、6、8、10...56、58、00这样变化,
   用if(读出的数 % 2)验证读出的数确实全是偶数,但时间变化的速度是对的,
2、时间值是BCD码的,存的时候将十进制转成BCD,读出来在反向转换,但读出的
   数都不对,
3、不知道莫老师的贴子“http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=1733895&bbs_page_no=1&search_mode=4&search_text=fangjikun&bbs_id=9999”
里的“ RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);     //原程序没有整个语句,不给时钟怎么干活呢。 ”
是怎么个意思??
4、EEPROM页写的是9,随机读出再显示却是8
5、电池供电时不能读EEPROM的内容吗?读出是0,

望高手指点!!1

ourdev_698269TVQ642.txt(文件大小:8K) (原文件名:iic.txt)

一周热门 更多>