Русские Блоги
использование24LC64(24XX64) ДаПриложения с низким энергопотреблениемEEPROM, емкость 8K byte(64K бит), максимальная тактовая частота IIC400 KHz(24FC64 достиг1MHz), Технология CMOS низкой мощности:Рабочий ток 1 мА(Типичный),Ток в режиме ожидания 1 мкА(Типичный),32-байтовый буфер записи страницыПри более чем 1 млн. Циклов стирания / записи срок хранения данных составляет> 200 лет
24LC64 аналогичен 24C02 (только 8-байтовый буфер записи страницы).Адрес операции всего 8 битВ то время как 24LC64Адрес операции содержит верхние 8 бит и нижние 8 бит, Таблицы данных различаются следующим образом:
Гарантия / возврат
Программатор микросхем BIOS 24 и 25 серии CH341A Pro
Программатор CH341A Pro используется для программирования микросхем BIOS компьютеров, ноутбуков, видеокарт, мультимедийных плееров, памяти телевизоров, ЖК-дисплеев, маршрутизаторов, игровых приставок, спутниковых ресиверов и др.
Как пользоваться программатором CH341A Pro:
Для начала использования программатора необходимо установить драйвер и программное обеспечение:
Скачайте ПО (CH341A Programmer версии 1.3) и драйвер по ссылке
Системные требования ПО:
OC: Win98, WinME, WIN2K, WinXP, Vista, Win7, Win8, Win10 (32-64 bit)
Распакуйте скачанный архив и запустите программу CH341A_130.exe
Подключите программатор к компьютеру (должен загореться светодиод POWER).
Драйвер к программатору может установится автоматически. Если Windows не удалось установить драйвер, найдите в скаченном архиве папку CH341Parallel_driver_support WIN7 и установите драйвер из нее.
После того как программа и драйвер будут установлены можно приступить к программированию.
Чтобы запрограммировать необходимую микросхему на ZIF панели устройства, нужно открыть пазы для её установки, подняв фиксаторную ручку. Установить микросхему согласно ключу нарисованному на программаторе. Зажать фиксаторной ручкой микросхему в пазах. Cм. рисунок 1.1 (правильная установка микросхемы BIOS 25 серии)
Рис. 1.1 (правильная установка микросхемы BIOS 25 серии)
Если нужно прошить микросхемы 25-й серии, в корпусе SOP8 или SOP16, на плате программатора предусмотрены контактные площадки для микросхем в таких корпусах. Можно припаять микросхему к контактной площадке (см рисунок 1.2.) или просто прижать прищепкой к контактам. Так же можно воспользоваться дополнительной платой (идет в комплекте с программатором) и устанавливать/припаять микросхему на нее (см. рисунок. 1.3.)
Запрограммировать микросхему 25-й серии, в корпусе SOP8 можно прямо на материнской плате без выпаивания. Для этого можно воспользоваться прищепкой-переходником (в комплекте не идет. приобретается отдельно) (см. рисунок 1.4.) Красный провод на шлейфе прищепки — контакт который должен соответствовать первой ножке микросхемы (на самой микросхеме обычно обозначена точкой). При таком способе прошивки, плату нужно обязательно обесточить и вынуть батарейку BIOS.
В программаторе есть возможность внутрисхемного программирования с помощью ISP интерфейса (этот метод программирования описываться здесь не будет, информацию можно найти на форумах в интернете)
Перемычку для переключения режимов программирования не трогаем! Даже когда программируем без выпаивания через прищепку. Она должна соединять 1 и 2 контакты. Убираем перемычку только в случае если используем ISP интерфейс.
Итак приступаем непосредственно к программированию:
ПОСЛЕ. установки/подключения микросхемы — подключите программатор к USB порту (возможно при подключении потребуется подождать пока Windows установит драйвер на устройство) и запустите программу CH341A Programmer. Интерфейс программы можно переключить на русский язык.
Если микросхема подключена правильно — все кнопки в программе будут активны.
Далее нужно будет выбрать название микросхемы, для чего можно нажать кнопку «ДЕТЕКТ» (программа сама предложит наиболее подходящие микросхемы) или выполнить поиск вручную через кнопку «ПОИСК».
Когда название микросхемы будет выбрано в программе, можно производить все необходимые действия с вашей микросхемой — считать, сохранить дамп, очистить, записать и т. д.
Интерфейс программы интуитивно понятен и прост:

