mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik LPC2106 und Eeprom M24C16


Autor: Harry (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Harry (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.