реклама на сайте
подробности

 
 
> Чтение по TWI
Ruffian
сообщение Mar 27 2011, 10:03
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 19
Регистрация: 4-03-11
Пользователь №: 63 397



Добрый день.
Помогите разобраться с простейшим примером работы с TWI

Код
void RS_Send_Char(char c);
void RS_Send_Text (char *text);



char eepromData;


void main(){
  DDRA = 0xFF;              // configure PORTA as output
  UART1_Init(9600);
  Delay_ms(200);
  RS_Send_Text("test");
  
  
  // часть 1
  TWI_Init(100000);         // initialize TWI communication

  TWI_Start();              // issue TWI start signal
  TWI_Write(0xA2);          // send byte via TWI (device address + W)
  TWI_Write(2);             // send byte (address of EEPROM location)
  TWI_Write(0xAA);          // send data (data to be written)
  TWI_Stop();               // issue TWI stop signal

  Delay_100ms();

  // часть 2
  TWI_Start();              // issue TWI start signal
  TWI_Write(0xA2);          // send byte via TWI (device address + W)
  TWI_Write(2);             // send byte (data address)
  TWI_Start();              // issue TWI signal repeated start
  TWI_Write(0xA3);          // send byte (device address + R)
  PORTA = TWI_Read(0u);     // read data (NO acknowledge)
  TWI_Stop();               // issue TWI stop signal
  eepromData = PORTA;
  RS_Send_Char(eepromData);
  
  Delay_100ms();

  // часть 3
  TWI_Start();              // issue TWI start signal
  TWI_Write(0xA2);          // send byte via TWI (device address + W)
  TWI_Write(1);             // send byte (data address)
  TWI_Start();              // issue TWI signal repeated start
  TWI_Write(0xA3);          // send byte (device address + R)
  PORTA = TWI_Read(0u);     // read data (NO acknowledge)
  TWI_Stop();               // issue TWI stop signal
  eepromData = PORTA;
  RS_Send_Char(eepromData);
  
}

//вывод в терминал
void  RS_Send_Char(char c){
     while ( !(UCSRA & 0b00100000) );  //waiting for ready
     UDR = c;
}

void RS_Send_Text (char *text){
     while ( *text ){
           RS_Send_Char (*text);
           text ++;
     }
}


Схема простейшая: Atmega16 и 24c04. У 24с04 ножки А1 и А2 сидят на общем проводе.
В первой части записывается число АА в память, во второй части оно успешно считывается обратно из памяти, а в третьей я пытаюсь прочитать какую-нибудь другую ячейку, но результат чтения явно не тот, что должен быть.

1. Непонятно, почему именно TWI_Write(0xA2), что за адрес 0хА2, и почему не 159 или 1? Исходя из чего? Я не вижу связи числа 0хА2 с состоянием адресных ножек 24с04.
2. TWI_Write(2); Здесь 2 - это номер ячейки памяти в 24с04? Если так, то почему при чтении из другой ячейки TWI_Write(1); читается не то, что прописано в этой ячейке 24с04, а число А3?
При этом в протеусе 24с04 изначально инициализирована реальной прошивкой, в которой А3 нет ни в одной ячейке.
Какую ячейку не считывай (кроме ячейки 2), получаю число А3. Если вместо TWI_Write(0xA3); сделать например TWI_Write(0x66); - будет со всех ячеек считываться 66.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 8)
DpInRock
сообщение Mar 27 2011, 10:37
Сообщение #2


Гуру
******

Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515



Вообще-то чтение даташита на 24С04 убирает все вопросы.
Чисто нормальная практика - работаешь с какой-либо микросхемой - почитай даташит.

Заодно получите представление о I2C.


--------------------
On the road again (Canned Heat)
Go to the top of the page
 
+Quote Post
Ruffian
сообщение Mar 27 2011, 11:13
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 19
Регистрация: 4-03-11
Пользователь №: 63 397



По даташиту адресация идет так: старшие 4 бита - фиксированные 1010, далее два бита - чипселект (выводы А1 и А2 у 24с04). Следующий бит - выбор одного из двух банков (которые по 256 байт). Последний бит - операция чтения или записи (1/0).
Вот хочу я прочитать первую из 512 ячеек памяти. В прошивке там по этому адресу записано 0х43.
Выбираю тот банк, который соответствует 0 в предпоследнем бите

Код
  TWI_Start();  
  TWI_Write(0xA0);  //выбрать первый банк
  TWI_Write(0);             // выбрать нулевую ячейку банка
  TWI_Start();            
  TWI_Write(0xA1);          // выбор операции чтения
  PORTA = TWI_Read(0u);     // собственно само чтение
  TWI_Stop();               // issue TWI stop signal
  eepromData = PORTA;
  RS_Send_Char(eepromData);


