LPC2106 und Eeprom M24C16

Gast #217329
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

}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren