- fchao-Sinus-Wechselrichter AliExpress         
Ergebnis 1 bis 10 von 10

Thema: Sensoren blockieren I2C Bus

Baum-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    05.11.2007
    Beiträge
    1.076
    Meine ersten Funktionen sahen nicht viel anders aus, als ich mit dem I2C Bus angefangen habe:

    Code:
    /******************************************************************************/
    /* tested OKAY */
    /* wait max 5 ms that the SI bit in the I2C0CONSET Register becomes High */
    /* return TRUE if Bit is or goes High in this time */
    /* return FALSE if SI Bit never set in this time */
    /* normaly after clearing the SI bit in the I2CCONSET register, the */
    /* shift transfer startet. 9 clock cycles, 8 data, 1 acknowlwdge. if all */
    /* bits shifted out and the Ackbit received the SI bit sets automatically by */
    /* the hardware. */
    /* shift clock is 100Khz = 10us per bit * 9 = 90 usec. */
    /* timeout was set to 5ms */
    /* !!!! after a stop condition, this bit is alwas zero and never set. */
    /* info: the SystemTickCount increments every milli second TIMER0 Interrupt */ 
    
    BOOL wait_i2c_SI()
    { U32  time;
      
      time = SystemTickCount + 2;         /* 07.11.2011   wait max 2 ms (timeout) */
    
      do 
      {  
        if (LPC_I2C0CONSET & I2CONSET_SI) /* if SI bit is set */
             return TRUE;                 /* return with TRUE */
      } while (SystemTickCount < time);   /* else wait */
     
      /* if the above lines are interrupted, maybe an timout occure */
      /* so we test the SI flag again, after timeout */
      if (LPC_I2C0CONSET & I2CONSET_SI)   /* if SI bit is set after timeout */
             return TRUE;                 /* return with TRUE */  
    
      return FALSE;                       /* else time out return FALSE */
      
    }
    /******************************************************************************/
    
    
    BOOL ee_read(U32   EE_Address,
                  void *DataAddress,
                  U32   DataSize)
    { U32 time;
      volatile U8* dataptr = DataAddress;
    
      /* the EEPROM write cycle time is max 20ms for byte and page write */
      /* maybe we must wait, because the last write is not ready now */
      /* other interrupts may occur, so we set the max waittime to 100ms */
    
      time = SystemTickCount + EE_WRITE_CYCLE_TIME; /* set max waittime to 100 ms*/
      while (ee_busy(EE_Address))
      {
         if ((SystemTickCount > time) && (ee_busy(EE_Address)))
            return FALSE; /* EE BUSY Time Out Error */
      }
    
      LPC_I2C0CONSET = I2CONSET_STA;    /* Set Start flag */
      if (!wait_i2c_SI()) return FALSE;     /* wait until SI Flag is set */
      LPC_I2C0CONCLR = I2CONCLR_STAC;    /* Clear the Start flag */  
    
      LPC_I2C0DAT =  EE_SLAVE_ADDRESS | ((EE_Address >> 8) << 1); /* send Slave Address and the 3 Upper Adressbits */
      LPC_I2C0CONCLR = I2CONCLR_SIC;         /* clear the SI Flag */
                                   /* starts the shift out Device Address */
      if (!wait_i2c_SI()) return FALSE;     /* wait until SI Flag is set */
    
      LPC_I2C0DAT = (U8)(EE_Address);        /* EEPROM Address */
      LPC_I2C0CONCLR = I2CONCLR_SIC;         /* clear the SI Flag */
                                             /* starts the shift out EEPORM Address */
      if (!wait_i2c_SI()) return FALSE;      /* wait until SI Flag is set */
    
      /* reading:  first set the control byte (Slave Address) with RD bit=1 */
      /* include the 3 Upper Adressbits from the eeprom address */
    
      LPC_I2C0CONSET = I2CONSET_STA;    /* Set Start flag, repeated start condition  */
      LPC_I2C0CONCLR = I2CONCLR_SIC;        /* clear the SI Flag, start shift out repeatetd start condition */  
      if (!wait_i2c_SI()) return FALSE;     /* wait until SI Flag is set */
      LPC_I2C0CONCLR = I2CONCLR_STAC;    /* Clear the Start flag */  
    
      LPC_I2C0DAT = EE_SLAVE_ADDRESS | ((EE_Address >> 8) << 1) | I2C_RD_BIT; 
      LPC_I2C0CONCLR = I2CONCLR_SIC;         /* clear the SI Flag */
                                             /* starts the shift out the control byte with RD Bit=1*/
      if (!wait_i2c_SI()) return FALSE;      /* wait until SI Flag is set */
    
      LPC_I2C0CONSET = I2CONSET_AA;      /* assert ACK after every received data byte */
    
      /* start READ LOOP:  */
      while (DataSize--) /* read all data bytes from EEPROM with always ACK */
      {
    
        /* after the last byte the master must send "NACK" to end the sequential read 02.03.2011 */
        if (!DataSize) LPC_I2C0CONCLR = I2CONSET_AA;      /* assert NACK after last byte received 02.03.2011 */
        
        LPC_I2C0CONCLR = I2CONCLR_SIC;         /* clear the SI Flag */
                                               /* starts the shift in data byte */
        if (!wait_i2c_SI()) return FALSE;      /* wait until SI Flag is set */
        *dataptr++ = LPC_I2C0DAT;              /* save received data byte */
      }  
      /* end READ LOOP */
      
      LPC_I2C0CONSET = I2CONSET_STO;         /* set STOP condition, sets SDA-Pin to Low NOW */
      LPC_I2C0CONCLR = I2CONCLR_SIC;         /* clear the SI Flag */
                                             /* starts the shift out STOP Condition */
                                             /* clears the STOP bit */
    /* !!!!!!! SI are never set , dont wait here */
      
      return TRUE;
    }
    2011 habe ich anscheinend das neue EEPROM benutzt und merkte, dass ich ein NACK beim letzten Byte brauche....
    Das war/ist ein CAT24C08 EEPROM
    Geändert von Siro (27.01.2018 um 11:45 Uhr)

Ähnliche Themen

  1. Lift für Riesenglotze - Gasdruckfeder elektronisch blockieren (oder andere Lösung)?
    Von matzrh im Forum Vorstellung+Bilder+Ideen zu geplanten eigenen Projekten/Bots
    Antworten: 3
    Letzter Beitrag: 04.10.2019, 22:57
  2. Blockieren vom Steppermotor erkennen
    Von skywalker1979 im Forum Motoren
    Antworten: 11
    Letzter Beitrag: 01.08.2013, 08:39
  3. Kann ein Nabenmotor blockieren?
    Von Daniel002 im Forum Motoren
    Antworten: 5
    Letzter Beitrag: 24.07.2012, 12:44
  4. Zerstörung von Servos durch blockieren?
    Von avrrobot im Forum Motoren
    Antworten: 1
    Letzter Beitrag: 08.01.2012, 20:52
  5. [ERLEDIGT] IR-Sensoren
    Von highlow im Forum Sensoren / Sensorik
    Antworten: 0
    Letzter Beitrag: 25.10.2005, 15:57

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Labornetzteil AliExpress