Jag har en PIC som skall kommunicera med en RTC via I2C.
Sändning löps igenom, om mottagen data kommer fram kan jag inte inte verifiera på något säkert sätt.
Vid mottagning går allt bra när startbit och adress skickas, sedan vid själva mottagningen så fastnar SDA låg med SCL hög. Endast power off / power on får loss den efter detta.
Det är RTC som håller SDA låg. Tar jag bort kretsen löps programmet igenom och båda linjerna stannar höga precis som de skall. Detsamma om jag skickar en nonsensadress, vilket tyder på att skickad data tycks tas emot som den skall.
Varför låser kretsen SDA på detta sätt? Kan det vara timingproblem? PIC körs i 20MHz och den enda synkningen är att vänta på att SSPIF skall sättas och därefter direkt fortsätta med nästa steg i I2C-proceduren. Jjag använder ingen interrupt till detta, utan kollar bara flaggan.
Mastern skickar alla SCL, kan det vara där det fastnar? Har för mig att SCL ska klockas till endera läge men orkar inte kolla upp just nu pga. knepigt lödarbete som jag gärna vill avsluta idag.
Jo, det vet jag att det är masternsom håller i SCL, men SDA drar slave i när dennaskall sända. Då händer det något så att den inte släpper denna lina. Det tycks finnas en finess i protokollet som gör att slave kan hindra master från attfortsätta klocka just genom att hlla SDA låg i ett bestämt läge och jag tror det är detta som inträffar. Eftersom det är ett engångsförlopp så kan jag inte se med ett vanligt enkelt scope vad det är som händer.
När sista data mottagits skall master skicka NACK och inte ACK som då tydligen betyder att den inte vill ha mera data. Det visste jag inte om och skickade alltså ACK även efteratt haläst sita byten. Efter korrigering så fungerar det!