am335x I2C2配置问题



刚入手am335x(祼机),想利用I2C2来获取当前的时间。代码如下,问题是它发送主机地址时,它一直没有一个应答,一直卡在发送过程中,麻烦请指点一下,谢谢。

main(){

I2CAintcConfigure();

SetupI2C();

configData = 0xA2 ;
ConfigureTimeSensor(configData);

ptrReg = 0x02;

TemperatureRegRead(temperature, ptrReg);

}

static void SetupI2C(void)
{
// I2C1ModuleClkConfig(); // I2C2 clk module
I2C2ModuleClkConfig();
I2CPinMuxSetup(2);

/* Put i2c in reset/disabled state */
I2CMasterDisable(SOC_I2C_2_REGS);

/*
** Upon reset Auto Idel is enabled.
** Hence it is disabled after reset
*/
I2CAutoIdleDisable(SOC_I2C_2_REGS);

/* Configure i2c bus speed to 400khz */
I2CMasterInitExpClk(SOC_I2C_2_REGS, 48000000, 12000000, 400000);

/* Set i2c slave address */
I2CMasterSlaveAddrSet(SOC_I2C_2_REGS, I2C_SLAVE_ADDR); //0xA2

/* Bring I2C module out of reset */
I2CMasterEnable(SOC_I2C_2_REGS);
}

void I2CPinMuxSetup(unsigned int instance)
{

if(instance == 0)
{
HWREG(SOC_CONTROL_REGS + CONTROL_CONF_I2C0_SDA) =
(CONTROL_CONF_I2C0_SDA_CONF_I2C0_SDA_RXACTIVE |
CONTROL_CONF_I2C0_SDA_CONF_I2C0_SDA_SLEWCTRL |
CONTROL_CONF_I2C0_SDA_CONF_I2C0_SDA_PUTYPESEL );

HWREG(SOC_CONTROL_REGS + CONTROL_CONF_I2C0_SCL) =
(CONTROL_CONF_I2C0_SCL_CONF_I2C0_SCL_RXACTIVE |
CONTROL_CONF_I2C0_SCL_CONF_I2C0_SCL_SLEWCTRL |
CONTROL_CONF_I2C0_SCL_CONF_I2C0_SCL_PUTYPESEL );

}
else if(instance == 1)
{
/* I2C_SCLK */
HWREG(SOC_CONTROL_REGS + CONTROL_CONF_SPI0_D1) =
(CONTROL_CONF_SPI0_D1_CONF_SPI0_D1_PUTYPESEL |
CONTROL_CONF_SPI0_D1_CONF_SPI0_D1_RXACTIVE |
CONTROL_CONF_SPI0_D1_CONF_SPI0_D1_SLEWCTRL |
CONTROL_CONF_MUXMODE(2));
/* I2C_SDA */
HWREG(SOC_CONTROL_REGS + CONTROL_CONF_SPI0_CS0) =
(CONTROL_CONF_SPI0_CS0_CONF_SPI0_CS0_PUTYPESEL |
CONTROL_CONF_SPI0_CS0_CONF_SPI0_CS0_RXACTIVE |
CONTROL_CONF_SPI0_D1_CONF_SPI0_D1_SLEWCTRL |
CONTROL_CONF_MUXMODE(2));

}
else if(instance == 2)
{
/* I2C_SCLK */
HWREG(SOC_CONTROL_REGS + CONTROL_CONF_UART_RTSN(1)) =
(CONTROL_CONF_SPI0_D1_CONF_SPI0_D1_PUTYPESEL |
CONTROL_CONF_SPI0_D1_CONF_SPI0_D1_RXACTIVE |
CONTROL_CONF_SPI0_D1_CONF_SPI0_D1_SLEWCTRL |
CONTROL_CONF_MUXMODE(2));
/* I2C_SDA */
HWREG(SOC_CONTROL_REGS + CONTROL_CONF_UART_CTSN(1)) =
(CONTROL_CONF_SPI0_CS0_CONF_SPI0_CS0_PUTYPESEL |
CONTROL_CONF_SPI0_CS0_CONF_SPI0_CS0_RXACTIVE |
CONTROL_CONF_SPI0_D1_CONF_SPI0_D1_SLEWCTRL |
CONTROL_CONF_MUXMODE(2));
}
}

/*
** I2C Interrupt Service Routine. This function will read and write
** data through I2C bus.
*/
void I2CIsr(void)
{
unsigned int status = 0;

/* Get only Enabled interrupt status */
status = I2CMasterIntStatus(SOC_I2C_2_REGS);

/*
** Clear all enabled interrupt status except receive ready and
** transmit ready interrupt status
*/
I2CMasterIntClearEx(SOC_I2C_2_REGS,
(status & ~(I2C_INT_RECV_READY | I2C_INT_TRANSMIT_READY)));

if(status & I2C_INT_RECV_READY)
{
/* Receive data from data receive register */
dataFromSlave[rCount++] = I2CMasterDataGet(SOC_I2C_2_REGS);

/* Clear receive ready interrupt status */
I2CMasterIntClearEx(SOC_I2C_2_REGS, I2C_INT_RECV_READY);

if(rCount == numOfBytes)
{
/* Disable the receive ready interrupt */
I2CMasterIntDisableEx(SOC_I2C_2_REGS, I2C_INT_RECV_READY);

/* Generate a STOP */
I2CMasterStop(SOC_I2C_2_REGS);

}


}
if (status & I2C_INT_TRANSMIT_READY)
{
/* Put data to data transmit register of i2c */
I2CMasterDataPut(SOC_I2C_2_REGS, dataToSlave[tCount++]);

/* Clear Transmit interrupt status */
I2CMasterIntClearEx(SOC_I2C_2_REGS, I2C_INT_TRANSMIT_READY);

if(tCount == numOfBytes)
{
/* Disable the transmit ready interrupt */
I2CMasterIntDisableEx(SOC_I2C_2_REGS, I2C_INT_TRANSMIT_READY);

}

}

if (status & I2C_INT_STOP_CONDITION)
{
/* Disable transmit data ready and receive data read interupt */
I2CMasterIntDisableEx(SOC_I2C_2_REGS, I2C_INT_TRANSMIT_READY |
I2C_INT_RECV_READY |
I2C_INT_STOP_CONDITION);
flag = 0;
}

if(status & I2C_INT_NO_ACK)
{
I2CMasterIntDisableEx(SOC_I2C_2_REGS, I2C_INT_TRANSMIT_READY |
I2C_INT_RECV_READY |
I2C_INT_NO_ACK |
I2C_INT_STOP_CONDITION);
/* Generate a STOP */
I2CMasterStop(SOC_I2C_2_REGS);

flag = 0;
}
}


static void ConfigureTimeSensor(unsigned char configData)
{
dataToSlave[0] = configData;

tCount = 0;
SetupI2CTransmit(1);
}

/* Reads temperature value */
static void TemperatureRegRead(unsigned char *data, unsigned char ptrReg)
{
unsigned int i;
rCount = 0;
tCount = 0;

/* Reg offset of temperature sensor */
dataToSlave[0] = ptrReg;
SetupI2CReception(7);

for(i = 7; i ; i--)
{
*data = dataFromSlave[7-i];
data++;
}
}