1

Тема: Проблема читання EEPROM по TWI на AVR Atmega328P

Доброго дня !

Не можу добитися нормальної роботи TWI на AVR. Задача -- послідовне, побайтове читання зовнішньої EEPROM.
Для відладки спростив її до максимуму:
1. Вмикаємо схему (Arduino UNO)
2. Ініціюємо модуль TWI
3. про всяк випадок формуємо на шині STOP
4. Чекаємо виконання
5. Відсилаємо SLA+R (0b10100001: адреса пристрою + режим читання)
6. Чекаємо виконання
7. Читаємо TWDR

Теоретично після видачі SLA+R EEPROM надсилає ACK і повинен запуститися режим синхронізації прийому даних від EEPROM
(1 байт поточної адреси), після завершення читаємо TWDR, надсилаємо ACK, EEPROM видає слідуючий байт і т.д.

Але реально складається таке враження що AVR "не відпускає" лінію SCL (в "низькому" рівні після 9-го такту) на шині, через що не відбувається процес передачі даних від EEPROM до AVR.
Причому після видачі SLA+R  EEPROM надсилає ACK. Якщо мікросхему EEPROM відключити - на SDA "побачимо" NACK.
Все як і повинно бути. А от лінія SCL на 9-му такті (ACK/NACK) переходить в "низький" рівень в обох випадках (тобто "тримає" її AVR), хоча повинна б перейти у "високий".
Перевіряв цю саму EEPROM на програматорі з підключеним осцилографом, то так і є. Правда програматор спочатку надсилає SLA+W і початкову адресу (нуль), а потім SLA+R, але це не має значення - SLA+W потрібно щоб скинути внутрішній лічильник адреси даних EEPORM в початкове положення (що відбувається і при вмиканні живлення). Хоча я теж з початку пробував так само. Але після SLA+W і видачі початкової адреси лінія SCL знову таки залишається в "низькому" рівні. Причому, повторюся, така ситуація виникає і при відключеній EEPROM (тобто лінію "утримує" AVR).

2

Re: Проблема читання EEPROM по TWI на AVR Atmega328P

Питання закрито.
Щоб "відпустити" лінію SCL шини TWI, необхідно "скинути" біт TWINT(регістра TWCR), записавши в нього "1".

Подякували: leofun01, ReAl2