TWI (I2C) чтение даных MASTERом от SLAVE
Добавлено: Сб дек 12, 2015 10:37:15
Задача: Нужно прочитать данные по I2C из tiny45 (slave) для atmega8 (master)
tiny45 не имеет аппаратного модуля TWI у него только USI, на основе которого и строим I2C.
Нашел гдето на робофоруме уже готовый рабочий код для реализации TWI на tiny45.
Со стороны atmega8 использую аппаратную поддержку TWI. Но пока только получается передавать данные в slave.
Но прочитать из slave немогу.
Что делаю:
M: Даю старт бит
М: Посылаю адрес и направление чтения (sla_r)
S: Получаю подтверждение что адрес совпал и даные приняты и ACK
S: Записываю USIDR байт данных
на этом все останавливается....
M: TWSR 0x40 и я вижу в протеус, что master не получает байт данных от slave
Кто знает подскажите пожалуйста возможно я что-то не так делаю, возможно есть пример кода функции как должна выглядеть функция чтения слейва.
У меня чтение первого байта данных (после передачи адреса) выглядит вот так:
Со стороны slave передача первого байта выглядит вот так:
На всякий случай схема стандартная: http://take.ms/dQOdS
Спасибо!
tiny45 не имеет аппаратного модуля TWI у него только USI, на основе которого и строим I2C.
Нашел гдето на робофоруме уже готовый рабочий код для реализации TWI на tiny45.
Со стороны atmega8 использую аппаратную поддержку TWI. Но пока только получается передавать данные в slave.
Но прочитать из slave немогу.
Что делаю:
M: Даю старт бит
М: Посылаю адрес и направление чтения (sla_r)
S: Получаю подтверждение что адрес совпал и даные приняты и ACK
S: Записываю USIDR байт данных
на этом все останавливается....
M: TWSR 0x40 и я вижу в протеус, что master не получает байт данных от slave
Кто знает подскажите пожалуйста возможно я что-то не так делаю, возможно есть пример кода функции как должна выглядеть функция чтения слейва.
У меня чтение первого байта данных (после передачи адреса) выглядит вот так:
Код: Выделить всё
while (!(TWCR & (1<<TWINT))); data=TWDR;
Код: Выделить всё
case 2: {//этим тактом мастер получил подтверждение (ACK), после передачи адреса
//передача первого байта данных мастеру
Next_Faze = 4;//в дальнейшем будет ожидаться получение подтверждения от мастера
TWI_Data = TWI_Write_buffer[TWI_Write_count]; //готовим данные для передачи мастеру следующими 8-ю тактами
TWI_Write_temp[TWI_Write_count]= TWI_Data;
TWI_Write_count++;
SDA_OUT;SDA_HIGH; // шина SDA будет работать на выход.
TWI_Status = 0xF0; //сбросим считчик и флаги
break;
На всякий случай схема стандартная: http://take.ms/dQOdS
Спасибо!