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

 
 
> Чтение по 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



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

 


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


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