24lc64 как считать память

от admin

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 в реальной ситуации, а не в режиме симуляции.

Записки программиста

Одна из проблем с микроконтроллерами STM32 заключается в том, что большинство из них не имеют встроенного EEPROM. Исключением являются только микроконтроллеры серий STM32L0 и STM32L1 с ультра низким энергопотреблением. Это довольно странно после работы с AVR, где EEPROM есть у всех микроконтроллеров. Существует несколько решений, но в рамках этой заметки мы рассмотрим самое очевидное — использование внешнего EEPROM на примере чипа с I2C-интерфейсом 24LC64.

Дополнение: Альтернативное решение заключается в том, чтобы воспользоваться встроенной backup memory микроконтроллеров STM32. Подробности по этой теме вы найдете в посте Микроконтроллеры STM32: использование встроенных RTC.

Цифра 64 в названии говорит о том, что устройство имеет 64 килобит памяти, или 8 Кбайт. Есть аналогичные чипы от разных производителей и с разными объемами памяти — я видел от 128 байт (например, M24C01 от компании ST) до 256 Кбайт (AT24CM02 производства Atmel). В плане распиновки и интерфейса все они абсолютно взаимозаменяемы. Далее я буду говорить о 24LC64, производимом компанией Microchip, так как сам использовал именно его.

Распиновка 24LC64 выглядит так (даташит [PDF]):

Распиновка чипа 24LC64

VSS и VCC, понятно, представляют собой минус и плюс питания, а SDA и SCL — это I2C шина. Устройство имеет I2C-адрес 0b1010zyx, где значения x, y и z определяются тем, к чему подключены пины A0, A1 и A2. Если пин подключен к земле, соответствующий бит адреса равен нулю, если же к плюсу — то единице. Таким образом, устройство может иметь адрес от 0 x 50 до 0 x 57. Наконец, пин WP — это write protection. Если пин подключен к земле, разрешено как чтение, так и запись. Если же пин подключен к плюсу, устройство доступно только на чтение.

Создаем новый проект в STM32CubeMX для вашей отладочной платы. Лично я все также использую плату Nucleo-F411RE, но если вы используете другую, отличия в проекте должны быть минимальными. В Peripherals включаем устройство I2C1, выбрав в выпадающем списке «I2C» вместо «Disable». Также мы будем передавать что-то компьютеру, поэтому включаем устройство USART2, как делали это в заметке Микроконтроллеры STM32: обмен данными по UART. Чтобы плату можно было использовать с Arduino-шилдами, несущими какие-то I2C-устройства, пины I2C1 нужно переназначить на PB9 и PB8 (по умолчанию будут назначены другие: PB7 и PB6). В итоге должна получиться такая картинка:

Читать:
Как узнать кто выложил фото в интернет

Настройка I2C в STM32CubeMX

Затем генерируем код и подправляем Makefile, как обычно. Я лично просто взял Makefile из исходников к заметке про UART и дописал недостающие файлы в C_SOURCES, а именно:

Для подключения 24LC64 к плате Nucleo я воспользовался Proto Shield от Arduino. Пришлось прорезать в нем отверстие Dremel’ем, чтобы иметь доступ к кнопкам на отладочной плате. В итоге у меня получился вот такой сэндвич:

Подключение внешнего EEPROM к плате Nucleo

Кто-то из читателей мог обратить внимание на то, что в I2C-шине должны использоваться резисторы, подтягивающие SCL и SDA к плюсу, но в этом проекте мы их не используем. Дело в том, что для моей платы и использованного в ней микроконтроллера STM32CubeMX автоматически включает встроенные подтягивающие резисторы на соответствующих пинах.

Убедиться в этом несложно, посмотрев код процедуры HAL_I2C_MspInit в файле ./Src/stm32f4xx_hal_msp.c:

Правда, не так очевидно, почему процедура HAL_I2C_MspInit вообще откуда-то вызывается. Ответ можно найти в файле stm32f4xx_hal_i2c.c, где эта процедура объявляется с атрибутом __weak и вызывается из процедуры HAL_I2C_Init. Атрибут __weak работает таким образом, что при сборке не-weak процедура из кода нашего проекта подменяет собой weak-процедуру из HAL, за счет чего она и будет вызвана.

