Добрый день.
Помогите разобраться с простейшим примером работы с 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.