while(I2C_GetFlagStatus(I2Cx, I2C_FLAG_BUSY)) { if((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback(4); } /* Send START condition */ I2C_GenerateSTART(I2Cx, ENABLE); I2CTimeout = I2CT_FLAG_TIMEOUT; /* Test on EV5 and clear it */ while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_MODE_SELECT)) { if((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback(5); } /* Send EEPROM address for write */ I2C_Send7bitAddress(I2Cx, DevAddress, I2C_Direction_Transmitter); I2CTimeout = I2CT_FLAG_TIMEOUT; /* Test on EV6 and clear it */ while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) { if((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback(6); } /* Send the EEPROM's internal address to write to */ I2C_SendData(I2Cx, WriteAddr);
I2CTimeout = I2CT_FLAG_TIMEOUT; /* Test on EV8 and clear it */ while(! I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_TRANSMITTED)) { if((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback(7); }
/* While there is data to be written */ while(NumByteToWrite--) { /* Send the current byte */ I2C_SendData(I2Cx, *pBuffer);
/* Point to the next byte to be written */ pBuffer++; I2CTimeout = I2CT_FLAG_TIMEOUT;
/* Test on EV8 and clear it */ while (!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_TRANSMITTED)) { if((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback(8); } }
I2CTimeout = I2CT_FLAG_TIMEOUT; /* Test on EV6 and clear it */ while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) { if((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback(11); } /* Clear EV6 by setting again the PE bit */ I2C_Cmd(I2Cx, ENABLE);
/* Send the EEPROM's internal address to write to */ I2C_SendData(I2Cx, ReadAddr);
I2CTimeout = I2CT_FLAG_TIMEOUT; /* Test on EV8 and clear it */ while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_TRANSMITTED)) { if((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback(12); } /* Send STRAT condition a second time */ I2C_GenerateSTART(I2Cx, ENABLE); I2CTimeout = I2CT_FLAG_TIMEOUT; /* Test on EV5 and clear it */ while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_MODE_SELECT)) { if((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback(13); } /* Send EEPROM address for read */ I2C_Send7bitAddress(I2Cx, DevAddress, I2C_Direction_Receiver); I2CTimeout = I2CT_FLAG_TIMEOUT; /* Test on EV6 and clear it */ while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)) { if((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback(14); } /* While there is data to be read */ while(NumByteToRead) { if(NumByteToRead == 1) { /* Disable Acknowledgement */ I2C_AcknowledgeConfig(I2Cx, DISABLE); /* Send STOP Condition */ I2C_GenerateSTOP(I2Cx, ENABLE); }
/* Test on EV7 and clear it */ I2CTimeout = I2CT_LONG_TIMEOUT; while(I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_RECEIVED)==0) { if((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback(3); } { /* Read a byte from the EEPROM */ *pBuffer = I2C_ReceiveData(I2Cx);
/* Point to the next location where the byte read will be saved */ pBuffer++; /* Decrement the read bytes counter */ NumByteToRead--; } }
/* Enable Acknowledgement to be ready for another reception */ I2C_AcknowledgeConfig(I2Cx, ENABLE); return0; }