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