Поддерживаемые программатором CH341A Pro микросхемы 25 серии
AMIC
A25L512 A25L05P A25L10P A25L010 A25L020 A25L20P A25L40P A25L040 A25L080 A25L80P A25L016 A25L16P A25L032
ATMEL
AT25F512 AT25F512B AT25F512A AT25FS010 AT25F1024 AT25F1024A AT25F2048 AT25DF021 AT25F4096 AT25FS040 AT25DF041A AT25DF321A AT26DF321 AT25DF321 AT25DF641
COMMON
25X005 25X05 25X10 25X20 25X40 25X80 25X16 25X32 25X64 25X128 25X256 25X512 25X1024 25X2048
EON
EN25F05 EN25P05 EN25LF05 EN25F10 EN25LF10 EN25D10 EN25P10 EN25F20 EN25D20 EN25LF20 EN25F40 EN25D40 EN25LF40 EN25Q80 EN25D80 EN25F80 EN25P80 EN25T80 EN25B16T EN25T16 EN25B16 EN25D16 EN25F16 EN25Q16 EN25P32 EN25Q32 EN25F32 EN25B32 EN25B32T EN25Q64 EN25B64 EN25F64 EN25B64T EN25F128 EN25Q128
ES
ES25P10 ES25P20 ES25M40A ES25M40 ES25P40 ES25M80 ES25P16 ES25M80A ES25P32 ES25P80 ES25M16 ES25M16A
ESMT (только чтение)
F25L04UA F25L16PA F25L004A F25L32QA F25L08PA F25L32PA F25L008A F25L016A
GIGADEVICE
GD25Q512 GD25Q10 GD25Q20 GD25F40 GD25D40 GD25Q80 GD25D80 GD25T80 GD25F80 GD25Q16 GD25Q32 GD25Q64 GD25Q128
KH
25L8036D
MXIC
MX25V512 MX25L4005A MX25L1635D MX25L3237D MX25L6455E MX25L12845E MX25L512 MX25V4035 MX25L1605D MX25L3225D MX25L6408D MX25L1005 MX25V4005 MX25L1608D MX25L3205D MX25L6406E MX25L2005 MX25V8005 MX25L3235D MX25L3206E MX25L6445E MX25L8035 MX25L8005 MX25L3208D MX25L6405D MX25L12805D
NEXFLASH
NX25P10 NX25P20 NX25P40 NX25P80 NX25P16 NX25P32
NSHINE
MS25X05 MS25X16 MS25X10 MS25X32 NS25X20 MS25X64 NS25X40 MS25X128 MS25X80
PMC
PM25LV512A PM25LV016B PM25LV010A PM25LV020 PM25LV040 PM25LV080B
SAIFUN
SA25F005 SA25F160 SA25F010 SA25F320 SA25F020 SA25F040 SA25F080
SPANSION
S25FL004A S25FL032A S25FL040A S25FL064A S25FL008A S25FL128P S25FL160 S25FL129P S25FL016A S25FL128A
SST (только чтение)
SST25VF512A SST25VF512 SST25VF010 SST25VF010A SST25 SST25VF020 SST25VF040B SST25VF040A SST25VF040 SST25′ SST25VF016B SST25VF032B SST25VF064C
ST
M25P05A M25PE10 M25P10A M25P20 M25PE20 M25PE40 M25P40 M25PE80 M25P80 M25PX80 M25PX16 M25P16 M25PE16 M25P32 M25PE32 M25PX32 M25PX64 M25P64 M25PE64 M25P128
WINBOND
W25X10 W25X10L W25P10 W25X10AL W25X10A W25P20 W25X20AL W25X20A W25X20 W25X20L W25X40A W25P40 W25Q40BV W25X40L W25X40 W25X40AL W25Q80BV W25Q80V W25X80 W25P80 W25X80A W25X80L W25X80AL W25P16 W25Q16BV W25Q16V W25X16 W25Q32BV W25Q32V W25X32 W25P32 W25Q64BV W25X64 W25Q128BV
Поддерживаемые программатором CH341A Pro микросхемы 24 серии
ATMEL
AT24C01B AT24C01 AT24C01A AT24C02 AT24C02A AT24C02B AT24C04B AT24C04 AT24C04A AT24C08A AT24C08B AT24C08 AT24C16 AT24C16A AT24C16B AT24C32B AT24C32A AT24C32 AT24C64 AT24C64A AT24C64B AT24C128 AT24C128A AT24C128B AT24C256B AT24C256 AT24C256A AT24C512B AT24C512A AT24C512 AT24C1024 AT24C1024A AT24C1024B
CATALYST
CAT24C01 CAT24WC01 CAT24WC02 CAT24C02 CAT24C04 CAT24WC04 CAT24WC08 CAT24C08 CAT24WC16 CAT24C16 CAT24WC32 CAT24C32 CAT24WC64 CAT24C64 CAT24WC128 CAT24C128 CAT24WC256 CAT24C256 CAT24C512 CAT24WC512 CAT24C1024 CAT24WC1024
COMMON
24C01 3V 24C01 5V 24C02 3V 24C02 5V 24C04 5V 24C04 3V 24C08 3V 24C08 5V 24C16 5V 2406 3V 24C32 5V 24C32 3V 24C64 5V 24C64 3V 24028 5V 24C128 3V 24C256 5V 24C256 3V 24C512 5V 24C512 3V 240024 3V 24C1024 5V 24C2048 5V 24C2048 3V 24C4096 5V 24C4096 3V
FAIRCHILD
FM24C01L FM24C02L FM24C03L FM24C04L FM24C05L FM24C08L FM24C09L FM24C17L FM24C16L FM24C32L FM24C64L FM24C128L FM24C256L FM24C512L FM
HOLTEK
HT24C01 HT24LC01 HT24CD2 HT24LC02 HT24C04 HT24LC04 HT24C08 HT24LC08 HT24C16 HT24LC16 HT24LC32 HT24C32 HT24LC64 HT24C64 HT24C128 HT24LC128 HT24C256 HT24LC256 HT24LC512 HT24C512 HT24C1024 HT24LC1024
ISSI
IS24O01 IS24C02 IS24C04 IS24C08 IS24C16 IS24C32 IS24C64 IS24C128 IS24C256 IS24C512 IS24C1024
MICROCHIP
MIC24LC014 MIC24AA01 MIC24AA014 MIC24LC01B MIC24LC02B MIC24AA02 MIC24C02C MIC24AA025 MIC24AA04 MIC24LC04B MIC24LC024 MIC24AA024 MIC24LC025 MIC24LC08B MIC24AA08 MIC24LC16B MIC24AA16 MIC24LC32 MIC24AA32 MIC24LC64 MIC24FC64 MIC24AA64 MIC24FC128 MIC24AA128 MIC24LC128 MIC24AA256 MIC24LC256 MIC24FC256 MIC24AA512 MIC24LC512 MIC24FC512 MIC24AA1024
NSC
NSC24C02L NSC24C02 N5C24C64
RAMTRON
FM24CL04 FM24C04A FM24CL16 FM24C16A FM24CL64 FM24C64 FM24C256 FM24CL256 FM24C512
ROHM
BR24L01 BR24C01 BR24L02 BR24C02 BR24L04 BR24C04 BR24L08 BR24C08 BR24L16 BR24C16 BR24L32 BR24C32 BR24C64 BR24L64
ST
ST24C01 ST24C32 ST24C02 ST24C64 ST24C04 ST24C08 ST24C16
XICOR
X24O01 X24C02 X24C04 X24C08 X24C16
Подключение CH341A Pro к микросхеме в корпусе SOP8 без выпаивания через прищепку — переходник.
Прищепка — переходник для программатора CH341A Pro позволяет программировать микросхемы в корпусе SOP8 8pin без выпаивания.
1. Подсоедините переходник к программатору, согласно ключу нарисованному на программаторе. Первая ножка микросхемы обозначена на рисунке (на программаторе) точкой. На переходнике от прищепки к программатору ножки пронумерованы. См. рисунок 2.1 (правильное подключение переходника прищепки для программирования микросхемы 25 серии)
Рис. 2.1. Правильное подключение переходника прищепки для программирования микросхемы 25 серии
2. Подключите шлейф прищепки к переходнику. Красный провод должен соответствовать 1 ножке переходника.
Перед подключением прищепки к микросхеме на плате, ножки микросхемы желательно почистить, например ножом, скальпелем или чем захотите. Плату нужно обязательно обесточить и вынуть батарейку BIOS.
3. Подсоедините прищепку к микросхеме так, чтобы красный провод был на первой ножке микросхемы. см рисунок 2.2. На самой микросхеме первая ножка обычно обозначена точкой.
ТОЛЬКО ПОСЛЕ. подсоединения к микросхеме и убедившись, что все соединено правильно, подключите программатор к USB порту компьютера.
Если все контакты между прищепкой и микросхемой имеются и все подключено правильно — при запуске программы все кнопки интерфейса будут активными и можно приступать к выбору названия микросхемы и программированию.
P.S. Из за особенностей некоторых материнских плат, не все микросхемы удается программировать не выпаивая из материнской платы. В некоторых случаях без выпаивания не обойтись.
Если вы уверены, что все подключили правильно и все контакты имеются, а микросхема не поддается программированию, попробуйте выпаять микросхему, возможно ее программированию мешают другие элементы материнской платы.
24lc64 как считать память
шина I2C работает по принципу Master/Slave. Архитектура известная, много шин по этому принципу работает. Твоя память работает всегда в режиме Slave, что означает, что она ждет команды на чтение или запись и выполняет ее.
Каждый девайс, подключенный к шине имеет свой адрес. Этот адрес задается железом — на 0 или 1 соответствующие ноги схемы.
А дальше мк отправляет команду на чтение или запись устройства с каким-то адресом и если устройство с указанным адресом выполняет команду.
Nagits's Blog
AVR: РАБОТАЕМ С ВНЕШНЕЙ ПАМЯТЬЮ I2C EEPROM типа 24CXX
Для того чтобы полностью разобраться с Two-Wire Interface (TWI) , пишем с нуля в AVR STUDIO процедуры инициализации, чтения и записи. Подробно останавливаемся на каждом шаге и разбираемся. Затем промоделируем все в Proteus.
I. Кратко теория
Аппаратный модуль TWI и протокол I2C
В микроконтроллеры серии MEGA входит модуль TWI, с помощью которого мы будем работать с шиной I2C. Модуль TWI по сути является посредником между нашей программой и подключаемым устройством (память I2C EEPROM, например).
Структура модуля TWI в микроконтроллерах AVR
Шина I2C состоит из двух проводов:
- SCL (Serial Clock Line) – линия последовательной передачи тактовых импульсов.
- SDA (Serial Data Line) – линия последовательной передачи данных.
К этой шине мы можем одновременно подключить до 128 микросхем.
Подключения к шине TWI
Наш контроллер будем называть ведущим, а все подключаемые микросхемы ведомыми. Каждый ведомый имеет определенный адрес, зашитый на заводе в ходе изготовления (кстати, граница в 128 микросхем как раз и определяется диапазоном возможных адресов). С помощью этого адреса мы и можем работать с каждый ведомым индивидуально, хотя все они подключены к одной шине одинаковым образом. Из нашей программы мы управляем модулем TWI, а этот модуль берет на себя дергание ножками SCL и SDA.
Как видно на блок-схеме, TWI условно состоит из четырех блоков. Вначале нам нужно будет настроить Генератор скорости связи, и мы сразу забудем про него. Основная работа – с Блоком управления.
Блок шинного интерфейса управляется Блоком управления, т.е. непосредственно с ним мы контактировать не будем. А Блок сравнения адреса нужен, чтобы задать адрес на шине I2C, если тока наш контроллер будет подчиненным устройством(ведомым) от другого какого-то контроллера или будет приемником от другого ведущего (как в статье Налаживаем обмен данными между двумя контроллерами по шине I²C на моем блоге). В этой статье он нам не нужен. Если хотите, почитайте про него в любом даташите контроллера серии MEGA.
Итак, наша задача сейчас разобраться с регистрами, входящими в Генератор скорости связи и Блок управления:
Регистр скорости связи TWBR
Регистр управления TWCR
Регистр статуса(состояния) TWSR
Регистр данных TWDR
И все, разобравшись всего лишь с 4-мя регистрами, мы сможем полноценно работать с внешней памятью EEPROM и вообще, обмениваться данными по I2C с любым другим устройством.
Генератор скорости связи и Регистр скорости связи TWBR
Блок генератора скорости связи управляет линией SCL, а именно периодом тактовых импульсов. Управлять линией SCL может только ведущий. Период SCL управляется путем установки регистра скорости связи TWI (TWBR) и бит предделителя в регистре статуса TWI (TWSR).
Частота SCL генерируется по следующей формуле:
FSCL= FЦПУ/[16+2(TWBR) · 4 TWPS ],
- TWBR — значение в регистре скорости связи TWI;
- TWPS — значение бит предделителя в регистре статуса TWI (TWSR).
- Fцпу – тактовая частота ведущего
- FSCL – частота тактовых импульсов линии SCL
Настройка TWBR нужна, т.к. ведомая микросхема обучена обмениваться данными на определенной частоте. Например, в Proteus, введите в поиск I2CMEM, увидите обилие микросхем памяти, в основном у них указаны частоты 100 и 400Khz.

