роботы робототехника микроконтроллеры


 Страниц (1): [1]   

> Описание: Подключение памяти через TWI
mctim Post Id



Маршал


Сообщений всего: 109
Дата рег-ции: Нояб. 2009  



Привет!

У меня есть EEPROM 24C02N-SI27 и Atmega8-16PU.
Подключил память как показано сдесь http://www.captain.at/electronic...tmega-eeprom.php . Код тоже взят оттуда. Изменил функцию delay_ms(), билиотеку подключил avr/iom8.h и удалил код связанный с usart.
Если записывать и считывать 1 байт как у автора, то все в порядке. Если же попытаться больше 1 байта, скажем 3, то функции возвращают 1(тоесть выполнено без ошибок) но вот только третий байт считывается как записан. И сколько не записывай, только последний байт записан верно.

Помогите пожалуйста кто знает.
 
 Top
nest Администратор Post Id



Администратор


Сообщений всего: 4866
Дата рег-ции: Сент. 2009  



Цитата:
Furthermore it writes 2 bytes to the EEPROM, reads them back and sends them over the serial port

для большего числа придётся перелопачивать самому.
 
 Top
mctim Post Id



Маршал


Сообщений всего: 109
Дата рег-ции: Нояб. 2009  



Я и пробую. Там сообщения формируются как в datasheet(http://file.qip.ru/file/11202252...24C02N-SI27.html ) вроде... А что нужно изменить?
 
 Top
nest Администратор Post Id



Администратор


Сообщений всего: 4866
Дата рег-ции: Сент. 2009  



так возмите оттуда int eeprom_write_byte и пишите байты по одному.

Попробуйте свою прцедуру написать для общения по I²C, Запись-чтение только одного байта. Заодно разберётесь.
 
 Top
mctim Post Id



Маршал


Сообщений всего: 109
Дата рег-ции: Нояб. 2009  



В int eeprom_write_byte насколько я вижу пишется 1 байт.
Вот как я понимаю эту функцию:

1. Если линия свободна - устанавливается состояние СТАРТ
2. Посылается ID устройства - 0xA0
3. Посылается младшие 8 бит адреса
4. Посылаются старшие 8 бит адреса
5. Посылается байт данных
6. Выставляется состояние СТОП

После каждого действия(кроме 6) запускается цикл ожидания прерывания от TWI и обрабатываются возможные ошибки.
Вот код соответствующий действиям:
1. TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN);
2. TWDR = 0xa0;
TWCR = (1 << TWINT) | (1 << TWEN);
3. TWDR = eeaddr;
TWCR = (1 << TWINT) | (1 << TWEN);
4. TWDR = eeaddr << 8;
TWCR = (1 << TWINT) | (1 << TWEN);
5. TWDR = buf;
TWCR = (1 << TWINT) | (1 << TWEN);
6. TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO);
Ожидание прерывания : while (!(TWCR & (1 << TWINT)));
Должно работать Смущение

nest пишет:
Попробуйте свою прцедуру написать для общения по I²C, Запись-чтение только одного байта. Заодно разберётесь.

Так и начинал. Состряпал чтото странно работающее, нашел вышеупомянутый код и сравнил со своим. Они были похожи, только у автора аккуратней. В итоге убил свой.

(Отредактировано автором: 13 Декабря, 2009 - 15:29:38)

 
 Top
mctim Post Id



Маршал


Сообщений всего: 109
Дата рег-ции: Нояб. 2009  



datasheet
 
 Top
mctim Post Id



Маршал


Сообщений всего: 109
Дата рег-ции: Нояб. 2009  



высший восторг
Работает!
Ошибка была в понимании datasshet.
Оказывается что для 24С02 word - это 1 байт, page - это 8 байт.
2K памяти значит: 2048 бит, 32 страницы, 256 байт.
Адресация идет по словам, а не по страницам как я думал. То есть для 24С02 адресное пространство 0..255.
Вот работающие функции:
CODE:

// запись байта в память
unsigned char EEPROM24C02_write_word(unsigned char addr, // адрес байта
unsigned char word) // байт для записи
{
unsigned char restart = 0, n = 0;
while(1)
{
n++;
// send stop condition
TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO);
_delay_ms(1);
if((restart == 1) | (n >= MAX_TRIES))
{
if(n >= MAX_TRIES)
return -1;
restart = 0;
}
// start cond.
TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN);
while (!(TWCR & (1 << TWINT)));
if (TW_STATUS == TW_MT_ARB_LOST) continue;
if ( (TW_STATUS != TW_REP_START) && (TW_STATUS != TW_START))
return -1;
// send 0xa0
// 0xa0 = 1010 000 0
// 4 bits: <a..device-indentifier>
// 3 bits: <device-address set with chip pins>
// last bit: <0..write>
TWDR = 0xA0;
TWCR = (1 << TWINT) | (1 << TWEN);
while (!(TWCR & (1 << TWINT))); // ожидание прерывания от модкля TWI
if (TW_STATUS == TW_MT_SLA_NACK)
{
restart = 1;
continue;
}
if (TW_STATUS == TW_MT_ARB_LOST) continue;
if (TW_STATUS != TW_MT_SLA_ACK)
{
//return TW_STATUS;
restart = 1;
continue;
}
// send 8 bits of word eeaddr
TWDR = addr;
TWCR = (1 << TWINT) | (1 << TWEN);
while (!(TWCR & (1 << TWINT)));
if (TW_STATUS == TW_MT_DATA_NACK) break;
if (TW_STATUS == TW_MT_ARB_LOST) continue;
if (TW_STATUS != TW_MT_DATA_ACK)
{
restart = 1;
continue;
}
// put byte into data register and start transmission
TWDR = word;
//TWDR = 1;
TWCR = (1 << TWINT) | (1 << TWEN);
while (!(TWCR & (1 << TWINT)));
if (TW_STATUS != TW_MT_DATA_ACK)
{
restart = 1;
break;
}
_delay_ms(5);
return 1;
}
return -1;
}

