Перейти к основному содержимому

Постоянное запоминающее устройство

Структура​

Микросхема содержит два сегмента ПЗУ для хранения пользовательских настроек, необходимых для автоматической инициализации регистров после подачи напряжения питания или сигнала сброса.

ПЗУ с параллельным доступом​

ПЗУ с параллельным доступом активируется непосредственно при включении питания и содержит 2 ячейки, которые неразрывно связаны с управляющими регистрами PLL_config и INIT_conf. На рисунке ниже представлена структура ячейки ПЗУ.

Структура ячейки ПЗУ с параллельным доступом
Структура ячейки ПЗУ с параллельным доступом

Доступ к настройкам PLL_config и INIT_conf осуществляется через управляющий регистр UOTP_ctrl, который содержит три бита: WATCH_ROM_UVAL, PROG_NEW_UVAL и OVERRIDE_UVAL. По умолчанию значения регистров PLL_config и INIT_conf равны нулю.

Для временного переопределения этих значений (до снятия питания) необходимо записать требуемые данные в соответствующие регистры (PLL_config и INIT_conf), а затем установить бит OVERRIDE_UVAL в логическую «1». При этом заданные значения сохраняются даже при выполнении программного сброса с помощью бита MANUAL_NRST_PLL (путем записи нуля, а затем единицы).

Для программирования этих значений в энергонезависимую память ПЗУ необходимо выполнить следующую последовательность действий:

  1. Записать в регистры PLL_config и INIT_conf нужные параметры.
  2. Убедиться в корректности записи путем обратного чтения (при OVERRIDE_UVAL = 1).
  3. Установить бит PROG_NEW_UVAL и подать напряжение программирования 9,8 В ± 0,3 В на вывод VPP.
  4. По истечении заданного времени снять напряжение VPP и сбросить бит PROG_NEW_UVAL.
  5. Установить бит WATCH_ROM_UVAL в логическую «1».
  6. Считать значения из PLL_config и INIT_conf, чтобы подтвердить успешность записи.

Если считанные значения не совпадают с заданными, операцию программирования следует повторить.

Обратите внимание: в состав регистра INIT_conf входит бит OTP_init_on — разрешение автозагрузки конфигурации из BOTP при включении питания. Прожигать его в значение «1» допускается только после полного прожига и успешной проверки BOTP — см. Порядок программирования ПЗУ.

ПЗУ с последовательным доступом​

ПЗУ с последовательным доступом
ПЗУ с последовательным доступом

Второй сегмент ПЗУ предназначен для инициализации регистров конфигурации и ячеек памяти микровычислителей при включении питания. ПЗУ содержит 512 16-битных слов. Если выставлен бит OTP_init_on, после снятия сигнала сброс (при наличии тактирования), контроллер инициализации последовательно считывает данные ячеек ПЗУ и записывает в соответствующие регистры. Порядок записи жестко определен и неизменен.(см таблицу 12).

Таблица 12. Соответствие адресов ячеек памяти ПЗУ и конфигурационных регистров

+2 x 02 x 12 x 22 x 32 x 42 x 52 x 62 x 7
2 x 00 cpu11 cpu12 cpu13 cpu14 cpu15 cpu16 cpu17 cpu1
2 x 88 cpu19 cpu110 cpu111 cpu112 cpu113 cpu114 cpu115 cpu1
2 x 1616 cpu117 cpu118 cpu119 cpu120 cpu121 cpu122 cpu123 cpu1
2 x 2424 cpu125 cpu126 cpu127 cpu128 cpu129 cpu130 cpu131 cpu1
...........................
2 x 232C1KampSC1KampCC1KbiasSC1KbiasCC1fbiasC1ExPhShftC1ExoStngsC1EXInc
2 x 240C1Amp_thC1InputStngsC1Lock_thC1ZeroC1MaskC1KonturStngsC1ResCntrlC1Vcnt_bound
2 x 248233 cpu1234 cpu1235 cpu1236 cpu1233 cpu2234 cpu2235 cpu2236 cpu2
2 x 2560 cpu21 cpu22 cpu23 cpu24 cpu25 cpu26 cpu27 cpu2
...........................
2 x 488C2KampSC2KampCC2KbiasSC2KbiasCC2fbiasC2ExPhShftC2ExoStngsC2EXInc
2 x 496C2Amp_thC2InputStngsC2Lock_thC2ZeroC2MaskC2KonturStngsC2ResCntrlC2Vcnt_bound
2 x 504IC_addrADC_configMask_StatFlags_delayMR_lockCMP_lthAFE_configMode_config

Запись и чтение ПЗУ производится с помощью управляющих регистров BOTP_addr, BOTP_data, BOTP_out, BOTP_ctrl.

