刚入手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++;
}
}