(Добавление)
CODE:

// чтение текущего адреса(текущий адрес храниться в памяти чипа 24C02 пока подается питание)
unsigned char EEPROM24C02_read_current_address(unsigned char *byte)
{
unsigned char restart = 0, n = 0;
while(1)
{
n++;
// send stop condition
TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO);
if((restart == 1)| (n>=MAX_TRIES))
{
if(n >= MAX_TRIES)
return -1;
restart = 0;
}
// send start cond.
TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN);
while (!(TWCR & (1 << TWINT)));
if (TW_STATUS == TW_MT_ARB_LOST) continue;
if ( (TW_STATUS != TW_REP_START) && (TW_STATUS != TW_START))
{
restart = 1;
continue;
}

// send 0xa1
// 0xa0 = 1010 000 1
// 4 bits: <a..device-indentifier>
// 3 bits: <device-address set with chip pins>
// last bit: <1..read>
TWDR = 0xa1;
TWCR = (1 << TWINT) | (1 << TWEN);
while (!(TWCR & (1 << TWINT)));
if (TW_STATUS == TW_MR_SLA_NACK) break;
if (TW_STATUS == TW_MR_ARB_LOST) continue;
if (TW_STATUS != TW_MR_SLA_ACK)
{
restart = 1;
continue;
}
// start read transmission
TWCR = (1 << TWINT) | (1 << TWEN);
while (!(TWCR & (1 << TWINT)));
if (TW_STATUS != TW_MR_DATA_NACK) continue;
*byte = TWDR;
// send stop condition
TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO);
return 1;
}
return -1;
}
// считать байт
unsigned char EEPROM24C02_read_word(unsigned char addr, // адрес байта
unsigned char *byte) // указатель на ячейку(регистр) в которую поместить считаный байт
{
unsigned char restart = 0, n = 0, err = 0, buf;
while(1)
{
n++;
// send stop condition
TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO);
_delay_ms(1);
if((restart == 1) | (n >= MAX_TRIES))
{
if(n >= MAX_TRIES)
return -1;
restart = 0;
}
// start cond.
TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN);
while (!(TWCR & (1 << TWINT)));
if (TW_STATUS == TW_MT_ARB_LOST) continue;
if ( (TW_STATUS != TW_REP_START) && (TW_STATUS != TW_START))
{
restart = 1;
continue;
}
// send 0xa0
// 0xa0 = 1010 000 0
// 4 bits: <a..device-indentifier>
// 3 bits: <device-address set with chip pins>
// last bit: <0..write>
TWDR = 0xA0;
TWCR = (1 << TWINT) | (1 << TWEN);
while (!(TWCR & (1 << TWINT))); // ожидание прерывания от модкля TWI
if (TW_STATUS == TW_MT_SLA_NACK)
{
restart = 1;
continue;
}
if (TW_STATUS == TW_MT_ARB_LOST) continue;
if (TW_STATUS != TW_MT_SLA_ACK)
{
//return TW_STATUS;
restart = 1;
continue;
}
// send 8 bits of word eeaddr
TWDR = addr;
TWCR = (1 << TWINT) | (1 << TWEN);
while (!(TWCR & (1 << TWINT)));
if (TW_STATUS == TW_MT_DATA_NACK) break;
if (TW_STATUS == TW_MT_ARB_LOST) continue;
if (TW_STATUS != TW_MT_DATA_ACK)
{
restart = 1;
continue;
}
err = EEPROM24C02_read_current_address(&buf);
if(err == 1)
*byte = buf;
else
{
restart = 1;
continue;
}
return 1;
}
return -1;
}
 
 Top
SNEGOK23 Post Id


Главнокомандующий


Сообщений всего: 259
Дата рег-ции: Сент. 2009  



странно... привычней видеть слово - 2 байта...
 
 Top
mctim Post Id



Маршал


Сообщений всего: 109
Дата рег-ции: Нояб. 2009  



datasheet пишет:

The AT24C01A/02/04/08A/16A provides 1024/2048/4096/8192/16384 bits of serial
electrically erasable and programmable read-only memory (EEPROM) organized as
128/256/512/1024/2048 words of 8 bits each.
 
 Top
SNEGOK23 Post Id


Главнокомандующий


Сообщений всего: 259
Дата рег-ции: Сент. 2009  



хах. а байт написать не судьба вместо слова... вгоняют в панику бедных программистов=)

(Отредактировано автором: 17 Декабря, 2009 - 17:35:33)

 
 Top
nest Администратор Post Id



Администратор


Сообщений всего: 4866
Дата рег-ции: Сент. 2009  



байт - это не всегда восемь бит, то и слово - не обязательно 16-ть бит. так что ...
 
 Top
nest Администратор Post Id



Администратор


Сообщений всего: 4866
Дата рег-ции: Сент. 2009  



в тему: Подключаем память 24LC16 к микро контроллеру AVR
На асм.
 
 Top
Страниц (1): [1]
« Микроконтроллеры »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 





Powered by Exclusive Bulletin Board
ExBB FM 1.0 RC1 Smiles by Fool from Foolstown
  Яндекс.Метрика   Рейтинг@Mail.ru