Ну вот, подставляя в формулу частоты FЦПУ и FSCL , мы сможем найти оптимальное значение для регистра TWBR.
TWPS – это 2-битное число [TWPS1: TWPS0], первый бит – это разряд TWPS0, второй – TWPS1 в регистре статуса TWSR. Задавая Предделитель скорости связи 4 TWPS , мы можем понижать значение TWBR (т.к. TWBR – это байт, максимальное значение 255). Но обычно это не требуется, поэтому TWPS обычно задается 0 и 4 TWPS = 1. Гораздо чаще, наоборот, мы упираемся в нижний диапазон регистра TWBR. Если TWI работает в ведущем режиме, то значение TWBR должно быть не менее 10. Если значение TWBR меньше 10, то ведущее устройство шины может генерировать некорректные сигналы на линиях SDA и SCL во время передачи байта.
| TWPS1 | TWPS0 | TWPS10 | Значение предделителя 4 TWPS |
| 0 | 0 | 0 | 1 |
| 0 | 1 | 1 | 4 |
| 1 | 0 | 2 | 16 |
| 1 | 1 | 3 | 64 |
| Частота ЦПУ, МГц | TWBR | TWPS | Частота SCL, КГц |
| 16.0 | 12 | 0 | 400 |
| 16.0 | 72 | 0 | 100 |
| 14.4 | 10 | 0 | 400 |
| 14.4 | 64 | 0 | 100 |
| 12.0 | 52 | 0 | 100 |
| 8.0 | 32 | 0 | 100 |
| 4.0 | 12 | 0 | 100 |
| 3.6 | 10 | 0 | 100 |
задание значения предделителя ([TWPS1: TWPS0] в регистре статуса TWSR)
Регистр состояния TWI — TWSR
| Разряд | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| TWS7 | TWS6 | TWS5 | TWS4 | TWS3 | — | TWPS1 | TWPS0 | |
| Чтение/запись | Чт. | Чт. | Чт. | Чт. | Чт. | Чт. | Чт./Зп. | Чт./Зп. |
| Исх. значение | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 |
задание скорости связи (TWBR, Регистр скорости связи).
Регистр скорости связи шины TWI — TWBR
| Разряд | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| TWBR7 | TWBR6 | TWBR5 | TWBR4 | TWBR3 | TWBR2 | TWBR1 | TWBR0 | |
| Чтение/запись | Чт./Зп. | Чт./Зп. | Чт./Зп. | Чт./Зп. | Чт./Зп. | Чт./Зп. | Чт./Зп. | Чт./Зп. |
| Исх. значение | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Блок управления
Регистр управления шиной TWI — TWCR
Регистр TWCR предназначен для управления работой TWI. Он используется для разрешения работы TWI, для инициации сеанса связи ведущего путем генерации условия СТАРТ на шине, для генерации подтверждения приема, для генерации условия СТОП и для останова шины во время записи в регистр TWDR. Он также сигнализирует о попытке ошибочной записи в регистр TWDR, когда доступ к нему был запрещен.
Регистр управления шиной TWI — TWCR
| Разряд | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| TWINT | TWEA | TWSTA | TWSTO | TWWC | TWEN | — | TWIE | |
| Чтение/запись | Чт./Зп. | Чт./Зп. | Чт./Зп. | Чт./Зп. | Чт. | Чт./Зп. | Чт. | Чт./Зп. |
| Исх. значение | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Разряд 7 — TWINT: Флаг прерывания TWI
Этот флаг устанавливается аппаратно, если TWI завершает текущее задание (к примеру, передачу, принятие данных) и ожидает реакции программы. Линия SCL остается в низком состоянии, пока установлен флаг TWINT. Флаг TWINT сбрасывается программно путем записи в него логической 1. Очистка данного флага приводит к возобновлению работы TWI, т.е. программный сброс данного флага необходимо выполнить после завершения опроса регистров статуса TWSR и данных TWDR.
Разряд 6 — TWEA: Бит разрешения подтверждения
Бит TWEA управляет генерацией импульса подтверждения. Как видно в таблице, по умолчанию он сброшен. Останавливаться на нем не буду, он в данной статье не пригодится.
Разряд 5 — TWSTA: Бит условия СТАРТ
Мы должны установить данный бит при необходимости стать ведущим на шине I2C. TWI аппаратно проверяет доступность шины и генерирует условие СТАРТ, если шина свободна. Мы проверяем это условие (по регистру статуса, будет далее) и если шина свободна, то мы можем начинать с ней работать. Иначе нужно будет подождать, пока шина освободится.
Разряд 4 — TWSTO: Бит условия СТОП
Установка бита TWSTO в режиме ведущего приводит к генерации условия СТОП на шине I2C. Если на шине выполняется условие СТОП, то бит TWSTO сбрасывается автоматически и шина освобождается.
Разряд 3 — TWWC: Флаг ошибочной записи
Бит TWWC устанавливается при попытке записи в регистр данных TWDR, когда TWINT имеет низкий уровень. Флаг сбрасывается при записи регистра TWDR, когда TWINT = 1.
Разряд 2 — TWEN: Бит разрешения работы TWI
Бит TWEN разрешает работу TWI и активизирует интерфейс TWI. Если бит TWEN установлен, то TWI берет на себя функции управления линиями ввода-вывода SCL и SDA. Если данный бит равен нулю, то TWI отключается и все передачи прекращаются независимо от состояния работы.
Разряд 1 — Резервный бит
Разряд 0 — TWIE: Разрешение прерывания TWI
Если в данный бит записана лог. 1 и установлен бит I в регистре SREG (прерывания разрешены глобально), то разрешается прерывание от модуля TWI (ISR (TWI_vect)) при любом изменении регистра статуса.
Регистр состояния TWI – TWSR
| Разряд | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| TWS7 | TWS6 | TWS5 | TWS4 | TWS3 | — | TWPS1 | TWPS0 | |
| Чтение/запись | Чт. | Чт. | Чт. | Чт. | Чт. | Чт. | Чт./Зп. | Чт./Зп. |
| Исх. значение | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 |
Разряды 7..3 — TWS: Состояние TWI
Данные 5 бит отражают состояние логики блока TWI и шины I2C. Диапазон кодов состояния 0b0000 0000 – 0b1111 1000, или с 0x00 до 0xF8. Привожу их ниже:
Если мы работаем с пассивным ведомым (т.е. это не другой контроллер AVR, а микросхема памяти или например, часы RTC), то коды состояний из разделов Slave Transmitter (Ведомый в роли передающего) и Slave Receiver (Ведомый в роли принимающего) нам не понадобятся, поскольку единственная «разумная» микросхема у нас – это Ведущий (наш контроллер).
Проверяя регистр статуса после каждой выполненной операции с шиной, мы можем контролировать обмен информацией. Например, будем точно знать – записались ли данные во внешнюю память или нет.
Регистр данных шины TWI — TWDR
| Разряд | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| TWD7 | TWD6 | TWD5 | TWD4 | TWD3 | TWD2 | TWD1 | TWD0 | |
| Чтение/запись | Чт./Зп. | Чт./Зп. | Чт./Зп. | Чт./Зп. | Чт./Зп. | Чт./Зп. | Чт./Зп. | Чт./Зп. |
| Исх. значение | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
В режиме передатчика регистр TWDR содержит байт для передачи. В режиме приемника регистр TWDR содержит последний принятый байт. Будьте внимательны, после аппаратной установки флага TWINT, регистр TWDR не содержит ничего определенного.
Ну вот, этих знаний более чем достаточно, чтобы работать с I2C EEPROM. Теперь переходим непосредственно к программной части. Я решил пояснения писать прямо в коде в виде комментариев.
II. Программа
Все функции (инициализация TWI, чтение, запись внешней памяти) я вынесу в отдельные файлы, как это и принято делать, i2c_eeprom.c и i2c_eeprom.h.
Содержание i2c_eeprom.h следующее:
Чтобы было легче воспринимать нижеследующий код, приведу здесь теоретические примеры осциллограмм при обмене данными между Ведущим и Ведомым по шине I2C (взял в книжке [1], в более высоком разрешении найдете по адресу, указанном в конце статьи):

