Hallo, ich soll mal 2 funktionen entwerfen die halt lesen und schreiben vom I2C Bus bzw. von z.B. einen RTC-Baustein etc., aber jetzt gehts nur ums lesen und schreiben. Das Ganze muss ich in C programmieren, hier mal meine Ansätze: http://pastebin.com/xmg9B2nt Also beim Schreiben ist es ja so das bei SCL=0, SDA ändern darf, also wenn SCL=0, soll man Daten auf SDA-Leitung übertragen. start condition brauch ich ja hier nicht, weil ich das ja dann außerhalb später vom unterprogramm machen, also bevor ich das aufrufe, die 2 Unterprogramme sollen nur readByte und WriteByte können. Wenn jetzt das Ack kommt vom Empfänger, wie soll ich da mit dem Takt weiter machen? Muss da SCL auch 0 sein, wenn das ACK kommt? Oder wie ist das? Jetzt zum Lesen: Naja wie ist es hier mit dem SCL? Muss ich da SCL auch 0 sein, wenn ich einen Zustand/Bit von SDA lesen will? Und hier bekomm ich ja ein Acknowledge, was soll ich mit dem anfangen? Wenn ACK=1, dann nix mehr senden und wenn ACK=0, dann weitere Daten senden richtig? Aber wie hängt das alles zusammen, ich weiß nicht was ich mit dem ACK bei der write und read funktion machen soll. Könnt ihr mir bitte helfen? Und überbrüft eventuell auch den Code, also ob das stimmt wie ich das rausschreiben bzw. lese dann. Danke! mfg guest123
Ich empfehle dringend diese Lektüre: http://www.nxp.com/documents/other/39340011.pdf http://www.ipd.uka.de/~buchmann/microcontroller/i2c.htm
Danke, dass auf Deutsch kenne ich und hab ich mir schon durchgelesen. Trotzdem ist mir das nicht klar und meine Fragen sind noch offen. Bitte kann mir jemand helfen.
guest123 schrieb: > Bitte > kann mir jemand helfen. Welchen µC verwendest du und wie sieht dein vollständiges Progrann aus (bitte hier posten)?
uC: AT89S8253 Hier das Programm: void IIC_init() //schaut das beide leitungen auf high und vlt in der reihenfolge das eine stopkondition entsteht. { SDA=1; SCL=1; } /** * Wartet 5us * @param * @return */ void wait5us() { _nop_(); // ein NOP dauert 0.5us _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); } /** * Start Condition * @param - * @return - */ void startCond() { SDA=0; wait5us(); SCL=0; } /** * Stop Condition * @param - * @return - */ void stopCond() { SCL=1; wait5us(); SDA=1 } /** * Datenbyte lesen * @param bAck * @return uchData */ unsigned int IIC_read_byte(bit bAck) { unsigned char x = 0; unsigned char uchData = 0; while(x < 8) { uchData = (uchData<<1) | (unsigned char)SDA; } SDA=bAck; return(uchData); } /** * Datenbyte rausschreiben(fängt mit msb an) * @param uchData * @return bAck */ bit IIC_writeByte(unsigned char uchData) { unsigned char x = 0; bit bAck = 0; while(x < 8) { SCL=0; wait5us(); SDA=(uchData & AND_MASK)>>7; uchData=uchData<<1; SCL=1 wait5us(); x++; } bAck=SDA; return(bAck); }
Ups, nix Interrupt? Dann schau einmal hier: http://www.atmel.com/Images/CODE_0507.zip von der Seite: http://www.atmel.com/products/microcontrollers/8051architecture/default.aspx?tab=documents
Naja, inwiefern wir dein Interrupt verwendet/ausgelöst bei I2C Bus?
Danke, aber naja das ist asm code, wenn ich mich jetzt da auch noch hinein denke etc., dann komme ich nie zu einer Lösung, ich muss das in C programmieren, wie schon gepostet oben.
guest123 schrieb: > das ist asm code, wenn ich mich jetzt da auch noch > hinein denke Dein Code ist von der Struktur im gleichen Stil. Alle notwendigen Teile sind im Atmel Code enthalten, Start Stop Ack Nack. Die Umsetzung nach C ist trivial. Und Interrupts nehme ich bei allen zeitabhängigen Dingen. NOP uns andere Dinge ums aktive Warten sind böse, sehr böse.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.