This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
工具与软件:
在下面的代码行中、我可以读取 DS1307时间芯片、不会出现任何问题、但在处理器发生任何挂起或突然复位的情况下、(DL_I2C_isControllerRXFIFOEMpty (I2C_INST))、它会在函数内等待、这样会停止我的系统。 在这种情况下、您会建议使用什么软件方案?
uint8_t readDS1307Register(uint8_t regAddr) { uint8_t data; DL_I2C_fillControllerTXFIFO(I2C_INST, ®Addr, 1); /* Wait for I2C to be Idle */ while (!( DL_I2C_getControllerStatus(I2C_INST) & DL_I2C_CONTROLLER_STATUS_IDLE)) ; /* Send the packet to the controller. * This function will send Start + Stop automatically. */ DL_I2C_startControllerTransfer(I2C_INST, DS1307_ADDRESS, DL_I2C_CONTROLLER_DIRECTION_TX, 1); /* Trap if there was an error */ if (DL_I2C_getControllerStatus(I2C_INST) & DL_I2C_CONTROLLER_STATUS_ERROR) { /* LED will remain high if there is an error */ __BKPT(0); } /* Wait for I2C to be Idle */ while (!( DL_I2C_getControllerStatus(I2C_INST) & DL_I2C_CONTROLLER_STATUS_IDLE)) ; /* Add delay between transfers */ delay_cycles(100); /* Send a read request to Target */ DL_I2C_startControllerTransfer(I2C_INST, DS1307_ADDRESS, DL_I2C_CONTROLLER_DIRECTION_RX, 1); while (DL_I2C_isControllerRXFIFOEmpty(I2C_INST)); data = DL_I2C_receiveControllerData(I2C_INST); if (DL_I2C_getControllerStatus(I2C_INST) & DL_I2C_CONTROLLER_STATUS_ERROR) { printf("I2C Okuma Hatasi!\n"); } return bcdToDec(data); }
您好!
系统复位可能会中断 i2c 写入命令传输进度、从而导致 i2c 目标器件无法响应 i2c 控制器。
2.避免程序在 while (DL_I2C_isControllerRXFIFOEMpty(I2C_INST)中阻塞 超时 可以在这个问题中使用参数。 下面是一个参考示例:
int i2c_read(I2C_Regs *i2c, uint32_t targetAddr, uint8_t *buffer, uint16_t length, uint32_t timeOut) { /* Wait for I2C to be Idle */ while (!( DL_I2C_getControllerStatus(i2c) & DL_I2C_CONTROLLER_STATUS_IDLE)) ; /* Send a read request to Target */ DL_I2C_startControllerTransfer(i2c, targetAddr, DL_I2C_CONTROLLER_DIRECTION_RX, length); /* * Receive all bytes from target. LED will remain high if not all bytes * are received */ for (uint8_t i = 0; i < length; i++) { uint32_t tmpCnt = timeOut; while (DL_I2C_isControllerRXFIFOEmpty(i2c)){ tmpCnt --; /* Receiving time out */ if (tmpCnt == 0) return -1; } buffer[i] = DL_I2C_receiveControllerData(i2c); } return 0; }
此致、
Pengfei