Как использовать внешнюю память Eeprom и Flash с микроконтроллерами Pic
Введение во внешнюю память с микроконтроллерами PIC
Микроконтроллеры PIC от Microchip предлагают внутренние EEPROM и Flash для хранения кода приложения и небольших объемов данных, но сложные проекты часто требуют большей емкости. Внешние чипы EEPROM (Electrically Erasable Programmable Read-Only Memory) и Flash Memory обеспечивают дополнительное энергонезависимое хранилище, необходимое для регистрации данных, параметров конфигурации, обновлений прошивки и мультимедийных активов. Это расширенное руководство проведет вас через выбор, подключение и программирование этих внешних устройств памяти с микроконтроллерами PIC, покрывая как интерфейсы I2C, так и SPI в глубину.
Независимо от того, строите ли вы регистратор данных, интеллектуальный сенсорный узел или встроенную систему, которая должна сохранять критические настройки после потери мощности, понимание того, как эффективно взаимодействовать с внешней памятью, сэкономит время разработки и повысит надежность. Мы обсудим аппаратную проводку, детали протокола связи, практические примеры кода, обработку ошибок и передовые методы, такие как выравнивание износа и управление блоками.
Понимание внешней EEPROM и флэш-памяти
И EEPROM, и Flash являются энергонезависимыми технологиями памяти, то есть сохраняют данные при удалении питания, но отличаются архитектурой, выносливостью и типичными вариантами использования:
- EEPROM — поддерживает операции чтения и записи на байтовом уровне. Его выносливость обычно составляет 1 миллион циклов стирания/записи на байт. EEPROM идеально подходит для хранения небольших количеств часто обновляемых данных (например, константы калибровки, предпочтения пользователей). Общие емкости варьируются от 1 кбит до 512 кбит.
- Флэш-память — оптимизирована для стирания на уровне блоков и программных операций. Flash предлагает гораздо более высокую плотность (мегабиты до гигабитов), но меньшую выносливость (обычно от 10 000 до 100 000 циклов стирания на блок). Он используется для хранения прошивки, больших журналов данных и файловых систем. NOR Flash позволяет читать случайный доступ; NAND Flash требует доступа на уровне страницы и больше подходит для объемного хранения.
Внешние EEPROM и Flash взаимодействуют с PIC через последовательные протоколы (I2C или SPI) или редко параллельные шины. Серийные интерфейсы уменьшают количество контактов и упрощают компоновку печатной платы, что делает их доминирующим выбором для встроенных конструкций.
Выбор правильного устройства памяти
При выборе внешнего чипа памяти для вашего проекта PIC, оцените следующие критерии:
- Размер и емкость памяти — Оцените объем данных, генерируемых или хранящихся в вашем приложении. Для простых конфигурационных данных может быть достаточно 64-килобитной EEPROM (8 КБ). Для образцов аудио или обновлений прошивки рассмотрите 16 Мбит или более крупный SPI Flash.
- Протокол связи — I2C использует только два провода (SDA и SCL) и поддерживает адресацию нескольких устройств; он медленнее, но проще. SPI использует четыре провода (MISO, MOSI, SCLK, CS) и достигает более высоких скоростей, но требует выделенного чипа выбора на устройство. Выберите в зависимости от вашей скорости и доступности штифта.
- Скорость и скорость передачи данных — I2C обычно работает на частоте 100 кГц или 400 кГц; SPI может достигать десятков МГц. Если вам нужна быстрая потоковая передача (например, воспроизведение аудио), SPI является обязательным. Для случайных считываний небольших блоков конфигурации I2C хорош.
- Потребление энергии — И EEPROM, и Flash имеют активные токи чтения/записи в диапазоне миллиампер и режимах глубокого сна. Для конструкций с батарейным питанием выберите чипы с низким током ожидания (например, 1 мкА или менее).
- Работающее напряжение — Большинство PIC работают на 3,3 В или 5 В. Убедитесь, что чип памяти поддерживает тот же диапазон напряжения. Многие современные EEPROM работают от 1,7 В до 5,5 В, обеспечивая гибкость.
- Стоимость и доступность — Общие семейства включают серию 24AA Microchip (I2C EEPROM), серию 25AA (SPI EEPROM), серию SST25 или Winbond W25Q (SPI Flash) и серию AT24 (I2C EEPROM).
- Выносливость и удержание — EEPROM обычно предлагает более высокую выносливость записи, чем Flash. Удержание данных обычно составляет 40+ лет. Для Flash учитывайте количество циклов стирания и реализуйте выравнивание износа, если писать часто.
Руководство по выбору последовательной EEPROM от Microsoft содержит таблицы прямого сравнения. В портфолио последовательной NOR Flash от Winbond перечислены популярные варианты SPI Flash. Всегда читайте конкретную таблицу данных для наборов времени и команд.
Подключение внешней памяти к микроконтроллеру PIC
Аппаратные проводки зависят от интерфейса. Ниже мы подробно расскажем о соединениях I2C и SPI, а также о важных соображениях, таких как резисторы подтягивания и разъединяющие конденсаторы.
Интерфейс I2C (IIC)
I2C использует две двунаправленные линии: SDA (серийные данные) и SCL (серийные часы). Мастер (PIC) управляет часами и инициирует транзакции. Каждый раб имеет 7-битный или 10-битный адрес. Для EEPROM адрес часто содержит фиксированный префикс плюс три аппаратных адресных штифта (A0, A1, A2), которые позволяют использовать до восьми устройств на одной шине.
Перенаправлено с
- Подключите SDA к PIC I/O-пину, сконфигурированному как открытый дренаж или двунаправленный.
- Подключите SCL к другому PIC-пину ввода/вывода.
- Добавьте внешние резисторы подтягивания (обычно 4,7 кОм) от SDA и SCL до Vcc. Значение зависит от емкости шины и скорости; для 400 кГц может потребоваться 2,2 кОм.
- Подключите WP-пин памяти (защита записи) к GND, чтобы отключить защиту записи аппаратного обеспечения, или к Vcc, чтобы защитить весь массив.
- Поместите керамический конденсатор 0,1 мкФ рядом с усилителем памяти, чтобы отделить шум.
Для высокоскоростных I2C (1 МГц) сохраняйте короткие следы и используйте более сильные подтягивания. Примеры микросхем: Microchip 24LC256 (256 кбит I2C EEPROM), AT24C512 (512 кбит).
Интерфейс SPI
SPI использует четыре сигнала: MOSI (master out, slave in), MISO (master in, slave out), SCLK (серийные часы) и CS (выбор чипа, активный низкий). Каждому SPI-рабу требуется выделенная CS-линия от PIC. Несколько рабов могут совместно использовать MISO, MOSI, SCLK, если они не выбраны одновременно.
Перенаправлено с
- Подключите MOSI (PIC выход) к памяти SI (серийный вход).
- Подключите MISO (PIC вход) к SO (серийному выходу) памяти.
- Подключите SCLK (PIC выход) к памяти SCK.
- Подключите CS к PIC-цифровому выходному значку. Для нескольких запоминающих устройств используйте отдельные значки.
- Добавьте слабый подъем (10 кОм) на линии CS, если это необходимо, хотя типичной логики достаточно.
- Уменьшите мощность с помощью конденсатора 0,1 мкФ.
Чипы SPI Flash часто имеют регистры состояния и нуждаются в определенных последовательностях команд (например, WREN перед записью). Примеры микросхем: Winbond W25Q32 (32 Mbit SPI Flash), Microchip 25LC256 (256 кбит SPI EEPROM).
Программирование PIC для доступа к внешней памяти
Микроконтроллер PIC должен инициализировать соответствующий периферийный модуль (I2C или SPI), а затем отправлять / принимать данные в соответствии с протоколом чипа памяти. Можно использовать аппаратный модуль MSSP Microchip (Master Synchronous Serial Port) и программное бит-бандирование. MSSP предпочтительнее для надежности и скорости.
Пример кода связи I2C
Ниже приведен упрощенный, но функциональный пример с использованием MCC (Microchip Code Configurator), сгенерированного HAL для PIC16F18877. Код записывает один байт в I2C EEPROM по заданному адресу, а затем считывает его обратно.
// Assumes I2C1_Initialize() called earlier.
// Device address: 0xA0 (for write) – actual address depends on A0-A2 pins.
#define EEPROM_ADDR 0xA0
void I2C_WriteByte(uint16_t memAddr, uint8_t data) {
I2C1_Start(); // Generate start condition
I2C1_Write(EEPROM_ADDR); // Send device address + write bit
I2C1_Write((uint8_t)(memAddr >> 8)); // High address byte
I2C1_Write((uint8_t)(memAddr)); // Low address byte
I2C1_Write(data); // Data byte
I2C1_Stop(); // Generate stop condition
__delay_ms(5); // Wait for internal write cycle (tWR)
}
uint8_t I2C_ReadByte(uint16_t memAddr) {
uint8_t data;
I2C1_Start();
I2C1_Write(EEPROM_ADDR); // Device address + write for dummy write
I2C1_Write((uint8_t)(memAddr >> 8));
I2C1_Write((uint8_t)(memAddr));
I2C1_RepeatedStart(); // Repeated start to change direction
I2C1_Write(EEPROM_ADDR | 0x01); // Device address + read bit
data = I2C1_Read(0); // NAK after last byte
I2C1_Stop();
return data;
}
Примечание: Для написания страниц не следует пересекать границу страницы (обычно 8, 16 или 64 байта).Проконсультируйтесь с таблицей данных по размеру страницы.Кроме того, опрос для подтверждения после цикла записи более эффективен, чем фиксированные задержки.
Пример коммуникационного кода SPI
Для SPI Flash (например, W25Q32) операции записи требуют включения записи (WREN), затем отправки команды Page Program. Вот минимальный пример использования MSSP в режиме SPI master.
#define FLASH_CS LATAbits.LATA0 // Chip select pin
void SPI_WriteEnable(void) {
FLASH_CS = 0;
SPI1_Exchange8bit(0x06); // WREN command
FLASH_CS = 1;
}
void SPI_FlashPageProgram(uint32_t addr, uint8_t *data, uint8_t len) {
SPI_WriteEnable();
FLASH_CS = 0;
SPI1_Exchange8bit(0x02); // Page Program command
SPI1_Exchange8bit((uint8_t)(addr >> 16)); // High address byte
SPI1_Exchange8bit((uint8_t)(addr >> 8));
SPI1_Exchange8bit((uint8_t)(addr));
for (uint8_t i = 0; i < len; i++) {
SPI1_Exchange8bit(data[i]);
}
FLASH_CS = 1;
__delay_ms(5); // tPP max 5 ms typical
}
void SPI_FlashRead(uint32_t addr, uint8_t *buffer, uint32_t count) {
FLASH_CS = 0;
SPI1_Exchange8bit(0x03); // Read command
SPI1_Exchange8bit((uint8_t)(addr >> 16));
SPI1_Exchange8bit((uint8_t)(addr >> 8));
SPI1_Exchange8bit((uint8_t)(addr));
for (uint32_t i = 0; i < count; i++) {
buffer[i] = SPI1_Exchange8bit(0x00);
}
FLASH_CS = 1;
}
Флэш-память не может быть написана без стирания всего сектора (обычно 4 КБ). Всегда стирайте сектор перед его перепрограммированием. Используйте команду Сектора Стирания (0x20), за которой следует опрос регистра состояния, пока бит записи в процессе не прояснится.
Передовые методы: Уравнивание ношения, Управление страницами и Обновления прошивки
При хранении больших объемов данных или выполнении частых записей рассмотрите эти стратегии для продления срока службы памяти и поддержания производительности.
- Уровни ношения для EEPROM — Распределяйте записи по нескольким местоположениям. Например, сохраняйте круговой буферный индекс в выделенном слоте EEPROM и записывайте данные на следующую бесплатную страницу. Это предотвращает раннее старение одного байта.
- Управление блоками Flash — Используйте простую файловую систему или таблицу метаданных для отслеживания того, какие сектора стираются/используются. Типичные потребительские чипы SPI Flash имеют 4 сектора КБ; стирание сектора занимает десятки миллисекунд.
- Обновления прошивки по воздуху (FOTA) — Внешний Flash может содержать новое изображение прошивки. Загрузчик PIC считывает изображение, записывает его во внутренний Flash и сбрасывает. Обеспечить потерю мощности во время записи обрабатывается с помощью двойного буфера или проверки контрольной суммы.
- Обнаружение и исправление ошибок — Для критических данных приложите CRC или простые контрольные суммы XOR. На чтение проверьте целостность. Многие внешние воспоминания не имеют встроенного ECC, поэтому проверки программного обеспечения являются разумными.
Лучшие практики и устранение неполадок
Следуйте этим рекомендациям, чтобы минимизировать проблемы и добиться надежной работы.
- Всегда консультируйтесь с таблицей данных — параметры времени, наборы команд и спецификации вытягивания различаются между производителями.
- Используйте правильные резисторы для I2C — Значение зависит от емкости шины и тактовой частоты. Для шины с одним или двумя устройствами и 400 кГц начните с 4,7 кОм. Используйте осциллограф для проверки восходящих краев.
- Осуществление опроса на признание — вместо фиксированных задержек после записи, многократно отправляйте адрес устройства до получения ACK. Это адаптируется к переменному времени записи.
- Сохраняйте SPI Traces Short — SPI работает на частотах МГц; длинные провода вызывают звон. Добавьте резисторы серии (22-47 Ω) вблизи выхода PIC, чтобы ослабить отражения.
- Использовать разъемные конденсаторы — поместить 0,1 мкФ керамику как можно ближе к Vdd-пину каждого чипа памяти.
- Тест с известными шаблонами — Напишите переменные 0x55, 0xAA и проверьте. Проверьте границы адресов (например, следует избегать записи через границу страницы).
- Монитор для Bus Contention — Если несколько SPI-устройств совместно используют MISO, убедитесь, что активен только один выбор чипа. Для I2C не допустите конфликтов адресов.
- Handle Write Protection — Многие воспоминания имеют WP-пин. Либо потяните его низко, чтобы включить запись, либо контролируйте через GPIO, если вам нужна селективная защита.
Пример проекта: Data Logger с SPI Flash
Для закрепления концепций рассмотрим простой регистратор данных, который периодически считывает аналоговый датчик, хранит значение в SPI Flash (например, W25Q16) и использует круговой буфер для перезаписи самых старых данных. PIC просыпается от сна, выполняет преобразование, пишет в текущий секторный блок, обновляет указатель в EEPROM и возвращается во сне. Внешний Flash сохраняет данные за годы с минимальным энергопотреблением.
Ключевые шаги:
- Инициализируйте SPI MSSP, настройте CS pin как выход.
- При запуске прочитайте текущий указатель записи из небольшого I2C EEPROM (или из первого сектора Flash).
- Каждый цикл регистрации: читайте ADC → записывайте на страницу Flash → указатель приращения. Если указатель достигает конца выделенной области, сбросьте его для запуска (круговой).
- Опционально вычислите CRC последней страницы для выявления коррупции.
- Используйте сон с низкой мощностью между интервалами.
Этот шаблон может быть расширен на несколько датчиков, временную метку и событийную регистрацию.
Выводы и дополнительные ресурсы
Интеграция внешней EEPROM и флэш-памяти с микроконтроллерами PIC открывает широкий спектр приложений, которые требуют больше памяти, чем может обеспечить внутренняя память. Выбрав правильный интерфейс (I2C или SPI), правильно проводя и внедряя надежные процедуры чтения / записи, вы можете добавить надежное энергонезависимое хранилище в любую встроенную систему. Расширенные методы, такие как выравнивание износа, управление страницами и опросы Acknowledge, обеспечивают долгосрочную долговечность и предсказуемую производительность.
Для дальнейшего чтения изучите следующие ресурсы:
- PIC16(L)F18877 Семейный информационный бюллетень — подробная информация о конфигурации MSSP.
- Конфигуратор кода микрочипа (MCC) — автоматически генерирует периферийный код настройки.
- Winbond W25Q32JV Datasheet — общий набор команд SPI Flash.
- Микрочип 24LC256 EEPROM Datasheet — примеры синхронизации I2C.
При тщательном проектировании и тщательном тестировании внешняя память может легко масштабировать ваши PIC-проекты для обработки больших наборов данных, обновлений прошивки и постоянных потребностей в конфигурации.Начните с простой петли записи / чтения, проверьте с помощью логического анализатора или осциллографа, а затем постепенно создавайте сложность.