Een beetje een raar avontuur met I2C gehad en dit moederbord. Alles lijkt een tijdje perfect te werken, maar dan komt er ineens een hoop poep binnen wanneer ik aan een encoder draai, en zie ik data die lijkt te impliceren dat er allerlei extra knoppen worden ingedrukt en loseglaten. Alsof de SAM3X zijn sync kwijt is aan de kant van de data-lijn. Als ik lang genoeg I2C data blijf veroorzaken, schiet de boel uiteindelijk in een mode waar alle I2C-transacties helemaal uit-erroren.
Na me helemaal suf te lezen blijkt dat de I2C-implementatie van de Due, zeker vlak na het uitkomen, niet helemaal jé-van-het was. Er zit sowieso een wat zwakke pull-up op van 1KΩ, en de boel schijnt inderdaad nogal rot om te gaan met bus errors.
Uiteindelijk heb ik een gekke oplossing gevonden, bijna uit meer geluk dan wijsheid: Voor het doen van een I2C lees-transactie breng ik nu de klok- en data-pinnen handmatig laag. De problemen zijn nu als sneeuw voor de zon verdwenen, met alleen zo af-en-toe 1 onzin-read die ik nog eruit kan debouncen. Ik kan nu met heel lang harken en verkeer veroorzaken soms in een situatie komen waarin hij alsnog met niets dan I2C errors terugkomt. Als ik op dat moment de stroom van de reset-pinnen afhaal en terugzet herstelt dat zichzelf.
Als geluk bij een ongeluk hangen de reset-pinnen van de betrokken ICs ook nog aan mijn klungelige bypass, dus ik kan dat nu naar een pin op de extensie-poort leiden om die volle bus-reset ook te automatiseren.
Ik ga voor de nieuwe revisie van het PCB wel wat doen om de I2C-bus wat bewuster in de layout te betrekken. Ik schakel dan gelijk over naar de secundaire I2C-poort op de Due, zodat ik er handmatig een stevigere pull-up aan kan hangen. Ik heb het gevoel dat het feit dat mijn 'trek de bus even laag'-truukje effect heeft impliceert dat de bus moeite heeft in deze hoek.
In ieder geval kan ik verder zonder deze versie van het PCB gelijk weg te moeten gooien.