在 TMS320F280025c 开发板的 i2c 协议中"i2cbus_scan function"的用途是什么。当我尝试连接 DS3231 RTC im 时,它卡在 i2c 总线扫描功能中...
uint16_t I2CBusScan(uint32_t base, uint16_t *pAvailableI2C_targets)
{
uint16_t probeTargetAddress, i;
//Disable interrupts on Stop condition, NACK and arbitration lost condition
I2C_disableInterrupt(base, (I2C_INT_ADDR_TARGET|I2C_INT_STOP_CONDITION | I2C_INT_ARB_LOST | I2C_INT_NO_ACK));
i = 0;
for(probeTargetAddress=1;probeTargetAddress<=MAX_10_BIT_ADDRESS;probeTargetAddress++)
{
//Check I2C bus status
status = checkBusStatus(base);
if(status)
{
ESTOP0;
return status;
}
I2C_setConfig(base, (I2C_CONTROLLER_SEND_MODE | I2C_REPEAT_MODE));
//Enable 10-bit addressing if probeTargetAddress is greater than 127U
if(probeTargetAddress > MAX_7_BIT_ADDRESS)
{
//10-bit addressing
I2C_setAddressMode(base, I2C_ADDR_MODE_10BITS);
}
// Setup target address
I2C_setTargetAddress(base, probeTargetAddress);
I2C_sendStartCondition(base);
//Wait for the target address to be transmitted
while(!(I2C_getStatus(base) & I2C_STS_REG_ACCESS_RDY));
//Generate STOP condition
I2C_sendStopCondition(base);
//Wait for the I2CMDR.STP to be cleared
while(I2C_getStopConditionStatus(base));
//Wait for the Bus busy bit to be cleared
while(I2C_isBusBusy(base));
uint16_t I2CStatus = I2C_getStatus(base);
//If target address is acknowledged, store target address
//in pAvailableI2C_targets
if(!(I2CStatus & I2C_STS_NO_ACK))
{
pAvailableI2C_targets[i++] = probeTargetAddress;
}
//Clear NACK bit in I2CSTR
I2C_clearStatus(base,I2C_STS_NO_ACK|I2C_STS_ARB_LOST|I2C_STS_REG_ACCESS_RDY|I2C_STS_STOP_CONDITION);
}
I2C_setConfig(base, (I2C_CONTROLLER_SEND_MODE));
I2C_setAddressMode(base, I2C_ADDR_MODE_7BITS); //7-bit addressing
I2C_enableInterrupt(base, (I2C_INT_ADDR_TARGET|I2C_INT_STOP_CONDITION | I2C_INT_ARB_LOST | I2C_INT_NO_ACK));
return SUCCESS;
}
我震惊于
while (!(I2C_getStatus (base)和 I2C_STS_REG_ACCESS_RDY)); 这不起作用。
这个问题的解决方案是什么... 这背后的原因是什么