Страница 1 из 1

TWI (I2C) чтение даных MASTERом от SLAVE

Добавлено: Сб дек 12, 2015 10:37:15
artmasterpro
Задача: Нужно прочитать данные по 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

Кто знает подскажите пожалуйста возможно я что-то не так делаю, возможно есть пример кода функции как должна выглядеть функция чтения слейва.

У меня чтение первого байта данных (после передачи адреса) выглядит вот так:

Код: Выделить всё

while (!(TWCR & (1<<TWINT))); data=TWDR;
Со стороны slave передача первого байта выглядит вот так:

Код: Выделить всё


 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

Спасибо!