This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

I2C with LPC2387

Hi,

I am working on MCB2300(LPC2387).
I have used its sample code for Temperature sensing using I2C and its working fine.
Now I have connected EEPROM (AT24C02) with microcontroller to store some data.
For that I have used same code and did some changes to write and read data from EEPROM.
But its not working properly.
Below is changes which I have done.

int main (void)
{
  DWORD i;

  if ( I2CInit( (DWORD)I2CMASTER ) == FALSE )   /* initialize I2c */
  {
        while ( 1 );                            /* Fatal error */
  }

  /* Configure temp register before reading */
  for ( i = 0; i < BUFSIZE; i++ )    /* clear buffer */
  {
        I2CMasterBuffer[i] = 0;
  }
  I2CWriteLength = 3;
  I2CReadLength = 0;
  I2CMasterBuffer[0] = 0xA0;
  I2CMasterBuffer[1] = 0x00;
  I2CMasterBuffer[2] = 0x10;    /* configuration value, no change from
                                                                default */
  I2CCmd = LM75_CONFIG;
  I2CEngine();

   for ( i = 0; i < BUFSIZE; i++ )   /* clear buffer */
  {
        I2CMasterBuffer[i] = 0;
  }

  I2CWriteLength = 2;
  I2CReadLength = 1;
  I2CMasterBuffer[0] = 0xA1;
  I2CMasterBuffer[1] = 0x00;
  I2CCmd = 0xA0;
  I2CEngine();
  }

Suggest me where I have done mistake.
any link of tutorial for R/W data using LPC2387 will be appreciated.
Hope for best solution.

Thanks
Dhaval

Parents
  • Based on my experience of LPC2368 with AT24LC64, you need to re-write the Interrupt Handler of I2C.

    void I2C0MasterHandler(void) __irq
    {
      BYTE StatValue;
    
      /* this handler deals with master read and master write only */
      StatValue = I20STAT;
    
      // App should clear buffer, not ISR.
      switch ( StatValue )
      {
            case 0x08:    // Master Transmitter mode; Master Receiver mode;
            // A START condition has been transmitted.
                    break;
    
            case 0x10:    // Master Transmitter mode; Master Receiver mode;
            // A repeated START condition has been transmitted.
                    break;
    
            case 0x18:    // Master Transmitter mode;
            // SLA+W has been transmitted; ACK has been received.
                    break;
    
            case 0x28:    // Master Transmitter mode;
            // Data byte in I2DAT has been transmitted; ACK has been received.
                    if (!Dummy_Write)
                    {
                            if ( DatBuf_Idx < I2C_BUFSIZE )
                            {
                              DatBuf_Idx++;
                            }
                            else
                            {
                              DatBuf_Idx = 0;
                            }
                    }
                    else
                    {
                    }
                    break;
    
            case 0x40:    // Master Receiver mode;
            // SLA+R has been transmitted; ACK has been received.
                    break;
    
            case 0x50:    // Master Receiver mode;
            // Data byte has been received; ACK has been returned.
                    DatBuf_Idx++;
                    if ( DatBuf_Idx >= (I2C_BUFSIZE-1) )
                    {
                    }
                    break;
    
            case 0x58:    // Master Receiver mode;
            // Data byte has been received; NOT ACK has been returned.
                    break;
    
            /* Do NOT need-want to Handle. */
            case 0x20:    // Master Transmitter mode;
            case 0x30:    // Master Transmitter mode;
            case 0x38:    // Master Transmitter mode; Master Receiver mode;
            case 0x48:    // Master Receiver mode;
    
            default:
                    I2CMasterState = DATA_ERROR;
                    I20CONCLR = I2CONCLR_SIC;
                    break;
      }
    
      VICVectAddr = 0;              /* Acknowledge Interrupt */
    }
    

Reply
  • Based on my experience of LPC2368 with AT24LC64, you need to re-write the Interrupt Handler of I2C.

    void I2C0MasterHandler(void) __irq
    {
      BYTE StatValue;
    
      /* this handler deals with master read and master write only */
      StatValue = I20STAT;
    
      // App should clear buffer, not ISR.
      switch ( StatValue )
      {
            case 0x08:    // Master Transmitter mode; Master Receiver mode;
            // A START condition has been transmitted.
                    break;
    
            case 0x10:    // Master Transmitter mode; Master Receiver mode;
            // A repeated START condition has been transmitted.
                    break;
    
            case 0x18:    // Master Transmitter mode;
            // SLA+W has been transmitted; ACK has been received.
                    break;
    
            case 0x28:    // Master Transmitter mode;
            // Data byte in I2DAT has been transmitted; ACK has been received.
                    if (!Dummy_Write)
                    {
                            if ( DatBuf_Idx < I2C_BUFSIZE )
                            {
                              DatBuf_Idx++;
                            }
                            else
                            {
                              DatBuf_Idx = 0;
                            }
                    }
                    else
                    {
                    }
                    break;
    
            case 0x40:    // Master Receiver mode;
            // SLA+R has been transmitted; ACK has been received.
                    break;
    
            case 0x50:    // Master Receiver mode;
            // Data byte has been received; ACK has been returned.
                    DatBuf_Idx++;
                    if ( DatBuf_Idx >= (I2C_BUFSIZE-1) )
                    {
                    }
                    break;
    
            case 0x58:    // Master Receiver mode;
            // Data byte has been received; NOT ACK has been returned.
                    break;
    
            /* Do NOT need-want to Handle. */
            case 0x20:    // Master Transmitter mode;
            case 0x30:    // Master Transmitter mode;
            case 0x38:    // Master Transmitter mode; Master Receiver mode;
            case 0x48:    // Master Receiver mode;
    
            default:
                    I2CMasterState = DATA_ERROR;
                    I20CONCLR = I2CONCLR_SIC;
                    break;
      }
    
      VICVectAddr = 0;              /* Acknowledge Interrupt */
    }
    

Children