在 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)); 这不起作用。
这个问题的解决方案是什么... 这背后的原因是什么