dspic33 iic模块通讯不了

2020-02-08 09:31发布

我用dspic33的iic1,同外部EEPROM  RTC通讯,时钟不成功,收到的数据时钟是0(或程序在等接收数据,见Receive_Data()接收函数)
硬件没有问题,我已经检查好几遍了,上拉5K电阻,麻烦用过此模块的前辈指教。


程序如下:


void Clock_Init(void) //IIC初始化
{

        TRISGbits.TRISG2 = 1;
        TRISGbits.TRISG3 = 1;

        I2C1BRG = 0x004f; //  OSC是8MHZ  目标100KHZ,
       
        I2C1CON = 0x1200;
       
        I2C1RCV = 0x0000;
        I2C1TRN = 0x0000;

       
        I2C1CON = 0x9200;
        I2C1CONbits.I2CEN=1;

        I2C2CONbits.I2CEN=1;
}


void I2C_Start (void)      
{

        I2C1CONbits.SEN = 1;         
        while (I2C1CONbits.SEN);


}   


void I2C_Stop(void)         
{
        I2C1CONbits.PEN = 1;         
        while (I2C1CONbits.PEN);
}   


void IdleI2C(void)
{
        while (I2C1STATbits.TRSTAT);//等总线不忙
}


void RestartI2C(void)// IIC重启动信号
{
        I2C1CONbits.RSEN = 1;         
        while (I2C1CONbits.RSEN);         
        //return(I2C1STATbits.S);         
}


void Send_Data (unsigned char Data)//发送以字节数据
{
        I2C1TRN = Data;                 
        while (I2C1STATbits.TBF);         

  }


unsigned char Receive_Data(void)//接收以字节  
{
/*        I2C1CONbits.RCEN = 1;                 
        Nop();
        while(I2C1CONbits.RCEN); //主器件接收完数据的第8位后由硬件清零, 测试
//        while(!I2C1STATbits.RBF);        //问题主要在这,一直在等接收寄存器满,
        return(I2C1RCV);                         
*/

        //用此部分代码得到的数据始终是0
unsigned char Data;
I2C1CONbits.RCEN = 1;
while(I2C1CONbits.RCEN);
I2C1STATbits.I2COV = 0;
        Nop();
Data = I2C1RCV;
return(Data);

}


unsigned char Clock_I2C_RTC_RandomRead(unsigned char ReadAddr) //时钟随机读 (读一个字节数据)
{   
  unsigned char Data;//Addr_L,; //Addr_H,
//        Addr_L = ReadAddr;// & 0x00ff;   //低8位地址
//        Addr_H = 0x00;//ReadAddr>> 8;        //高8位地址
       
          IdleI2C();//检查总线状态

        I2C_Start();//  IIC开始
        while(I2C1CONbits.SEN);

        Send_Data(RTC_White_Addr);//送RTC写寻址地址
        while(I2C1STATbits.TRSTAT);//等到不在发送状态
        while(I2C1STATbits.ACKSTAT);//等待ACK,测试

                 

        Send_Data(0x00);//Addr_H);//送目标地址H
        while(I2C1STATbits.TRSTAT);//等到不在发送状态         
        while(I2C1STATbits.ACKSTAT);//等待ACK,测试



        Send_Data(ReadAddr);//Addr_L);//送目标地址L
        while(I2C1STATbits.TRSTAT);
        while(I2C1STATbits.ACKSTAT);//等待ACK,测试



        RestartI2C();//  IIC再开始
        while(I2C1CONbits.RSEN);

        Send_Data(RTC_Read_Addr);//送RTC读寻址地址
        while(I2C1STATbits.TRSTAT); //等到不在发送状态
        while(I2C1STATbits.ACKSTAT);//等待ACK,测试



        Data = Receive_Data();//读数据

        NoAckI2C();//回应NOACK

           I2C_Stop(); //IIC结束
while(I2C1CONbits.PEN);

        return Data;
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
gaolf_2000
1楼-- · 2020-02-08 11:00
检查一下rtc的型号和读写地址
kakarotto
2楼-- · 2020-02-08 11:12
用的是dspic33的哪一颗芯片?
在芯片的配置字里有有一位 ALTI2C,是设置I2C映射引脚的,看一下是否设置正确
用示波器,看下信号是否正常
fangjikun
3楼-- · 2020-02-08 15:30
 精彩回答 2  元偷偷看……
fangjikun
4楼-- · 2020-02-08 16:53
故障好像找到了,用单步执行发现在发送启动信号时,I2CxSTAT状态寄存器的bit10位是1,就是发生了总线冲突
(原因还在摸索。。硬件为单片机IIC口连接rtc的IIC口)

一周热门 更多>