用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;
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。