EEPROM серии 24cXX

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Аватара пользователя
RadioLab
Открыл глаза
Сообщения: 46
Зарегистрирован: Пт дек 25, 2009 12:29:51
Откуда: Н.Новгород
Контактная информация:

EEPROM серии 24cXX

Сообщение RadioLab »

разбираюсь с работой eeprom 24сxx вот по этой статье
http://avrlab.com/node/84

проверяю в протеусе. пишу 1 байт, читаю 1 байт. писать получается, а читать не хочет. меga8 + 12МГц кварц запись тоже не работала пока не закоментировал последнее условие while(TWCR & (1<<TWSTO)); (насколько это корректно?) вот функция записи.

Код: Выделить всё

uint8_t EEWriteByte(uint16_t address,uint8_t data)
{
	do
	{
		//Put Start Condition on TWI Bus
		TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN);

		//Poll Till Done
		while(!(TWCR & (1<<TWINT)));

		//Check status
		if((TWSR & 0xF8) != 0x08)
			return FALSE;

		//Now write SLA+W
		//EEPROM @ 00h
		TWDR=TWI_SLA_24CXX;	

		//Initiate Transfer
		TWCR=(1<<TWINT)|(1<<TWEN);

		//Poll Till Done
		while(!(TWCR & (1<<TWINT)));
	
	}while((TWSR & 0xF8) != 0x18);
		
	//Now write ADDRH
	TWDR=(address>>8);

	//Initiate Transfer
	TWCR=(1<<TWINT)|(1<<TWEN);

	//Poll Till Done
	while(!(TWCR & (1<<TWINT)));

	//Check status
	if((TWSR & 0xF8) != 0x28)
		return FALSE;

	//Now write ADDRL
	TWDR=(address);

	//Initiate Transfer
	TWCR=(1<<TWINT)|(1<<TWEN);

	//Poll Till Done
	while(!(TWCR & (1<<TWINT)));

	//Check status
	if((TWSR & 0xF8) != 0x28)
		return FALSE;

	//Now write DATA
	TWDR=(data);

	//Initiate Transfer
	TWCR=(1<<TWINT)|(1<<TWEN);

	//Poll Till Done
	while(!(TWCR & (1<<TWINT)));

	//Check status
	if((TWSR & 0xF8) != 0x28)
		return FALSE;

	//Put Stop Condition on bus
	TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWSTO);

_delay_ms(12);       
	//Wait for STOP to finish
//	while(TWCR & (1<<TWSTO));
//_delay_ms(12);
//	//Wait untill Writing is complete
	

	return TRUE;
}
может кто чего подскажет?

да нет, вроде как работает, и всёже последнее условие закоментировано while(TWCR & (1<<TWSTO)); (насколько это корректно?)
Вложения
111.rar
проект в AVR Studio
и для протеуса
(63.69 КБ) 115 скачиваний
Реклама
Аватара пользователя
yaotzin
Опытный кот
Сообщения: 782
Зарегистрирован: Вс фев 04, 2007 16:32:06

Re: EEPROM серии 24cXX

Сообщение yaotzin »

в нете было может поможет

Код: Выделить всё

/*******************************************/

/* example program for ET-LAB3A            */

/* description  : read and write 24c16     */

/* compiler     : keil c51                 */   

/*******************************************/


/*  include section */

#include

#include

#include




sbit sda = P1^0;

sbit scl = P1^1;




void delay(unsigned char);

void deli2c();


char writebyte(unsigned int,unsigned char);

char readbyte(unsigned int,unsigned char *);

void sendbyte(unsigned char);

unsigned char getbyte();

void serial_set(void)

{

      TMOD=0x20; //timer1 mode2 auto-reload.

      TH1=0xfa; //9600 bps use xtal 18.432Mhz

      SCON=0x50;//mode 1 receive enable

      PCON=0x00;//smod=0

      IE=0;//not interrupt

      TI=1;//ready to send data

      TR1=1;//start serial communication

}


/***************************************/

/*            main  program            */

/***************************************/

void main(void)

{

  unsigned char *j;

  serial_set();

  scl = 1;

  sda = 1;

  delay(10);


  printf("Hey!!!n");

  //init_lcd();


  writebyte(1,0x55);

 

  //gotolcd(0);

  //sprintf(lcdbuf," write     read ");

  //printlcd();


  readbyte(1,j);

  printf("%02bxn",*j);

  printf("OK!n");

  //gotolcd(0x40);

  //sprintf(lcdbuf,"  50       %02BX",*j);

  //printlcd();


  while(1) {}


}




/*****************************************************/

/*        write  data 1 byte  to eeprom              */

/*****************************************************/

char writebyte(unsigned int a,unsigned char d)

{ 

   unsigned char i;

  

   i  = (a >> 7) & 0x0E;

   i |= 0xA0;

 

   sda = 0; 

   scl = 0; 

  

   sendbyte(i);              /* control byte for write RW = 0*/

   sda = 1;

   scl = 1;  deli2c();

   while(sda) {}

   scl = 0;  deli2c();


   sendbyte(a);

   sda = 1;

   scl = 1;  deli2c();

   while(sda) {}

   scl = 0;  deli2c();


   sendbyte(d);

   sda = 1;

   scl = 1;  deli2c();

   while(sda) {}

   scl = 0;  deli2c();

  

   sda = 0;


   scl = 1;

   sda = 1;


   delay(255);

 

 return 1;

}

 