Заметьте, однако, что встроенные подтягивающие резисторы доступны не во всех микроконтроллерах STM32. Насколько мне известно, для серии STM32F1 это работать не будет, и придется все-таки использовать внешние подтягивающие резисторы.

Наконец, рассмотрим основной код прошивки:

void init ( ) {
const char wmsg [ ] = "Some data" ;
char rmsg [ sizeof ( wmsg ) ] ;
// HAL expects address to be shifted one bit to the left
uint16_t devAddr = ( 0x50 << 1 ) ;
uint16_t memAddr = 0x0100 ;
HAL_StatusTypeDef status ;

// Hint: try to comment this line
HAL_I2C_Mem_Write ( & hi2c1 , devAddr , memAddr , I2C_MEMADD_SIZE_16BIT ,
( uint8_t * ) wmsg , sizeof ( wmsg ) , HAL_MAX_DELAY ) ;

for ( ;; ) { // wait.
status = HAL_I2C_IsDeviceReady ( & hi2c1 , devAddr , 1 ,
HAL_MAX_DELAY ) ;
if ( status == HAL_OK )
break ;
}

HAL_I2C_Mem_Read ( & hi2c1 , devAddr , memAddr , I2C_MEMADD_SIZE_16BIT ,
( uint8_t * ) rmsg , sizeof ( rmsg ) , HAL_MAX_DELAY ) ;

if ( memcmp ( rmsg , wmsg , sizeof ( rmsg ) ) == 0 ) {
const char result [ ] = "Test passed! \r \n " ;
HAL_UART_Transmit ( & huart2 , ( uint8_t * ) result , sizeof ( result ) — 1 ,
HAL_MAX_DELAY ) ;
} else {
const char result [ ] = "Test failed 🙁 \r \n " ;
HAL_UART_Transmit ( & huart2 , ( uint8_t * ) result , sizeof ( result ) — 1 ,
HAL_MAX_DELAY ) ;
}
}

Для работы с внешней памятью в HAL предусмотрены специальные процедуры HAL_I2C_Mem_Read и HAL_I2C_Mem_Write. Заметьте, что эти процедуры работают с I2C адресами, сдвинутыми на 1 бит влево. Связано это с тем, что в протоколе I2C семибитный адрес устройства и бит операции (чтение или запись) передаются в одном байте. Использование «сдвинутых» адресов позволяет выполнять чуть меньше ассемблерных инструкций, что нередко бывает важно в разработке встраиваемых систем. Еще стоит обратить внимание на то, что перед чтением с устройства мы должны дождаться его готовности с помощью процедуры HAL_I2C_IsDeviceReady. Наконец, здесь я забил на коды возврата большинства использованных процедур, чего в боевом коде, пожалуй, делать не стоит.

Fun fact! Вдумчивый читатель, конечно же, обратил внимание на тот факт, что адрес памяти имеет тип uint16_t . Спрашивается, как можно адресовать им более 64 Кбайт памяти, например, те же 256 Кбайт у AT24CM02? Само собой разумеется, никак. Чипы, имеющие более 64 Кбайт памяти, начинают использовать для адресации младшие биты I2С-адреса устройства. То есть, с точки зрения нашего кода, они будут выглядеть, как 2 или более отдельных I2C-устройства. Соответствующие пины, определяющие адрес устройства, при этом являются NC, то есть, ни к чему не подключаются.

При работе с EEPROM нужно учитывать еще пару важных моментов:

  • 24LC64 и его родственники хранят данные в страницах по 32 байта. За один вызов HAL_I2C_Mem_Write вы можете записать только одну страницу, причем нужно учитывать не только размер данных, но и их выравнивание. Если требутеся записать больше одной страницы, процедуру нужно вызывать в цикле. На чтение, насколько я смог выяснить, таких ограничений нет — читать можно сколько угодно и по любым смещениям;
  • Запись в EEPROM может быть прервана в любой момент (сел аккумулятор, пользователь выдернул кабель питания, …). Поэтому в боевом коде стоит хранить вместе с данными их контрольную сумму. В случае, если будет записана только часть данных, это позволит обнаружить проблему и использовать хотя бы параметры по умолчанию, а не какой-то мусор.