Далее привожу листинг файла i2c_eeprom.c с подробными комментариями:
Ну вот, самые главные функции мы написали. На этой базе можно написать функции для чтения\записи массива байтов. Также можно добавить прерывание ISR(TWI_INT), которое будет срабатывать при каждом изменении регистра статуса. Я скажу только пару слов об этом, поскольку разобравшись в вышеизложенном, вам не составит труда реализовать их самому.
Итак, пару слов о чтении\записи массива байтов. Очень просто взять и вогнать в цикл функции eeReadByte\eeWriteByte. Это даже будет работать . Но, посмотрите, TWI каждый раз будет формировать условие СТАРТ, устанавливать связь с ведомым, отсылать адрес чтения\записи… Словом, огромная потеря времени. Вы же не покупаете продукты в магазине по частям , нет — вы складываете все продукты (байты) в кулек (в массив) и несете домой. Дак давайте также сложим все наши байты в кулек! Изменения в новой функции eeWriteByte s
будут следующими, часть кода затаскиваем в цикл:
В процедуре чтения изменения будут чуточку сложнее, поскольку между считыванием байтов данных должно быть подтверждение от ведущего, а после считывания последнего байта подтверждения быть не должно, далее идет условие завершения передачи (условие СТОП).
Про прерывание ISR(TWI_INT) говорить ничего не буду, просто приведу пример использования (обычно этого достаточно, сразу становится все понятно):
Все, остается создать проект в AVR STUDIO:
В настройках проекта укажите какой-нибудь MEGA (atmega16 например), подключите файлы i2c_eeprom.c и i2c_eeprom.h.
В программе я явно указал частоту тактирования моего контроллера 16 Mhz. Далее, в Proteus, мы выберем какую-нибудь микросхему внешней памяти I2C EEPROM. Не забудьте после этого сравнить настройки в i2c_eeprom.h с параметрами выбранной микросхемы (slaveF_SCL, slaveAddressConst – достоверную информацию всегда можно узнать из даташитов).
Итак, остается собрать проект и переходим к моделированию..

