اطلاعیه

Collapse
No announcement yet.

twi (i2c) + lpc2378

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    twi (i2c) + lpc2378

    سلام من کد زیر رو برای ارسال دیتا بر روی ایپرام نوشتم اما هیچی روی اپیرام نوشته نمیشه، سخت افزار درسته و همینطور آدرس سخت افزاری و من مطمئن هستم مشکل از نرم افزارم هست. با تشکر

    کد:
    [left]
    #include <LPC23xx.h>
    #include <irq.h>
    #include <target.h>
    #include "uart.h"
    #include <swi.h>
    #include <stdio.h>
    #include "type.h"
    
    
    unsigned int I2C_sla;
    unsigned int I2C_adr;
    unsigned char *I2C_buf;
    unsigned char data_buf[8] = {0x62,0x61,0x68,0x61,0x64,0x6F,0x72,0x20};
    unsigned char data_read[8];
    unsigned int read;
    unsigned int I2C_num;
    unsigned int i;
    
    void delay(int);
    void twi_write(unsigned char id, unsigned int address, unsigned char *s, unsigned int num);
    void i2c_init(void);
    void i2c_isr(void);
    
    int main (void)
    {
    
    	PINSEL6 = 0x00000000;
    	FIO3DIR0 = 0xFF;
    
    	PCONP |= (1 << 19);
    
    	FIO3CLR0 = 0xff;
    	FIO3SET0 = 1;
    	uart_init();
    
    	putcharx(0x42);
    
    	FIO3CLR0 = 0xff;
    	FIO3SET0 = 2;
    
    	init_VIC();
    
    	FIO3CLR0 = 0xff;
    	FIO3SET0 = 3;
    
    	install_irq(I2C1_INT, i2c_isr, LOWEST_PRIORITY);
    
    	FIO3CLR0 = 0xff;
    	FIO3SET0 = 4;
    
    	IntEnable();
    
    	FIO3CLR0 = 0xff;
    	FIO3SET0 = 5;
    
    	//printf("writing to eeprom...");
    
    	FIO3CLR0 = 0xff;
    	FIO3SET0 = 6;
    
    	i2c_init();
    
    	FIO3CLR0 = 0xff;
    	FIO3SET0 = 7;
    
    	for(i=1;i<9;i++)
    	{
    	twi_write(0xA0, i, data_buf, 8);
    	delay(10);
    	}
    
    		for(i=0;i<8;i++)
    	{
    	putcharx(data_read[i]);
    	FIO3CLR0 = 0xff;
    	FIO3SET0 = data_read[i];
    	delay(100);
    	}
    
    
    
    	FIO3CLR0 = 0xff;
    	FIO3SET0 = 0xFF;
    	while(1);
    }
    
    void i2c_isr(void)
    {
    	FIO3CLR0 = 0xff;
    	FIO3SET0 = 0x55;
    	switch(I21STAT & 0xF8)
    	{
    	case (0x08):
    
    		if(read == 1) //SLA + R
    		{
    		I21DAT = I2C_sla & 0xFE;
    		}
    		else //SLA + W
    		{
    		I21DAT = I2C_sla;
    		}
    		I21CONCLR =	(1 << 3)|						/* SI 						*/
    		   	  (1 << 5);						/* STA 						*/
    	break;
    
    	case (0x10):
    
    		I21DAT = I2C_sla;
    		I21CONCLR = 0x28;
    
    	//slave address + W, ACK
    	case (0x18):
    	case (0x28):
    
    		if (I2C_num > 0)
    		{
    			I21DAT = *I2C_buf++;
    		  I21CONCLR = 0x28;					/*STA 				*/
    		  I2C_num--;
    		}
    		else
    		{
    			I21CONSET = (1 << 4);				/* STO 						*/
    			I21CONCLR = 0x28;					/* STA 				*/
    
    		 }
    	break;
    
    	default:
    	break;
    	}
    	I21CONCLR = 0x08; // clear I2C interrupt flag
    	VICVectAddr = 0x00;
    }
    
    
    void delay(int x)
    {
     int j;
     x = x * 10000;
     for(j=0;j<x;j++);
    }
    
    void twi_write(unsigned char id, unsigned int address, unsigned char *s, unsigned int num)
    {
    
    	I2C_sla = id;
    	I2C_adr = address;
    	I2C_num   = num;
    	I2C_buf = s;
    	read	= 0;
    
    	I21CONCLR = 	(1 << 2)|	/* AA 	*/
    				  (1 << 3)|	/* SI 	*/
    				  (1 << 5);	/* STA 	*/
    
    	I21CONSET = 	(1 << 5)|	/* STA 	*/
    				  (1 << 6);	/* I2CEN*/
    
    	delay(10);
    }
    
    
    void i2c_init()
    {
    	//I2Cbitfrequency = 	fPCLK / (2CSCLH + I2CSCLL)
    	PINSEL0 |= 0x0000000F;	// set P0.0 and P0.1 to I2C1 SDA and SCK
    	I21SCLL = (Fpclk / 200000 + 1) / 2;
    	I21SCLH = (Fpclk / 200000) / 2;
    	I21CONCLR = 0x000000FF;
    	I21CONSET = 0x00000040;
    }
    
    [/left]
    {امضاء خلاف قوانین}

    #2
    پاسخ : twi (i2c) + lpc2378

    سلام
    اگه ممکنه کل پروژه رو پلود کنید تا بتستیم با Jlink
    آخه چند تا هدر include کردی که معلوم نیست توشون چی کار کردی
    اگه jlink داری خودتم میتونی بتستی
    اسم آی سی EEPROM هم بگید

    دیدگاه

    لطفا صبر کنید...
    X