Машинка на ДУ управлінні своїми руками. Апаратна реалізація I2C. Передавач

На цьому уроці ми з Вами розберемо варіант апаратної реалізації передавача по послідовному інтерфейсу I2C мікроконтролера AVR.

I2C - двонаправлений, послідовний інтерфейс… З'єднуємо виводи SCL і SDA приймача і передавача. Підтягує до живлення, я включаю вбудовані підтягують резистори.

NB! Для моніторингу змінних, регістрів стану тощо я буду використовувати UART. З матеріалів попередніх уроків я скомпонував бібліотеку «uart_atm8.c», що складається з функцій ініціалізації UART, функції передачі байта і рядка. Цього цілком достатньо для потреб налагодження.

Першим ділом ініціалізуємо I2C, шляхом вибору швидкості передачі…

void initTWI()
{
   TWBR = 72; //Швидкість 100кГц
};

Підготувавши дані для передачі…

//Опрос клавіші напрямку руху. Завантажити отримані дані в commandBuffer
   if (!(PINC & (1 << PC1))) commandBuffer |= (1 << 0); else commandBuffer &= ~(1 << 0);

//Опрос клавіш напрямку повороту. Завантажити отримані дані в commandBuffer
   if (!(PINC & (1 << PC2))) commandBuffer |= (1 << 1); else commandBuffer &= ~(1 << 1); //Вліво
   if (!(PINC & (1 << PC3))) commandBuffer |= (1 << 2); else commandBuffer &= ~(1 << 2); //Вправо

…починаємо сесію. Спочатку передавач формує умову СТАРТ…

   TWCR = (1 << TWINT)|(1 << TWSTA)|(1 << TWEN); //Старт!
   while (!(TWCR & (1 << TWINT))); //Чекаю завершення

По завершенню формування умови СТАРТ перевіряємо регістр стану TWSR. Код #08 повідомляє про успішну передачу умови СТАРТ. Виведемо значення регістра в термінал, для контролю передачі...

   USART_TransmitByte(TWSR);

…для зручності налагодження введемо паузи між відправленнями даних…

   _delay_ms(200);

Наступним кроком передаємо 7-бітну адресу приймача і біт для завдання типу операції ЧИТАННЯ або ЗАПИСУ. Якщо приймач розпізнає, що до нього відбувається адресація, то приймач формує підтвердження.

TWDR = 0b00000010; //Адреса пристрою + запис!
TWCR = (1 << TWINT)|(1 << TWEN); //Запуск
while (!(TWCR & (1 << TWINT))); //Чекаю завершення

Код #18 повідомляє про те, що була передана адреса приймача і біт типу операції, прийнято ПІДТВЕРДЖЕННЯ. Далі слідує передача даних…

//Передача байта commandBuffer
   TWDR = commandBuffer; //Дані...
   TWCR = (1 << TWINT)|(1 << TWEN); //Запуск
   while (!(TWCR & (1 << TWINT))); //Чекаю завершення

//Передача байта потужності
   TWDR = ADCH; //Дані...
   TWCR = (1 << TWINT)|(1 << TWEN); //Запуск
   while (!(TWCR & (1 << TWINT))); //Чекаю завершення

Код #28 повідомляє про те, що був переданий байт даних, прийнято ПІДТВЕРДЖЕННЯ. В завершенні сесії передавач формує сигнал СТОП…

TWCR = (1 << TWINT)|(1 << TWEN)|(1 << TWSTO); //Стоп!

В нашому випадку, коли приймач відсутній і коди помилок регістра стану передавача не обробляються, маємо…

По завершенню формування умови СТАРТ перевіряємо регістр стану TWSR. Код #08 повідомляє про успішну передачу умови СТАРТ.

Код #20 повідомляє про те, що була передана адреса приймача і біт типу операції, прийнято НІ ПІДТВЕРДЖЕННЯ.

Код #30 повідомляє про те, що був переданий байт даних, прийнято НІ ПІДТВЕРДЖЕННЯ.

ПРОЕКТ З ІСХОДНИМ КОДОМ І СИМУЛЯЦІЯ В PROTEUS у вкладенні.

Прикреплені файли:

Top