Полную версию исходников к этой заметке вы найдете на GitHub. В качестве небольшого домашнего задания можете модифицировать прошивку так, чтобы она дампила все содержимое EEPROM и передавала его по UART. Код форматирования бинарных данных в стиле того, как это делает hexdump, можно взять из поста Перехват сетевого трафика при помощи библиотеки libpcap (процедура print_data_hex). В итоге должен получиться приятный такой отладочный инструмент — простенький, но со вкусом.

Вы можете прислать свой комментарий мне на почту, или воспользоваться комментариями в Telegram-группе.

Обзор программатора для FLASH и EEPROM на CH341A

Сегодня рассмотрим простой но очень функциональный программатор на микросхеме CH341A (MinProgramment), который программирует микросхемы 24 и 25 серии используемые в материнских платах, роутеров, ноутбуков, маршрутизаторов и так далее.

Обзор программатора для FLASH и EEPROM на CH341A

Технические параметры CH341A

► Напряжение питания: 5 В, DC
► Интерфейс: USB 2.0
► Программирование/ чтение: FLASH и EEPROM 24-25 серий
► Габариты: 85 мм x 27 мм x 15 мм
► Поддержка ОС: Windows Vista, Windows 7, Windows 8.1, Windows 10

Общие сведения

CH341A Programment, это программатор начального уровня, изготовлена на черном стеклотекстолите (существует вариант на зеленом текстолите) с серебристой окантовкой. В комплект входит зеленая печатная плата и два штыревых разъема 1х4 (шаг 2.54 мм), данный комплект, позволит прошивать микросхемы SMD исполнении, очень удобно, если необходимо прошить пару микросхем, но если планируете использовать программатор постоянно, советую приобрести, так называемые ZIF переходники на 150 mil и 200 mil, позволяющие устанавливать SMD микросхемы без пайки.

На верхней части программатора, установлена микросхема CH341А, рядом располагается кварцевый резонатор на 12 МГц, стабилизатор напряжения AMS1117-3.3 который выдает 3.3В, а так же электрическая обвязка всех этих компонентов (резисторы, конденсатора). Для программирования микросхем, установлена 16 контактная DIP панель с нулевым усилием с маркировкой TFXTDOL. С двух стороны DIP панели, располагается две группы дополнительных контактов, назначение каждого можно посмотреть на обратной стороне платы.

Обзор программатора для FLASH и EEPROM на CH341A

На другой стороне платы, дополнительно добавлено место для установки SMD микросхем (150 mil и 200 mil) и нарисована шёлкография.

