Other Parts Discussed in Thread: LAUNCHXL-F28379D
Tool/software: Code Composer Studio
Hello
I encountered a problem when debugging ADS1119:
I2caRegs.I2CSTR.bit.XRDY would not be set to 1, (first time is 1, next and next time always be 0),causing the program to enter an infinite loop.Here is my code
main.c:
.....
while(1)
{
ReadData(0);
ReadData(1);
ReadData(2);
ReadData(3);
}
.......
I2C.c:
#include "F28x_Project.h"
#include "UserFuncs.h"
#include "CtrlParams.h"
#define CMD_Write 0x9C
#define CMD_Read 0x9D
#define CMD_CONF_REG 0x00
#define CMD_STATUS_REG 0x01
float32 data[4] = {0.0, 0.0, 0.0, 0.0};
//
// I2CA_Init - Initialize I2CA settings
//
void I2CA_Init(void)
{
I2caRegs.I2CMDR.bit.IRS =0;
I2caRegs.I2CSAR.all = 0x4E; // Slave address A1 = SCL, A0 = SDA
I2caRegs.I2CPSC.all = 6; // Prescaler - need 7-12 Mhz on module clk
I2caRegs.I2CCLKL = 10; // NOTE: must be non zero
I2caRegs.I2CCLKH = 5; // NOTE: must be non zero
I2caRegs.I2CIER.all = 0x24; // Enable SCD & ARDY interrupts
I2caRegs.I2CMDR.bit.IRS = 1; // Take I2C out of reset
}
Uint16 Config1119(Uint16 port)
{
Uint16 i, chn, config[2];
switch(port)
{
case 0: //channel 0
chn = 0x32;
break;
case 1: //channel 1
chn = 0x42;
break;
case 2: //channel 2
chn = 0x52;
break;
case 3: //channel 3
chn = 0x62;
break;
default:
break;
}
// config[0] = CMD_Write;
config[0] = CMD_CONF_REG;
config[1] = chn;
if (I2caRegs.I2CSTR.bit.BB == 1)
{
return I2C_BUS_BUSY_ERROR;
}
while(!I2C_xrdy());
I2caRegs.I2CSAR.all = 0x4E;
I2caRegs.I2CCNT = 2;
I2caRegs.I2CMDR.all = 0x6E20;
for (i=0; i<2; i++)
{
while(!I2C_xrdy());
I2caRegs.I2CDXR.all = config[i];
if (I2caRegs.I2CSTR.bit.NACK == 1)
return I2C_BUS_BUSY_ERROR;
}
DELAY_US(3000);
return I2C_SUCCESS;
}
Uint16 StatusRegister(void)
{
//First frame
if (I2caRegs.I2CSTR.bit.BB == 1)
{
return I2C_BUS_BUSY_ERROR;
}
while(!I2C_xrdy());
I2caRegs.I2CSAR.all = 0x4E;
I2caRegs.I2CCNT = 1;
// I2caRegs.I2CDXR = CMD_Write;
I2caRegs.I2CMDR.all = 0x6E20;
if (I2caRegs.I2CSTR.bit.NACK == 1)
return I2C_BUS_BUSY_ERROR;
while(!I2C_xrdy());
//I2caRegs.I2CDXR.all = CMD_STATUS_REG;
I2caRegs.I2CDXR.all = 0x24; //RREG command
if (I2caRegs.I2CSTR.bit.NACK == 1)
return I2C_BUS_BUSY_ERROR;
//Second frame
if (I2caRegs.I2CSTR.bit.BB == 1)
{
return I2C_BUS_BUSY_ERROR;
}
while(!I2C_xrdy());
I2caRegs.I2CSAR.all = 0x4E;
I2caRegs.I2CCNT = 1;
I2caRegs.I2CMDR.all = 0x6C20;
if (I2caRegs.I2CSTR.bit.NACK == 1)
return I2C_BUS_BUSY_ERROR;
else
return I2caRegs.I2CDRR.all >> 7;
//return I2C_SUCCESS;
}
Uint16 ReadData(Uint16 port)
{
Uint16 i, temp[2] = {0, 0}, dt = 0;
if(I2C_SUCCESS == Config1119(port))
{
if(StatusRegister() == 0x01)
{
//First frame
while(!I2C_xrdy());
I2caRegs.I2CSAR.all = 0x4E;
I2caRegs.I2CCNT = 1;
I2caRegs.I2CMDR.all = 0x6E20;
if (I2caRegs.I2CSTR.bit.NACK == 1)
return I2C_BUS_BUSY_ERROR;
while(!I2C_xrdy());
I2caRegs.I2CDXR.all = 0x10; //RDATA command
if (I2caRegs.I2CSTR.bit.NACK == 1)
return I2C_BUS_BUSY_ERROR;
//Second frame
I2caRegs.I2CSAR.all = 0x4E;
I2caRegs.I2CCNT = 2;
I2caRegs.I2CMDR.all = 0x6C20;
if (I2caRegs.I2CSTR.bit.NACK == 1)
return I2C_BUS_BUSY_ERROR;
for(i=0; i<2; i++)
{
while(!I2C_rrdy());
temp[i] = I2caRegs.I2CDRR.all;
if (I2caRegs.I2CSTR.bit.NACK == 1)
return I2C_BUS_BUSY_ERROR;
}
}
}
dt = temp[0]<<8 | temp[1];
data[port] = dt*1.25/10000;
DELAY_US(500);
return I2C_SUCCESS;
}
Uint16 I2C_xrdy()
{
Uint16 t;
t = I2caRegs.I2CSTR.bit.XRDY;
return t;
}
Uint16 I2C_rrdy()
{
Uint16 t;
t = I2caRegs.I2CSTR.bit.RRDY;
return t;
}