Для корректной работы ПЗУ (записи и чтения, в т.ч. при инициализации после включения питания) требуется настройка тактирования. Исходя из значения частоты FINT требуется выбрать значение BOTP_clkdel в соответствии с таблицей делителей в описании регистров так, чтобы частота тактирования ПЗУ Fclk_rom = FINT / N не превышала 1 МГц. Например, при FINT = 10 МГц значение BOTP_clkdel должно быть не меньше 3: при BOTP_clkdel = 2 делитель N = 8 даёт Fclk_rom = 1,25 МГц (превышает 1 МГц), а при BOTP_clkdel = 3 делитель N = 12 даёт Fclk_rom ≈ 833 кГц. При FINT = 60 МГц минимально допустимое значение — BOTP_clkdel = 11 (N = 64, Fclk_rom ≈ 938 кГц): при BOTP_clkdel = 10 делитель N = 56 даёт Fclk_rom ≈ 1,07 МГц, что превышает ограничение.

Для записи данных в ячейку ПЗУ по указанному адресу требуется записать целевой адрес в регистр BOTP_addr, а записываемое значение — в регистр BOTP_data. Установить бит NCEN в лог. «0», бит SLEEP в лог. «0», бит PGM в лог. «1». Затем поднять напряжение на выводе VPP с уровня чтения 3,3 В до напряжения программирования 9,8 В ± 0,3 В, выдержать 200 мс, после чего вернуть напряжение VPP на уровень чтения 3,3 В, сбросить бит PGM, установить бит REN и проверить записанное значение с помощью считывания ячейки BOTP_data.

Внимание! Если Вы прожгли бит OTP_init_on, при подаче питания микросхема не отвечает, то вероятной причиной является отсутствие надлежащей настройки делителя частоты. Для того чтобы микросхема ответила в этом состоянии нужно найти её IC_addr, путём последовательной записи в регистр BUS_addr всех 255 возможных значений от 1 до 255 (см. раздел Методика подключения → Обнаружение микросхемы). После нахождения адреса, нужно запрограммировать делитель BOTP_clkdel на значение, обеспечивающее Fclk_rom ≤ 1 МГц (подробно в описании BOTP_clkdel).

Внимание! Чтение ячеек последовательной ПЗУ после инициализации по событию подачи питания или сброса будет давать нулевые значения. Для того чтобы прочитать необходимо выставить бит OVERRIDE_UVAL, снять бит OTP_init_on, далее снять MANUAL_NRST_PLL, далее установить MANUAL_NRST_PLL, и тогда ячейки ПЗУ будут читаться.

Порядок программирования ПЗУ​

Автозагрузка конфигурации при включении питания включается битом OTP_init_on регистра INIT_conf. Этот бит принадлежит ПЗУ с параллельным доступом (UOTP) и должен прожигаться в последнюю очередь — только после полного прожига и успешной проверки BOTP. Правильная последовательность программирования ПЗУ:

  1. Тактирование. Настройте PLL_config и выберите значение BOTP_clkdel по таблице делителей (см. описание регистров) так, чтобы частота тактирования ПЗУ Fclk_rom = FINT / N не превышала 1 МГц.
  2. Прожиг UOTP без автозагрузки. Запишите и прожгите в UOTP регистры PLL_config и INIT_conf с выбранным значением BOTP_clkdel; бит OTP_init_on при этом должен быть равен 0 (последовательность прожига — в разделе ПЗУ с параллельным доступом).
  3. Полный прожиг BOTP. Прожгите все 512 ячеек BOTP, обязательно включая область регистров конфигурации — ячейки 504–511 (IC_addr, ADC_config, Mask_Stat, Flags_delay, MR_lock, CMP_lth, AFE_config, Mode_config — см. таблицу 12). Пропускать ячейки нельзя: незаполненная (пустая) ячейка читается как ноль, и при автозагрузке соответствующий регистр будет инициализирован нулём.
  4. Проверка BOTP. Прочитайте все 512 ячеек и убедитесь, что содержимое совпадает с заданным (о порядке чтения — предупреждение выше). При несовпадении повторите прожиг.
  5. Включение автозагрузки. Повторно прожгите INIT_conf в UOTP со значением OTP_init_on = 1 (до этого бит должен быть прожжён нулём). Значение BOTP_clkdel и остальные биты изменять нельзя.
  6. Проверка автостарта. Снимите питание (или подайте сброс) и убедитесь, что микросхема самостоятельно инициализировалась из ПЗУ и работоспособна.

Внимание! Если прожечь бит OTP_init_on до программирования BOTP (как минимум — области регистров конфигурации, ячейки 504–511), то при каждом включении питания контроллер инициализации запишет во все регистры содержимое пустой ПЗУ — нули: микровычислители будут выключены (Mode_config = 0), микросхема не будет отвечать по последовательному интерфейсу (IC_addr = 0) и окажется полностью неработоспособной. Микросхема при этом не повреждается, но будет находиться в неизвестном состоянии — для её возвращения к работоспособности потребуются значительные усилия.