Машинка на ДУ управлінні своїми руками. Апаратна реалізація 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 у вкладенні.
Прикреплені файли:
- transmitter_i2c.rar (47 Кб)