Назначение группы контактов 1:
► 1,2,3 – выбор режима работы (1-2 режим Paralell (внутренней) и 2-3 режим Serial (внешней)
► TX – передаваемые данные
► RX – принимаемые данные
► GND – питание земля
► 5V – питание +5 В

Назначение группы контактов 2:
► CLK – линия тактирования (Serial CLock)
► CS – режим работы
► MOSI – прием данных
► MISO – передача данных
► GND – питание земля
► 3.3V – питание +3.3 В
► 5V – питание +5 В

Подключение программатора MinProgramment

Подключаем программатор к порту USB на компьютере, если все нормально, на плате загорится красный светодиод. Далее операционная система начнет поиск драйвера, если драйвера в системе нету, необходимо самостоятельно скачать его CH341SER.ZIP (при ошибки 43 необходимо посмотреть эту статью). Распаковываем архив и запускаем установочный файл «setup.exe», в открытом окне жмем «INSTALL» (драйвер подходит и для CH340).

Установка драйвера CH341A

При включенном, режиме Paralell (1 — 2) в разделе «Интерфейсы» появится новое устройство «USB-EEP/I2C… CH341A», а при включенном режиме Serial (2 — 3) в разделе «Порты (COM и LPT)» появится новое устройство «USB-SERIAL CH341A».
Теперь необходимо установить программное обеспечение для работы с программатором, в примере использую русифицированную «CH341A — USB Programmer 1.30». Скачиваем и разархивируем архив, запускаем установочный файл, процесс установки не сложный и состоит из четырех этапрв.

Установка программы CH341A

Программатор готов к прошивке микросхем.

Инструкция по прошивке

Теперь приступим к программированию (режим Paralell). Если программировать микросхемы в SMD корпусе, то необходимо использовать ZIF-панель или адаптер (что идет в комплекте). Припеваем или устанавливаем микросхему и с помощью прижимного рычага, зажимаем адаптер в программаторе. Очень важно, устанавливать микросхему по ключу, в противном случаи можно испортить микросхему.

Выбор режима на CH341A

► Запускаем программу CH341A — USB Programmer 1.3, при приключением и в режиме Paralell, программа автоматически найдет программатор.

Обзор программатора для FLASH и EEPROM на CH341A

► В примере использую микросхему «24C04», нажимаем «Поиск Чипа», выбираем нужный чип 24C04 и жмем «Читать», если все правильно подключено, программатор скачает прошивку.

Обзор программатора для FLASH и EEPROM на CH341A

► Для прошивки микросхемы, необходимо нажать кнопку «Открыть», затем выбираем файл прошивки, и жмем «Авто» микросхема прошита.

► Также есть, программатор позволяет прошивать по ISP интерфейсу (внутрисхемному) и может работать как COM порт (аналогично, адаптеру PL2303HA).

Список поддерживаемых микросхем CH341A (602 шт)

25/26 SPI FLASH

AMIC: A25L05P, A25L512, A25L010, A25L10P, A25L020, A25L20P, A25L040, A25L40P, A25L080, A25L80P, A25L016, A25L16P, A25L032;
ATMEL: AT25F512, AT25F512A, AT25F512B, AT25F1024, AT25F1024A, AT25FS010, AT25DF021, AT25F2048, AT25DF041A, AT25F4096, AT25FS040, AT26DF041A, AT26F004, AT25DF081A 1.8V, AT25DL081 1.8V, AT26DF081A, AT25DF161, AT26DF161, AT26DF161A, AT25DF321, AT25DF321A, AT26DF321, AT25DF641;
COMMON: 25X005, 25X05, 25X10, 25X20, 25X40, 25X80, 25X16, 25X32, 25X64, 25X128, 25X256, 25X512, 25X1024, 25X2048;
EON: EN25B05, EN25B05T, EN25F05, EN25LF05, EN25P05, EN25D10, EN25LF10, EN25P10, EN25D20, EN25F20, EN25LF20, EN25D40, EN25F40, EN25LF40, EN25D80, EN25F80, EN25P80, EN25Q80, EN25QH80, EN25T80, EN25B16, EN25B16T, EN25D16, EN25F16, EN25H16, EN25Q16, EN25QH16, EN25T16, EN25B32, EN25B32T, EN25F32, EN25P32, EN25Q32, EN25QH32, EN25B64, EN25B64T, EN25F64, EN25Q64, EN25QH64, EN25F128, EN25Q128, EN25QH128;
ES: ES25P10, ES25P20, ES25M40, ES25M40A, ES25P40, ES25M80, ES25M80A, ES25P80, ES25M16, ES25M16A, ES25P16A, ES25P32;
ESMT: F25L004A, AF25L04UA, F25L008A, F25L08PA, F25L016PA, F25L16PA, F25L32PA, F25L32QA, F25L64PA;
KH: KH25L4006E, KH25L80360, KH25L8006E(OTP), KH25L1606E(OTP);
FUDAN MICRO: FM25F005, FM25F01, FM25F02, FM25F04, FM25Q08, FM25Q16, FM25Q32;
GIGADEVICE: GD25D05, GD25Q512, GD25D10, GD25Q10, GD25Q20, GD25Q21, GD25D40, GD25F40, GD25LQ40 1.8V, GD25Q41, GD25D80, GD25F80, GD25LQ80 1.8V, GD25Q80, GD25T80, GD25LQ16 1.8V, GD25Q16, GD25LQ32 1.8V, GD25Q32, GD25LQ64 1.8V, GD25Q64, GD25LQ128 1.8V, GD25Q128, GD25LQ256 1.8V;
INTEL: 25F160A33B, 25F320S33B, 25F640S33B;
KH: KH25L4006E, KH25L8006E, KH25L8036D, KH25L1606E;
MICRON: N25Q64A;
MSHINE: MS25X05, MS25X10, MS25X20, MS25X40, MS25X80, MS25X16, MS25X32, MS25X64, M525X128;
MXIC: MX25V512, MX25V512 2.5V, MX25L1005, MX25V1006 2.5V, MX25V1035 2.5V, MX25L2005, MX25L2026, MX25V2006 2.5V, MX25V2035 2.5V, MX25L4005A, MX25U4035 1.8V, MX25V4005 2.5V, MX25V4006 2.5V, MX25V4035 2.5V, MX25L8005, MX25L8006E, MX25L8035E, MX25L8036E, MX25U8033E 1.8V, MX25U8035 1.8V, MX25V8005 2.5V, MX25V8006E 2.5V, MX25V8035 2.5V, MX25L1605D, MX25L1606E, MX25L1608D, MX25L1608E, MX25L1633E, MX25L1635E, MX25L1636D, MX25L1636E, MX25U1635E 1.8V, MX25L3205D, MX25L3206E, MX25L3028D, MX25L3208E, MX25L3225D, MX25L3233F, MX25L3235D, MX25L3235E, MX25L3236D, MX25L3236F, MX25L3237D, MX25L3239E, MX25L3273E, MX25L3273F, MX25U3235E 1.8V, MX25L6405D, MX25L6406E, MX25L6408D, MX25L6408E, MX25L6433F, MX25L6435E, MX25L6436E, MX25L6436F, MX25L6439E, MX25L6445E, MX25L6455E, MX25L6465E, MX25L6473E, MX25L6473F, MX25L6475E, MX25U6435E 1.8V, MX25L12805D, MX25L12835E, MX25L12835F, MX25L12836E, MX25L12839F, MX25L12845E, MX25L12855E, MX25L12865E, MX25L12873F, MX25U12835F 1.8V, MX25L25635E, MX25L25635F, MX25L25639F, MX25L25645G, MX25L25735E, MX25U25635F 1.8V, MX25U25645G 1.8V, MX25L51245G, MX25U51245G 1.8V, MX66L51235F, MX66U51235F 1.8V, MX66L1G45G, MX66U1G45G 1.8V, MX66L2G45G, MX66U2G45G 1.8V;
NEXFLASH: NX25P10, NX25P20, NX25P40, NX25P80, NX25P16, NX25P32;
PMC: PM25LVS12A, PM25LV010A, PM25LV020, PM25LV040, PM25LV080B, PM25LV016B;
SAIFUN: SA2SF005, SA25F010, SA25F020, SA25F040, SA25F080, SA25F160, SA25F320;
SANYO: LE25FU106 2.5V, LE25FU206 2.5V, LE25FS406 1.8V, LE25FU406 2.5V;
SPANSION: S25FL001, S25FL001, S25FL004, S25FL040, S25FL008, S25FL016, S25FL160, S25FL032, S25FL064, S25FL128, 25FL129, S25FL256, S25FL512;
SST: SST25VF512, SST25VF512A, SST25VF010, SST25VF010A, SST25LF020A, SST25VF020, SST25VF020A, SST25VF040, SST25VF040A, SST25VF040B, SST25VF080B, SST25VF016B, SST25VF032B, SST25VF064C;
ST: M25P05A, M25P10A, M25PE10, M25P20, M25PE20, M25P40, M25PE40, M25P80, M25PE80, M25PX80, M25P16, M25PE16, M25PX16, M25P32, M25PE32, M25PX32, M25P64, M25PE64, M25PX64, M25P128;
WINBOND: W25P10, W25X10, W25X10A, W25X10AL, W25X10L, W25P20, W25Q20BW, W25X20, W25X20A, W25X20AL, W25X20L, W25P40, W25Q40BV, W25Q40BW, W25X40, W25X40A, W25X40AL, W25X40L, W25P80, W25Q80BV, W25Q80BW, W25Q80V, W25X80, W25X80A, W25X80AL, W25X80L, W25P16, W25Q16BV, W25Q16CV, W25Q16DW, W25Q16V, W25X16,W25P32, W25Q32BV, W25Q32CV, W25QDW, W25Q32FV, W25Q32V, W25X32, W25P64, W25Q64BV, W25Q64CV, W25Q64DW, W25Q64FV, W25Q64FW, W25X64, W25Q128BV, W25Q128CV, W25Q128DW, W25Q128FV, W25Q128FW, W25Q256BV, W25Q256FV;

24 EEPROM

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, AT24C256A, AT24C256, AT24C256B, AT24C512B, AT24C512A, AT24C512, AT24C1024, AT24C1024A, AT24C1024B;
CATALYST: CAT24C01, CAT24WC01, CAT24C02, CAT24WC02, CAT24C04, CAT24WC04, CAT24WC08, CAT24C08, CAT24WC16, CAT24C16, CAT24WC32, CAT24C32, CAT24WC64, CAT24C64, CAT24C128, CAT24WC128, CAT24C256, CAT24WC2S6, CAT24C512, CAT24WC512, CAT24C1024, CAT24WC1024;
COMMON: 24C01 3V, 24C01 5V, 24C02 3V, 24C02 5V, 24C04 3V, 24C04 5V, 24C08 3V, 24C08 5V, 24C16 5V, 24C16 3V, 24C32 5V, 24C32 3V, 24C64 5V, 24C64 3V, 24C128 SV, 24C128 3V, 24C256 5V, 24C256 3V, 24C512 5V, 24C512 3V, 24C1024 3V, 24C1024 5V, 24C2048 5V, 24C2048 3V, 24C4096 5V, 24C4096 3V;
FAIRCHILD: FM24C01L, FM24C02L, FM24C03L, FM24C05L, FM24C04L, FM24C08L, FM24C09L, FM24C17L, FM24C16L, FM24C32L, FM24C64L, FM24C128L, FM24C256L, FM24C512L, FM24C512L, FM24C1024L;
HOLTEK: HT24C01, HT24LC01, HT24LC02, HT24C02, HT24C04, HT24LC04, HT24C08, HT24LC08, HT24C16, HT24LC16, HT24LC32, HT24C32, HT24LC64, HT24C64, HT24C128, HT24LC128, HT24LC256, HT24C256, HT24LC512, HT24C512, HT24C1024, HT24LC1024;
ISSI: IS24C01, IS24C02, IS24C04, IS24C08, IS24C16, IS24C32, IS24C64, IS24C128, IS24C256, IS24C512, IS24C1024;
MICROCHIP: MIC24LC014, MIC24AA01, MIC24AA014, MIC24LC01B, MIC24LC02B, MIC24AA02, MIC24C02C, MIC24AA024, MIC24LC025, MIC24LC024, MIC24LC04B, MIC24AA04, MIC24AA025, MIC24LC088, MIC24AA08, MIC24LC16B, MIC24AA16, MIC24LC32, MIC24AA32, MIC24LC64, MIC24AA64, MIC24FC64, MIC24FC128, MIC24AA128, MIC24LC128, MIC24AA256, MIC24LC256, MIC24FC2S6, MIC24AA512, MIC24LC512, MIC24FC512, MIC24AA1024;
NSC: NSC24C02L, NSC24C02, NSC24C64;
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, ST24C02, ST24C04, ST24C08, ST24C16, ST24C32, ST24C64;
XICOR: X24C01, X24C02, X24C04, X24C08, X24C16;

25 SPI EEPROM

ATMEL: AT25010, AT25020, AT25040, AT25080, AT25160, AT25360, AT25640, AT25128, AT25256, AT25512;
MICROCHIP: 25AA080C, 25AA080D, 25C080 5V, 25LC080C, 25LC080D, 25AA160, 25C160 5V, 25LC160, 25AA320, 25C320 5V, 25LC320, 25AA640, 25C640 5V, 25LC640, 25AA256, 25LC256, 25AA512, 25LC512, 25AA1024, 25LC1024

Ссылки
Скачать драйвер для CH341A (Windows)
Скачать программу CH341A USB Programmer v.1.30
Скачать программу CH341A USB Programmer v.1.34

Купить на Aliexpress
Программатор для FLASH и EEPROM на CH341
Адаптер SOP8 (150mil и 200mil)
Клипса-адаптер SOIC8

Купить в Самаре и области
Программатор для FLASH и EEPROM на CH341
Адаптер SOP8 150mil
Адаптер SOP8 200mil
Клипса-адаптер SOIC8
Адаптер на 1.8v для программатора CH341A

Related Posts