| Глава 5. Память - Memory
Раздел 5.2. Контроллер Nand Flash (NDFC) - Nand Flash Controller(NDFC)
5.2. Контроллер Nand Flash (NDFC)
5.2.1. Обзор NDFC - это контроллер флэш-памяти NAND, который поддерживает всю флэш-память NAND, доступную на рынке. Флеш-память нового типа может поддерживаться путем изменения конфигурации программного обеспечения. Код исправления ошибок на лету (ECC) встроен в NDFC для повышения надежности. Реализован BCH, который может обнаруживать и исправлять до 80 ошибок на 1024 байта данных. Встроенная схема ECC и проверки четности NDFC освобождает CPU для других задач. Функцию ECC можно отключить программно. Данные могут быть переданы с помощью прямого доступа к памяти или методом ввода-вывода с отображением памяти ЦП. NDFC обеспечивает автоматический контроль времени для чтения или записи внешней Flash. NDFC поддерживает надлежащую относительность для линий управляющих сигналов CLE, CE # и ALE. Существует три различных режима доступа для последовательного чтения: mode0 - для обычного последовательного доступа, mode1 - для типа EDO, а mode2 - для расширенного типа EDO. NDFC может контролировать состояние сигнальной линии R / B #. Управление блоками и управление выравниванием износа реализовано программно. NDFC имеет следующие особенности: Поддерживает все доступные на рынке флеш-память SLC / MLC / TLC и EF-NAND Настройте рандомизацию начального числа двигателя с помощью программного обеспечения Метод настройки программного обеспечения для различных типов системы и памяти Поддерживает 2 выбора микросхемы и 2 сигнала готовности к работе Ширина шины данных до 8 бит Поддерживает размер 1024, 2048, 4096, 8192, 16384, 32768 байтов на страницу Обычный и последовательный метод доступа EDO для последовательного чтения Flash 80 бит / 1 КБ Проверка кода BCH на лету и исправление ошибок Выводит информацию о количестве битов об исправленной ошибке Функция автоматического отключения ECC для всех данных 0xff Информация о состоянии NDFC передается его регистрами, поддерживается прерывание One Command FIFO Внутренний контроллер DMA на основе цепочечного списка дескрипторов Два 256x32-битных RAM для конвейерной обработки Поддерживает SDR, ONFI DDR1.0, Toggle DDR1.0, ONFI DDR2.0 и Toggle DDR2.0 RAW NAND FLASH Максимальная частота ввода-вывода 50 МГц в режиме SDR и 60 МГц в режимах DDR1.0 и DDR2.0 Самостоятельная отладка для отладки NDFC
5.2.2. Блок-схема Блок-схема NDFC показана ниже. Рисунок 5-1. Блок-схема NDFC.
5.2.3. Операции и функциональное описание 5.2.3.1Внешние сигналы В Таблице 5-1 описаны внешние сигналы NDFC. DQ0 ~ DQ7 и DQS - это двунаправленный ввод / вывод. WE, ALE, CLE, CE, RE - выходной контакт, RB - входной контакт. Вывод RB в устройстве NAND представляет собой драйвер с открытым стоком, для которого необходим подтягивающий резистор. 5.2.3.2Источники часов Чтобы обеспечить эффективность ECC, механизм ECC и внутренняя логика NDFC используют разные часы. Тактовая частота внутренней логики NDFC задается регистром тактовой частоты NAND_0, тактовая частота механизма ECC устанавливается регистром тактовой частоты NAND_1. Обратите внимание, что регистр тактовой частоты NAND_0 устанавливает внутреннюю логическую тактовую частоту NDFC, но частота внешнего устройства NAND Flash составляет половину от NDFC внутренние логические часы. То есть, если внешняя Nand Flash работает на частоте 40 МГц, тогда NDFC необходимо установить на 80 МГц. И механизм ECC, и внутренняя логика NDFC имеют пять разных источников синхронизации. Пользователи могут выбрать один из них, чтобы сделать механизм ECC или источник внутренних логических часов. В Таблице 5-2 описаны источники синхронизации NDFC. Пользователи могут увидеть CCU в главе 3.3 для информации о настройке часов, конфигурации и стробировании. Таблица 5-2. Источники тактовой частоты NDFC Источники часов Описание OSC24M Кристалл 24 МГц PLL_PERIPH0 (1X) Периферийные часы, значение по умолчанию - 600 МГц PLL_PERIPH1 (1X) Периферийные часы, значение по умолчанию - 600 МГц PLL_PERIPH0 (2X) Периферийные часы, значение по умолчанию 1,2 ГГц PLL_PERIPH1 (2X) Периферийные часы, значение по умолчанию - 1,2 ГГц 5.2.3.3Временная диаграмма Обычно существует два вида методов последовательного доступа. Одним из методов является традиционный метод, который выбирает данные на переднем фронте сигнальной линии NDFC_RE #. Другой тип - EDO, который выбирает данные на следующем спадающем фронте сигнальной линии NDFC_RE #. Рисунок 5-2. Цикл обычного последовательного доступа (SAM0) Рисунок 5-3. Последовательный доступ типа EDO после цикла чтения (SAM1) Рисунок 5-4. Расширение режима последовательного доступа типа EDO (SAM2) Рисунок 5-5. Цикл фиксации команды Рисунок 5-6. Цикл фиксации адреса Рисунок 5-7. Цикл записи данных во флэш-память. Рисунок 5-8. Диаграмма ожидания R / B # Ready. Рис. 5-9. Временная диаграмма от WE # High до RE # Low. Рис. 5-10. Временная диаграмма RE # High - WE # Low. Рисунок 5-11. Временная диаграмма загрузки данных. Список временных циклов: ID Параметр Время (нс) Примечания t1 Время установки NDFC_CLE 2T t2 Время удержания NDFC_CLE 2T t3 Время установки NDFC_CE 2T t4 Время удержания NDFC_CE 2T t5 NDFC_WE # ширина импульса T (1) t6 NDFC_WE # время удержания T t7 Время установки NDFC_ALE 2T t8 Время установки данных T t9 Время удержания данных T t10 Готов к NDFC_RE # low 3T t11 NDFC_ALE время удержания 2T t12 NDFC_RE # ширина импульса T t13 NDFC_RE # время удержания T t14 Время цикла чтения 2T t15 Время цикла записи 2T t16 NDFC_WE # от высокого к R / B # занято T_WB (2) Задается регистром настройки синхронизации (NDFC_TIMING_CFG) t17 NDFC_WE # high to NDFC_RE # low T_WHR (3) Задается регистром настройки синхронизации (NDFC_TIMING_CFG) t18 NDFC_RE # high to NDFC_WE # low T_RHW (4) Задается регистром настройки синхронизации (NDFC_TIMING_CFG) t19 Адрес для времени загрузки данных T_ADL (5) Задается регистром настройки синхронизации (NDFC_TIMING_CFG) Примечание (1): T - это цикл внутренних часов Примечание (2), (3), (4), (5): эти значения настраиваются в контроллере nand flash. Значение T_WB может быть 14 * 2T / 22 * ??2T / 30 * 2T / 38 * 2T, значение T_WHR может быть 0 * 2T / 6 * 2T / 14 * 2T / 22 * ??2T, значение T_RHW может быть 4 * 2T / 12 * 2T / 20 * 2T / 28 * 2T, значение T_ADL может быть 0 * 2T / 6 * 2T / 14 * 2T / 22 * ??2T. Рисунок 5-12. Диаграмма команд чтения страницы Рисунок 5-13. Диаграмма программы страницы Рисунок 5-14. Диаграмма чтения страницы EF-NAND Рисунок 5-15. Диаграмма чтения страницы с чередованием 5.2.3.4. Дескрипторы внутреннего контроллера DMA 5.2.3.4.1. Структура дескриптора Внутренний контроллер DMA NDFC может передавать данные между DMA FIFO в NDFC и буфером DMA в памяти хоста, используя дескрипторы DMA. Дескрипторы DMA в памяти хоста с цепочечной структурой показаны на рисунке 5-16. Рисунок 5-16. Внутренняя структура цепочки дескрипторов DMA Начальный адрес списка дескрипторов DMA должен быть выровнен по слову (32 бита) и будет настроен как регистр базового адреса списка дескрипторов DMA NDFC. Каждый дескриптор DMA состоит из четырех слов (32-битных). 5.2.3.4.2. Определение дескриптора Конфиг Бит Описание 31: 4 / 3 FIRST_FLAG Когда установлен, этот бит указывает, что этот дескриптор содержит первый буфер данных. В первом дескрипторе должно быть установлено значение 1. 2 LAST_FLAG Когда установлен, этот бит указывает, что буферы, указанные этим дескриптором, являются последним буфером данных. 1: 0 / Размер Бит Описание 31:16 / 15: 0 BUFF_SIZE Эти биты указывают размер байта буфера данных, который должен быть кратным 8 байтам. Если это поле равно 0, DMA игнорирует этот буфер и переходит к следующему дескриптору. Buff Addr Бит Описание 31: 0 BUFF_ADDR Эти биты указывают физический адрес буфера данных DMA в памяти хоста. Адрес буфера должен быть выровнен на 4 байта. Следующее описание Бит Описание 31: 0 NEXT_DESC_ADDR Эти биты указывают на наличие указателя на физическую память хоста следующего дескриптора. 5.2.3.5Регистр маски блока данных NDFC ECC_DATA_BLOCK записывается или считывается через значение регистра маски блока данных NDFC. Но в реальном сценарии приложения емкость не может быть потрачена впустую, поэтому операция записи обычно не использует эту функцию, используется только операция чтения. При чтении мы разделяем режим последовательности и режим чередования на позицию сохранения user_data. Последовательный режим: user_data каждой 1K данных основной области и данные кодера ECC находятся рядом с данными основной области. Режим чередования: все данные кодировщика user_data и ECC хранятся с позиции page_size. Когда любой ECC_DATA_BLOCK на странице считывается с помощью пакетной команды (NDFC_CMD_TYPE в регистре 0x24 равен 0x10), регистр используется по-разному для режима последовательности и режима чередования. Последовательный режим может поддерживать только продолжение ECC_DATA_BLOCK, значение регистра может быть только 0x1,0x3,0x7 и т.д. Но режим чередования не имеет ограничений. Независимо от режима последовательности или режима чередования, первое чтение ECC_DATA_BLOCK используется для вычисления соответствующего адреса столбца, а адрес столбца записывается в регистры 0x14 и 0x18. 5.2.3.6Регистр расширенных функций NDFC Бит [24] и бит [23:16] регистра используются для определения того, нужно ли заполнять свободное пространство случайными данными, за исключением достоверных данных, когда используется функция пакетной команды. В качестве примера возьмем микросхему SanDisk (SDTNQGAMA-008G): Обратитесь к спецификации чипа SanDisk, размер страницы чипа SanDisk составляет (16384 + 1280) байтов, но уровень BCH использует 40 бит / 1 КБ, если user_data составляет 32 байта, то используемое пространство составляет 1152 байта (14 * 40/8 * 16 + 32), 128 байтов (1280-1152) не записываются. Если необходимо заполнить 1 страницу, то бит [24] регистра может быть установлен в 1, а бит [23:16] записывается в 0x80, чтобы контроллер мог автоматически заполнять 128 байтов случайными данными. Примечание Убедитесь, что функция случайного выбора включена, если необходимо отправить случайные данные, то есть NDFC_RANDOM_EN регистра 0x34 равно 0x1, иначе данные заполнения не являются случайными, все равно 0.
5.2.4. Рекомендации по программированию 5.2.4.1Инициализация Nand Flash Флэш-память NAND инициализируется следующим образом: Шаг 1. Считайте NDFC_ST [NDFC_RB_STATE0] для ожидания вспышки в состоянии ожидания. Шаг 2. Настройте NDFC_CMD [NDFC_SEND_FIRST_CMD] на 1 для отправки первой команды, настройте NDFC_CMD [NDFC_WAIT_FLAG] на 1, чтобы установить RB ожидания; напишите 0xFF в NDFC_CMD [NDFC_CMD_LOW_BYTE] для отправки команды сброса. Шаг 3. Считайте NDFC_ST [NDFC_CMD_INT_FLAG] для ожидания флага прерывания завершения команды передачи, после ожидания, Запишите 1, чтобы сбросить флаг. 5.2.4.2Стирание Nand Flash NAND Flash стирается следующим образом: Шаг 1. Считайте NDFC_ST [NDFC_RB_STATE0] для ожидания вспышки в состоянии ожидания. Шаг 2. Настройте NDFC_CMD [NDFC_SEND_FIRST_CMD] на 1 для отправки первой команды, настройте NDFC_CMD [NDFC_WAIT_FLAG] на 1, чтобы установить RB ожидания; Настройте NDFC_CMD [NDFC_SEND_ADR] на 1, чтобы включить адрес передачи, настройте NDFC_CMD [NDFC_ADR_NUM], чтобы установить номер адреса для передачи; Запишите адрес удаляемого блока в NDFC_ADDR_LOW и NDFC_ADDR_HIGH; Установите NDFC_CMD [NDFC_CMD_LOW_BYTE] на 0x60 для отправки команды стирания блока. Шаг 3: Считайте NDFC_ST [NDFC_CMD_INT_FLAG] для ожидания флага прерывания завершения команды передачи, после ожидания запишите 1, чтобы сбросить флаг. Шаг 4: Считайте NDFC_ST [NDFC_RB_STATE0] для ожидания вспышки в состоянии ожидания. Шаг 5: Установите NDFC_CMD [NDFC_WAIT_FLAG] в 1, чтобы гарантировать RB ожидания, установите NDFC_CMD [NDFC_SEND_FIRST_CMD] в 1, чтобы отправить первую команду; установите NDFC_CMD [NDFC_CMD_LOW_BYTE] на 0xD0 для отправки команды стирания. Шаг 6: Считайте NDFC_ST [NDFC_CMD_INT_FLAG] для ожидания флага прерывания завершения команды передачи, после ожидания введите 1, чтобы сбросить флаг. Шаг 7. Считайте состояние флэш-памяти, пока флэш-память не будет готова, настройте NDFC_CNT [NDFC_DATA_CNT] для установки 1-байтовых данных передачи, установите NDFC_CMD [NDFC_SEND_FIRST_CMD, NDFC_DATA_TRANS] на 0x3, чтобы отправить первую команду и передать данные. Установите NDFC_CMD [NDFC_CMD_LOW_BYTE] на 0x70 для отправки команды состояния чтения, прочтите RAM0_BASE, чтобы дождаться состояния готовности. 5.2.4.3 Запись Nand Flash Шаг 1: Удалите адрес блока, который будет работать. Шаг 2: Считайте NDFC_ST [NDFC_RB_STATE0] для ожидания вспышки в состоянии ожидания. Шаг 3: Настройте RAM0_BASE для записи данных в RAM0. Шаг 4: Настройте NDFC_CNT [NDFC_DATA_CNT] для установки передаваемых данных; - Установите NDFC_CMD [NDFC_SEND_FIRST_CMD] на 1 для отправки первой команды, настройте NDFC_CMD [NDFC_DATA_TRANS, NDFC_ACCESS_DIR] на 0x3, чтобы установить направление доступа как запись; - Установите NDFC_CMD [NDFC_SEND_ADR] на 1, чтобы включить адрес передачи, настройте NDFC_CMD [NDFC_ADR_NUM], чтобы установить номер адреса для передачи, запишите адрес блока, который будет работать, в NDFC_ADDR_LOW и NDFC_ADDR_HIGH; - Установите NDFC_CMD [NDFC_CMD_LOW_BYTE] на 0x80 для отправки команды программы страницы. Шаг 5: Считайте NDFC_ST [NDFC_RB_STATE0] для ожидания вспышки в состоянии ожидания. Шаг 6: Настройте NDFC_CMD [NDFC_SEND_FIRST_CMD] на 1, чтобы отправить первую команду, настройте NDFC_CMD [NDFC_WAIT_FLAG] на 1, чтобы установить RB ожидания; настройте NDFC_CMD [NDFC_CMD_LOW_BYTE] на 0x10 для отправки команды завершения. Шаг 7: Считайте NDFC_ST [NDFC_CMD_INT_FLAG] для ожидания флага прерывания завершения команды передачи, после ожидания запишите 1, чтобы сбросить флаг. 5.2.4.4Чтение Nand Flash Шаг 1. Считайте NDFC_ST [NDFC_RB_STATE0] для ожидания вспышки в состоянии ожидания. Шаг 2. Настройте NDFC_CNT [NDFC_DATA_CNT] для установки передаваемых данных; - Настройте NDFC_CMD [NDFC_SEND_FIRST_CMD] на 1 для отправки первой команды; Настройте NDFC_CMD [NDFC_ACCESS_DIR] на 0, чтобы установить направление доступа как чтение; - Установите NDFC_CMD [NDFC_SEND_ADR] на 1, чтобы включить адрес передачи, настройте NDFC_CMD [NDFC_ADR_NUM], чтобы установить номер адреса для передачи, запишите адрес блока, который будет работать, в NDFC_ADDR_LOW и NDFC_ADDR_HIGH; - Установите NDFC_CMD [NDFC_CMD_LOW_BYTE] на 0x00 для отправки команды чтения страницы. Шаг 3. Считайте NDFC_ST [NDFC_RB_STATE0] для ожидания вспышки в состоянии ожидания. Шаг 4: Настройте NDFC_CMD [NDFC_SEND_FIRST_CMD] на 1, чтобы отправить первую команду, настройте NDFC_CMD [NDFC_WAIT_FLAG] на 1, чтобы установить RB ожидания; настройте NDFC_CMD [NDFC_CMD_LOW_BYTE] на 0x30 для отправки команды завершения. Шаг 5: Прочтите RAM0_BASE, чтобы получить данные из флеш-памяти. Шаг 6: Считайте NDFC_ST [NDFC_CMD_INT_FLAG] для ожидания флага прерывания завершения команды передачи, после ожидания введите 1, чтобы сбросить флаг.
|
|