Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
RadioLab
Открыл глаза
Сообщения: 46 Зарегистрирован: Пт дек 25, 2009 12:29:51
Откуда: Н.Новгород
Контактная информация:
Сообщение
RadioLab » Чт сен 16, 2010 13:55:28
разбираюсь с работой 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
Сообщение
yaotzin » Пн сен 20, 2010 01:21:22
в нете было может поможет
Код: Выделить всё
/*******************************************/
/* 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
Сообщение
extremisto » Чт мар 10, 2011 21:22:26
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)); (насколько это корректно?)
А чего не пишешь на сайте где брал код в форум?
Я бы тебе подсказал бы может что-то.