| I2C Edge Conditions: |
| ==================== |
| |
| I2C devices may be left in a write state if a read was occuring |
| and the CPU was reset. This may result in EEPROM data corruption. |
| |
| The edge condition is as follows: |
| 1) A read operation begins. |
| 2) I2C controller issues a start command. |
| 3) The I2C writes the device address. |
| 4) The CPU is reset at this point. |
| |
| Once the CPU reinitializes and the read is tried again: |
| 1) The I2C controller issues a start command. |
| 2) The I2C controller writes the device address. |
| 3) The I2C controller writes the offset. |
| |
| The EEPROM sees: |
| 1) START |
| 2) device address |
| 3) START "this start is ignored by most EEPROMs" |
| 4) device address "EEPROM interprets this as offset" |
| 5) Offset in device, "EEPROM interprets this as data to write" |
| |
| The device will interpret this sequence as a WRITE command and |
| write rubbish into itself, i.e. the "offset" will be interpreted |
| as data to be written in location "device address". |
| |
| Notes |
| ----- |
| !!!THIS IS AN UNDOCUMENTED I2C BUS BUG, NOT A IBM 4xx BUG!!! |
| |
| This reset edge condition could possibly be present in every I2C |
| controller and device available. For boards where a I2C bus reset |
| function can be implemented a i2c_init_board() function should be |
| provided and enabled by #define'ing CFG_I2C_INIT_BOARD in your |
| board's config file. Note that this is NOT necessary when using the |
| bit-banging I2C driver (common/soft_i2c.c) as this already includes |
| the I2C bus reset sequence. |
| |
| |
| Many thanks to Bill Hunter for finding this serious BUG. |
| email to: <williamhunter@attbi.com> |
| |
| Erik Theisen <etheisen@mindspring.com> |
| Tue, 5 Mar 2002 23:02:19 -0500 (Wed 05:02 MET) |