Forum: Mikrocontroller und Digitale Elektronik LPC2106 und Eeprom M24C16


von Harry (Gast)


Lesenswert?

Hallo,

hat jemand eine Beispiel, wie ich mit einem LPC2106 ein Eeprom M24C16
ansprechen kann? Das Eeeprom liegt an den PIN's P0.2 und P0.3. WC
liegt am Prozessor an P0.4.

Danke
Harry

von Harry (Gast)


Lesenswert?

Hallo,

ich habe jetzt was geschrieben, aber weiss nicht, warum die
Interruptroutine nicht aufgerufen wird.

Nach dem Ausführen des Befehls:   I2CONSET   = 0x00000020;
steht ist das SI - Bit gesetzt, aber die Irq Routine wirde nicht
ausgeführt.


Das Programm sieht so aus:

#include <targets\LPC210x.H>
#include <stdarg.h>

void I2CISR (void) _attribute_ ((interrupt
("IRQ")));                                    //I2C interrupt routine
void I2CTransferByte(unsigned int I2CAddr,unsigned char
MemAddr,unsigned char count,...);      //Background call to start master
send and receive byte transfers

                        //Background call to start master send and
receive byte transfers

unsigned char   message[4] = {0x01,0x02,0x03,0x04};
unsigned char  messageIn[4];
unsigned char   *I2CData,
                I2Counter,
                I2CAddress,
                MemAddress,
                lock;    //Define Function prototypes and Global
variables


int main(void)
{

  lock = 0;

  IODIR = 0x1F;
  IOCLR = 0x10;


  MEMMAP = 0x02;
//Initilise the lock flag

  VICVectCntl1 = 0x00000029;          //select a priority slot for a 
given
interrupt
  VICVectAddr1 = (unsigned)I2CISR;      //pass the address of the IRQ 
into
the VIC slot
  VICIntEnable = 0x00000200;          //enable interrupt

  PINSEL0     = 0x50;             //Switch GPIO to I2C pins

  I2SCLH         = 0x08;            //Set bit rate
14.7456Mhz/VPBDIV+SCLH+SCLL = 14.7456/4+8+8 = 57.6Khz
  I2SCLL    = 0x08;

  __ARMLIB_enableIRQ();

  I2CTransferByte(0xA0,0,4,message);      //write data to the I2C Memory
  I2CTransferByte(0xA0,0,0);          //set address to zero
  I2CTransferByte(0xA1,0,4,messageIn);    //read back data

  while(1) {
    ;
  }
}


void I2CTransferByte(unsigned int I2CAddr,unsigned char
MemAddr,unsigned char count,...)
{
  va_list ap;
  va_start(ap,count);

  while(lock == 1) {
      ;
  }
  lock     = 1;                         //Set I2C bus as active

  I2CAddress   = I2CAddr;            //Place address and data in Globals 
to be
used by the interrupt
  if(count >0)
  {
  I2CData    = va_arg(ap,unsigned char *);
  }
  I2Counter  = count;
  MemAddress  = MemAddr;
  I2CONCLR   = 0x000000FF;          //Clear all I2C settings
  I2CONSET   = 0x00000040;           //Enable the I2C interface
  I2CONSET   = 0x00000020;           //Start condition
  va_end(ap);
}


void I2CISR (void ) //I2C interrupt routine
{

  switch (I2STAT)                //Read result code and switch to next 
action
  {
  // Start and Send byte conditions

    case ( 0x08):                //Start bit
    I2CONCLR   = 0x20;              //Clear start bit
    I2DAT     = I2CAddress;           //Send address and write bit
    break;

    case (0x18):                //Slave address+W, ACK
    I2DAT     = MemAddress;          //Write Mem,ory start address to tx
register
    break;

    case (0x20):                //Salve address +W, Not ACK
    I2DAT     = I2CAddress;           //Resend address and write bi
    break;

    case (0x28):
    if(I2Counter-->0)                //Data sent, Ack
    {
    I2DAT     = *I2CData;            //Write data to tx register
    I2CData++;
    }
    else
    {
    I2CONSET   = 0x10;              //Stop condition
    lock = 0;                             //Signal end of I2C activity
    }
    break;

    case (0x30)  :                //Data sent, NOT Ack
    I2DAT     = *I2CData;            //Write data to tx register
    break;


    //Receive byte conditions

    case (0x40) :                //Slave Address +R, ACK
    I2CONSET   = 0x04;              //Enable ACK for data byte
    break;

    case (0x48) :                //Slave Address +R, Not Ack
    I2CONSET   = 0x20;              //Resend Start condition
    break;

    case (0x50) :                //Data Received, ACK
    if(--I2Counter>0)
    {
    *I2CData   = I2DAT;
    I2CData++;
    }
    else
    {
    I2CONSET   = 0x10;              //Stop condition
    lock     = 0;                        //Signal end of I2C
activity
    }
    break;

    case (0x58):                //Data Received, Not Ack
    I2CONSET = 0x20;              // Resend Start condition
    break;

    default :
    break;

  }

  I2CONCLR   = 0x08;              //Clear I2C interrupt flag
  VICVectAddr = 0x00000000;          //Clear interrupt in

}

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
Noch kein Account? Hier anmelden.