Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

I2C EEPROM Odczyt sekwencyjny - Błąd

xarusx 29 Gru 2010 13:19 943 0
  • #1 29 Gru 2010 13:19
    xarusx
    Poziom 13  

    Witam
    mój problem to odczyt sekwencyjny z pamięci I2C EEPROM 24FC128.
    Układ Master (18F4550) - Slave(I2C EEPROM)
    W tej pamięci adres jest 2-bajtowy, funkcja i2cSetAddress(ucControl, uiAddress) działa poprawnie.

    Magistrale skonfigurowałem na 100kHz, wszystkie operacje (zapis/odczyt pojedynczego bajtu, zapis strony) działają poprawnie ale odczyt sekwencyjny sprawia kłopoty :cry:

    Odczyt sekwencyjny (strona 10) - 24FC128

    Błąd objawia się tym, że funkcja odczytuje tylko wartości 0xFF
    Czy o czymś zapomniałem lub coś przegapiłem?

    Code:

    char i2cReadSequence(unsigned char ucControl, unsigned int uiAddress, unsigned char *ucData, unsigned int uiDataSize)
    {
       unsigned int uiErr;
       unsigned int licznik;
       // SEND DEVICE AND BYTE ADDRESS
       uiErr = i2cSetAddress(ucControl, uiAddress);
       if(uiErr){
          return (uiErr); // setting the address failed
       }
       // SEND START
       RestartI2C(); // generate I2C bus restart cond
       while(SSPCON2bits.RSEN); // wait until re-start cond over
       if(PIR2bits.BCLIF){ // test for bus collision
          return ( -1 ); // return Bus Collision error
       }
       // SEND CONTROL BYTE
       if(WriteI2C( ucControl | 1)){ // write 1 byte with R/!W bit set
          return ( -3 ); // return Write Collision error
       }
       IdleI2C(); // ensure module is idle
       if(SSPCON2bits.ACKSTAT){ // test ACK condition,
          return ( -2 ); // return with Not Ack error
       }
       // READ DATA BYTEs
    /////////////////////Problem: /////////////////////////////////////
       for(licznik=0;licznik<uiDataSize;licznik++){
          SSPCON2bits.RCEN = 1; // enable master for 1 byte reception
          //while(!SSPSTATbits.BF);
          while(SSPCON2bits.RCEN); // check that receive sequence is over
          ucData[licznik]=SSPBUF; // <----- odczyt z bufora
          if (PIR2bits.BCLIF){ // test for bus collision
             return ( -1 ); // return Bus Collision error
          }
             
          if(licznik==(uiDataSize-1)){   // ostatni bajt odczytu (kończy się NoACK)
             NotAckI2C();
             while(SSPCON2bits.ACKEN); // wait until ACK sequence is over
          }else{   // każdy odebrany bajt potwierdzany ACK (oprócz ostatniego)
             IdleI2C(); // ensure module is idle
             if(SSPCON2bits.ACKSTAT){ // test for ACK condition,
                return ( -2 ); // return Not Ack error
             }   
          }
       }
    //////////////////////////////////////////////
       // SEND STOP
       StopI2C(); // send STOP condition
       while(SSPCON2bits.PEN); // wait until stop condition is over
       if (PIR2bits.BCLIF){ // test for bus collision
          return ( -1 ); // return Bus Collision error
       }
       // ALL DONE, OK.
       return (licznik);
    }

    0 0
  Szukaj w 5mln produktów