/****************************************************/

/*        read  data  1 byte from eeprom            */

/****************************************************/

char readbyte(unsigned int a,unsigned char *p)

{

   unsigned char i;

  

   i  = (a >> 7) & 0x0E;

   i |= 0xA0;




   sda = 0; 

   scl = 0;


   sendbyte(i);            /* control byte for write RW = 0 */

   sda = 1;

   scl = 1;  deli2c();

   while(sda) {}

   scl = 0;  deli2c();


   sendbyte(a);

   sda = 1;

   scl = 1;  deli2c();

   while(sda) {}

   scl = 0;  deli2c();


   scl = 1; 

   sda = 1;

 

   sda = 0; 

   scl = 0; 


   sendbyte(i | 0x01);       /* control byte for read  RW = 1*/

   sda = 1;

   scl = 1;  deli2c();

   while(sda) {}

   scl = 0;  deli2c();

  

   *p = getbyte();


   sda = 1;

   scl = 1; 

   scl = 0; 


   scl = 1; 

   sda = 1; 

  

   delay(255);


 return 1;

}




/*******************************************/

/*     send  data 1 byte to eeprom         */

/*******************************************/

void sendbyte(unsigned char i)

{

 char j;


 for(j = 0;j < 8;j++)

 {

   if((i & 0x80) == 0x80) {sda = 1;}

   else                   {sda = 0;}


   scl = 1;  deli2c();

   scl = 0;  deli2c();

   i <<= 1;

 }

 

 return;

}




/******************************************/

/*         get  data  8 bit               */

/******************************************/

unsigned char getbyte(void)

{

 unsigned char i;

 char j;


 for(j=0;j<8;j++)

 {

   i <<= 1;


   sda = 1; 

   scl = 1;  deli2c();

   if(sda == 1) {i |= 0x01;}

   else         {i &= 0xFE;}  

   scl = 0;  deli2c();

 }

 

 return i;

}




/**********************************************/

/*             print ascii to lcd             */

/**********************************************/

//void printlcd(void)

//{

// char *p;

//

// p = lcdbuf;

//

// do{

//    write_data(*p);

//    p++;

// }while(*p != '


Реклама
extremisto
Родился
Сообщения: 7
Зарегистрирован: Вт авг 24, 2010 14:40:02

Re: EEPROM серии 24cXX

Сообщение extremisto »

RadioLab писал(а):разбираюсь с работой eeprom 24сxx вот по этой статье
http://avrlab.com/node/84

проверяю в протеусе. пишу 1 байт, читаю 1 байт. писать получается, а читать не хочет. меga8 + 12МГц кварц запись тоже не работала пока не закоментировал последнее условие while(TWCR & (1<<TWSTO)); (насколько это корректно?) вот функция записи.

Код: Выделить всё

uint8_t EEWriteByte(uint16_t address,uint8_t data)
{
	do
	{
		//Put Start Condition on TWI Bus
		TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN);

		//Poll Till Done
		while(!(TWCR & (1<<TWINT)));

		//Check status
		if((TWSR & 0xF8) != 0x08)
			return FALSE;

		//Now write SLA+W
		//EEPROM @ 00h
		TWDR=TWI_SLA_24CXX;	

		//Initiate Transfer
		TWCR=(1<<TWINT)|(1<<TWEN);

		//Poll Till Done
		while(!(TWCR & (1<<TWINT)));
	
	}while((TWSR & 0xF8) != 0x18);
		
	//Now write ADDRH
	TWDR=(address>>8);

	//Initiate Transfer
	TWCR=(1<<TWINT)|(1<<TWEN);

	//Poll Till Done
	while(!(TWCR & (1<<TWINT)));

	//Check status
	if((TWSR & 0xF8) != 0x28)
		return FALSE;

	//Now write ADDRL
	TWDR=(address);

	//Initiate Transfer
	TWCR=(1<<TWINT)|(1<<TWEN);

	//Poll Till Done
	while(!(TWCR & (1<<TWINT)));

	//Check status
	if((TWSR & 0xF8) != 0x28)
		return FALSE;

	//Now write DATA
	TWDR=(data);

	//Initiate Transfer
	TWCR=(1<<TWINT)|(1<<TWEN);

	//Poll Till Done
	while(!(TWCR & (1<<TWINT)));

	//Check status
	if((TWSR & 0xF8) != 0x28)
		return FALSE;

	//Put Stop Condition on bus
	TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWSTO);

_delay_ms(12);       
	//Wait for STOP to finish
//	while(TWCR & (1<<TWSTO));
//_delay_ms(12);
//	//Wait untill Writing is complete
	

	return TRUE;
}
может кто чего подскажет?

да нет, вроде как работает, и всёже последнее условие закоментировано while(TWCR & (1<<TWSTO)); (насколько это корректно?)
А чего не пишешь на сайте где брал код в форум?
Я бы тебе подсказал бы может что-то.
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»