Gast KnapsackSolver Geschrieben 26. März 2014 Geschrieben 26. März 2014 Hallo Community, ich arbeite mich gerade in den PIC32 ein. Hierbei liegt mein Hauptaugenmerk auf dem Bus I2C... > Hat dazu jemand vollständigen Code, mit einem PIC18XXXX bin ich damit vertraut, jedoch ist die Struktur im vergleich zu einem PIC32 deutlich anders. Ich hoffe mir kann jemand helfen... Im Moment sieht der Code so aus, jedoch weiß ich nicht, ACKs abfangen kann oder aber schauen kann ob die Bits richtig gesetzt sind... Danke für eure Hile.... void i2cInit(){ I2CConfigure(I2C1,I2C_ENABLE_HIGH_SPEED); I2CSetFrequency(I2C1,GetSystemClock(),100000); OpenI2C1(I2C_EN,0); I2CEnable(I2C1,TRUE); } UINT8 getDataI2C(UINT8 u8_address){ IdleI2C1(); StartI2C1(); if(MasterWriteI2C1(u8_address)==0){ IdleI2C1(); return MasterReadI2C1(); }else{ return i2cReadAddressFailure; } } /** * Sendet über den Bus an eine definierte Adresse die definierten Daten * @param u8_address -> Adresse des Bus * @param u8_data -> Adresse der Daten */ UINT8 dataSendI2C(UINT8 u8_address, UINT8 u8_data){ IdleI2C1(); StartI2C1(); if(MasterWriteI2C1(u8_address)==0){ IdleI2C1(); if(MasterWriteI2C1(u8_data)==0){ IdleI2C1(); StopI2C1(); return i2cWriteOK; }else{ return i2cWriteDataFailure; } }else{ return i2cWriteAddressFailure; } } Also detailiert geht die Frage an alle raus, was muss hier noch geändert werden im Bezug auf: -> Initialisierung des BUS -> Wie schaue ich ob eine Bus-Collision detektiert wurde ->Wie schaue ich ob ein ACK erhalten wurde etc. pp, unter PIC18XXXX wurde dies folgend erledigt: UINT8 dataSendI2C(UINT8 u8_adress, UINT8 u8_data) { IdleI2C(); // Verfuegbar StartI2C(); // Startkondition while (SSPCON2bits.SEN); // Warten bis die Startkondition abgelaufen ist if (PIR2bits.BCLIF) { // Bus belegt? Kollision vorhanden? return (BUS_COLLISON); // Kollision ist vorhanden } else { // Keine Kollision /******************* Adressierung übertragen *******************/ if (WriteI2C(u8_adress)) { // Adressierung übermitteln return (WRITE_COL_ADR); // schreiben erfolgreich } IdleI2C(); // Verfuegbar if (!SSPCON2bits.ACKSTAT) { // ACK erhalten /***************** Daten übertragen *******************/ if (WriteI2C(u8_data)) { // Daten übermitteln return (WRITE_COL_COM); // Schreiben erfolgreich } } else { return (NO_ACK); // Kein ACK erhalten } } IdleI2C(); // Verfuegbar StopI2C(); // I2C Stop Kondition while (SSPCON2bits.PEN); // Stop Kondition if (PIR2bits.BCLIF) { // Bus belegt? Kollision vorhanden? return (BUS_COLLISON); // Kollision ist vorhanden } return (NO_ERROR); // Kein Error } Danke schonmal für eure Hilfe Zitieren
RustyBob Geschrieben 28. April 2014 Geschrieben 28. April 2014 Es ist grundsätzlich sehr schwer zu sagen was du da machst, da sich das meiste hinter unbekannten Funktionen und Makros versteckt. So vom orakeln wuerde ich mal sagen dieser Aufruf ist nicht notwendig OpenI2C1(I2C_EN,0); und der start sollte vor den Idle wandern. Warum ein PIC? Zitieren
Gast KnapsackSolver Geschrieben 19. Mai 2014 Geschrieben 19. Mai 2014 Wieso denn kein PIC ? Billig, grosser Speicher, Erfahrungen mit den Vorgängern etc Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.