I have I2C errors that I haven't been able to resolve, and have been wondering if it may be a silicon issue.
I'm using a F5529 (master), communicating to a F2132 (slave). During an exchange, it appears as though the slave will fail to load data into the receive buffer and the master continues to clock SCL for an extended period. Usually it's not until another transmission from the master that it will recover. Intervention with a UCS reset or sending a stop bit does not generate a recovery.
I have already implemented and tested the workaround for the F2132, as described in the errata USCI26.
I have accommodated the USCI30 extra byte receive issue, as it is not possible to circumvent this without the STP and STT IRQs working in master mode.
I2C is running 390kHz on UCB (also tried at 300kHz), with send receive packets occuring 300..400 times per second. Comms failures are occuring multiple times per second.
http://www.eclipze.com.au/temp/ti/scope_0.bmp
scope_0.bmp : SDA goes high and remains high, while SCL continously clocks without regard to requested receive quantity. Yellow trace shows the point of a forced timeout. Does not matter if I issue STOP or do a SWRST. However issuing a SWRST during this failed period causes a glitch on UCA (doesn't cause a problem on the other channel to issue a SWRST at any other time).
http://www.eclipze.com.au/temp/ti/scope_1.bmp
scope_1.bmp: Shows magnified of the start of the capture.
http://www.eclipze.com.au/temp/ti/scope_2.bmp
scope_2.bmp: Shows the point where comms fails. SDA transitions during SCL high.
http://www.eclipze.com.au/temp/ti/scope_3.bmp
scope_3: Shows that in some cases, both SCL and SDA go low and successive timeouts occurs, without immediate recovery.
Code segments...
http://www.eclipze.com.au/temp/ti/master.s43
http://www.eclipze.com.au/temp/ti/slave.s43
I've used I2C in applications before and have the expectation of 100% data throughput.
This application uses DMA on the master for transmit and receive. It's a real time application that will have a high CPU load, so I cannot introduce any delay loops to test for start/stop flags etc... I did try removing the DMA and going to IRQ transmit/receive on the master, however the problem still existed.
I've spent nearly a week stressing over this I2C link trying to resolve the problem, and I really don't want to consider removing both MSP430's from the design over this problem. I've already got stock on the shelf of both these micros for the pre-production run.
Does anyone have any ideas on the cause of the faults? I would really appreciate any help with this.
Cheers,
Tony