We are running a survey to help us improve the experience for all of our members. If you see the survey appear, please take the time to tell us about your experience if you can.
I have several Microchip 8K EEPROMs on my Cypress FX2LP's I2C bus. To read from these larger ROM chips, a specific I2C protocol must be followed...
* Start token Write 2-byte mem location to I2C address * Start token Read n data bytes from I2C address * Stop token
Unfortunately, using the default EXUSB.lib functions results in a "Stop" token placed on the bus after the EZUSB_WriteI2C() function is called...
* Start token Write 2-byte mem read-location to I2C address 0xA6 * Stop token * Start token Read data from I2C address 0xA6 * Stop token
Looking at the EZUSB.lib source code, most of the work is done by an ISR called "i2c_isr()". Obviously, I must modify this function to omit the "Stop" token under certain conditions while writing to the I2C bus.
The problem is, I can't seem to remap the I2C interrupt vector to my new function. I've rebuilt the EZUSB library without the I2C related functions. But when I build my project, a warning message claims my "new_i2c_isr()" function is unused and will be omitted from the image. In other words, the Keil "interrupt" language extension doesn't seem to work in my code...
void new_i2c_isr (void) interrupt 9 { // new code here }
So how do I map my new_i2c_isr() function to the I2C interrupt vector? Has anyone ever modified the I2C behavior of the EZUSB lib?
The hardware guy spec'd the 8KByte chip. We only have two chips in stock, and the other is the tiny 128 bit model. These chips are so tiny I can't read anything.
A bit later...
I just ran a test with a 16-byte write and read. I indeed get the correct data back, except the 16th value is read back wrong.
Either the PDF docs are wrong for the 24AA64 (unlikely) or the wrong chip was used in the build. Since the 16th byte is read back wrong, I suspect the latter.
Thanks for the help Tsuneo.