III. Моделируем работу с I2C EEPROM в Proteus
Добавляем на схему ATmega16, 2 резистора для подтяжки шины I2C (см. схему в начале статьи). Из вкладки виртуальные инструменты возьмите Осциллограф и I2C-Отладчик. Для выбора памяти введите в поиск I2CMEMS в окне выбора устройств:

Из всего списка я выбрал 24LC64 с объемом памяти 64 КБ и частотой работы с шиной I2C 400 КГц.

У микросхемы 8 ножек. Все, кроме питания и земли, отображены на скриншоте слева. С SCK и SDA мы знакомы, WP – Write Protect (защита от записи), A0:A2 используются для выбора переменной части адреса ведомой микросхемы (для чего нужны, уже писал где-то выше). Даташит на эту микросхему можете найти по запросу 24XX64 в гугле. Там можете проверить постоянную часть адреса и частоту, а также посмотреть, как использовать ножки WP, A0:A2.
В настройках контроллера укажите прошивку, частоту тактирования 16 МГц и не забудьте выставить CKSEL-фьюзы для кристалла. В настройках I2C-отладчика укажите, что тактовая частота импульсов шины 400 КГц.


Видно, что в PORTA записалось число 0b0000’1010 или 0x0A или 10, т.е. переменная uint8_t byte содержит верное значение после чтения памяти 24LC64 по адресу 0х19. Давайте посмотрим подробнее, что делает наша программа, взглянем на лог I2C-отладчика:

Теперь можно опуститься еще на уровень ниже и посмотреть на осциллограмму:

Логика, думаю, понятна. Так можно просмотреть и всю осциллограмму, проверить работу I2C в реальной ситуации, а не в режиме симуляции.
