I2C stat larda sorun

Başlatan c0bra, 30 Kasım 2010, 23:35:01

c0bra

merhabalar arkadaşlar

lpc2104 ile 24c16 yi i2c vasıtasıylar haberleştiriyorum.Ancak sorun şu:

Veriyi gönderiyorum ancak, STAT durumlarından 0x18 ve 0x28 durumlarını göremiyorum. Bunların yerine 0x20 ve 0x30 durumlarını görüyorum yalnızca.yani datayı ilk gönderdiğimde değilde, aynı veriyi tekrar gönderdiğimde haberleşme gerçekleşiyor.
Bu 0x18 ve 0x28 ACK nin alındığı verinin gönderildiği durumlar
     0x20 ve 0x30 ise  (not)ACK nin alındğı durumlar dır.
     keil ve proteus kullanıyorum.
Selam olsun sizlere...




kod biraz karışık ama onuda gönderiyorum

#include <LPC210x.H>
void Initialize(void);

/* I2C ISR */
__irq void I2C_ISR(void);
/* Master Transmitter states */
void ISR_8(void);
void ISR_18(void);
void ISR_28(void);
//void ISR_20(void);
void ISR_30(void);
void delay(void);

unsigned char data[4]={0x01,0x02,0x04,0x08};
int i=0;
/*************************** MAIN ************************/
int main()
{
/* Initialize system */
Initialize ();
/* Send start bit */
I2DAT=0xA0;
I2CONSET=0x20;
/* Do forever */
while(1) ;

}
/*************** System Initialization ***************/
void Initialize()
{
/* Remap interrupt vectors to SRAM */
//MEMMAP=0x2;
/* Initialize GPIO ports to be used as indicators */
IODIR=0xfF0;
//IOSET=0xF0;
/* Initialize Pin Connect Block */
PINSEL0=0x50;
/* Initialize I2C */
I2CONCLR=0x6c; /* clearing all flags */
I2CONSET=0x40; /* enabling I2C */
I2SCLH=25; /* 100 KHz */
I2SCLL=40;
/* Initialize VIC for I2C use */
VICIntSelect=0x0; /* selecting IRQ */
VICIntEnable= 0x200; /* enabling I2C */
VICVectCntl0= 0x29; /* highest priority and enabled */
VICVectAddr0=(unsigned long) I2C_ISR;
/* ISR address written to the respective address register*/

}
/********************** I2C ISR **************************/
__irq void I2C_ISR()
{
int temp=0;
temp=I2STAT;
switch(temp)
{
case 8:
ISR_8();
break;
case 24:
ISR_18();
break;
case 40:
ISR_28();
break;
case 0x20:
//ISR_20();
I2CONCLR=0x8;
//IOSET=IOSET|0xF0;
I2DAT=0XA0;

break;
case 0x30:
ISR_30();
break;

default :
break;
}
VICVectAddr=0xFF;
}
/* I2C states*/
/* Start condition transmitted */
void ISR_8()
{
/* Port Indicator */
//IOCLR=0x10;
/* Slave address + write */
I2DAT=0xA0;
/* Clear SI and Start flag */
I2CONCLR=0x28;
/* Port Indicator */

}



/* Acknowledgement received from slave for slave address */
void ISR_18()
{
/* Port Indicator */
//IOCLR=0x20;
/* Data to be transmitted */
I2DAT=data ;
/* clear SI */
I2CONCLR=0x8;
/* Port Indicator */
IOSET=IOSET|0xF0;
}
/* Acknowledgement received from slave for byte transmitted from master. Stop
condition is transmitted in this state signaling the end of transmission */
void ISR_28()
{

//veri gönderildi onay alindi.gönderilcek veri var mi?
/* Port Indicator */
//IOCLR=0x80;
/* Transmit stop condition */
I2CONSET=0x10;
/* clear SI */
I2CONCLR=0x8;
/* Port Indicator */
IOSET=IOSET|0x800;   
  }

   void ISR_30() {
         i++;
       I2DAT=data;
         //bir önceki veri göbnderme isleminde
         //ack alinmadigi icin data tekrar gönderiliyor
      
        if(i==4) {i=0; I2CONSET=0X10; IOSET=IOSET|0X8F0;}
   
      I2CONCLR=0x8;
    }

void delay(void){
     int  d;

  for (d = 0; d < 100000; d++);
}

c0bra