Вместо 0х43 возвращается 0хFF.
Пробую посмотреть в другом банке, может там искомое найдётся:

Код
  TWI_Start();  
  TWI_Write(0xA2);  //выбрать второй банк
  TWI_Write(0);             // выбрать нулевую ячейку банка
  TWI_Start();            
  TWI_Write(0xA3);          // выбор операции чтения
  PORTA = TWI_Read(0u);     // собственно само чтение
  TWI_Stop();               // issue TWI stop signal
  eepromData = PORTA;
  RS_Send_Char(eepromData);


Возвращается 0хА3 вместо 0х43

В чём ошибка?

Сообщение отредактировал Ruffian - Mar 27 2011, 11:15
Go to the top of the page
 
+Quote Post
DpInRock
сообщение Mar 27 2011, 11:26
Сообщение #4


Гуру
******

Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515



Цитата
В прошивке там по этому адресу записано 0х43.

Что вот это означает?
У вас кто-то заранее туда что-то записал?


--------------------
On the road again (Canned Heat)
Go to the top of the page
 
+Quote Post
Ruffian
сообщение Mar 27 2011, 11:36
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 19
Регистрация: 4-03-11
Пользователь №: 63 397



Цитата(DpInRock @ Mar 27 2011, 15:26) *
Что вот это означает?
У вас кто-то заранее туда что-то записал?


Да, в протеусе для 24с04 можно указать начальные данные путём выбора какой-нибудь прошивки.
Есть такой пункт в свойствах 24с04: Initial contents jf memory. Я указал ему реальную прошивку от чипа scx-4200.bin
Go to the top of the page
 
+Quote Post
rezident
сообщение Mar 27 2011, 11:48
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(Ruffian @ Mar 27 2011, 17:36) *
Да, в протеусе для 24с04 можно указать начальные данные путём выбора какой-нибудь прошивки.
Хе-хе. Опять Proteus и снова виртуальные глюки виртуального устройства biggrin.gif
Вы, Ruffian, хоть раз попробовали бы проверить работу своей программы на реальном устройстве. После этого ваш Proteus "фтопку" бы выкинули wink.gif
Go to the top of the page
 
+Quote Post
Ruffian
сообщение Mar 27 2011, 12:16
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 19
Регистрация: 4-03-11
Пользователь №: 63 397



Цитата(rezident @ Mar 27 2011, 15:48) *
Хе-хе. Опять Proteus и снова виртуальные глюки виртуального устройства biggrin.gif
Вы, Ruffian, хоть раз попробовали бы проверить работу своей программы на реальном устройстве. После этого ваш Proteus "фтопку" бы выкинули wink.gif


Ну это вторая попытка что-нибудь сделать в протеусе. Первую виртуальную конструкцию тоже написал, отлаживая в протеусе, затем отослал прошивку со схемой человеку, он её залил в реальную конструкцию и конструкция работает.
Поэтому как-то доверял протеусу, вроде серьёзная программа.
Если самому записывать в 24с04 и затем считывать записанное, то всё работает. Как минимум в пределах одного банка точно.
А если протеус фтопку, то как отлаживать? В пошаговом режиме с осциллографом? Много не наладишь так wacko.gif
Go to the top of the page
 
+Quote Post
rezident
сообщение Mar 27 2011, 12:31
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(Ruffian @ Mar 27 2011, 18:16) *
Поэтому как-то доверял протеусу, вроде серьёзная программа.
No comments. Потому, что уже надоело одно и то же писать по этому поводу sad.gif
Цитата(Ruffian @ Mar 27 2011, 18:16) *
Если самому записывать в 24с04 и затем считывать записанное, то всё работает. Как минимум в пределах одного банка точно.
Если аж в пределах банка работает, то вообще никаких проблем быть не должно. Проблемы могут быть только с выравниванием адресов при записи в EEPROM, когда нужно учитывать размер буфера записи и организовывать выравнивание с учетом этого размера.
Цитата(Ruffian @ Mar 27 2011, 18:16) *
А если протеус фтопку, то как отлаживать? В пошаговом режиме с осциллографом? Много не наладишь так wacko.gif
Самый главный/основной дебаггер - это голова инженера/программиста, которая "не только для того, чтобы шапку носить" wink.gif
Go to the top of the page
 
+Quote Post
DpInRock
сообщение Mar 27 2011, 12:34
Сообщение #9


Гуру
******

Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515



Чтобы работать с протеусом надо быть хоть немного умнее протеуса.


--------------------
On the road again (Canned Heat)
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 23:36
Рейтинг@Mail.ru


Страница сгенерированна за 0.01474 секунд с 7
ELECTRONIX ©2004-2016