Параллельный периферийный интерфейс (PPI) это полудуплексный, двунаправленный порт, который может передавать параллельно 16 бит данных. У него есть выделенный вывод тактов, 3 мультиплексированных вывода синхронизации фрейма и 4 выделенных вывода данных. Путем переконфигурирования ножек порта PF можно использовать 12 дополнительных выводов данных. Самая большая скорость передачи данных достигается с 8-битными данными, поскольку две 8-битные выборки данных можно упаковать в одно 16-битное слово данных. В этом случае предыдущая выборка помещается в 8 младших значащих бит (LSB).
Вывод PPI_CLK может принимать внешний тактовый сигнал на частоте до SCLK/2. Он не может получать тактовый сигнал внутри процессора. В таблице 11-1 показан интерфейс выводов для PPI.
Таблица 11-1. Ножки PPI.
Сигнал
Функция
Направление
Альтернативная функция
PPI15
Данные
Два направления (либо как вход, либо как выход)
PF4, SPI Enable Output
PPI14
PF5, SPI Enable Output
PPI13
PF6, SPI Enable Output
PPI12
PF7, SPI Enable Output
PPI11
PF8
PPI10
PF9
PPI9
PF10
PPI8
PF11
PPI7
PF12
PPI6
PF13
PPI5
PF14
PPI4
PF15
PPI3
Отсутствует
PPI2
PPI1
PPI0
PPI_FS3
Frame Sync3/Field (сигнал синхронизации поля)
PF3, SPI Enable Output
PPI_FS2
Frame Sync2/VSYNC (вертикальная синхронизация)
Timer 2
PPI_FS1
Frame Sync1/HSYNC (горизонтальная синхронизация)
Timer 1
PPI_CLK
Тактовый сигнал с частотой до SCLK/2
Вход тактов
Отсутствует
Если ножка GPIO порта F сконфигурирована для использования с PPI, то её позиция разряда в MMR-регистре GPIO порта F читается как 0.
[Регистры PPI]
У PPI есть 5 регистров, отображенных на адреса памяти (memory-mapped register, MMR) которые регулируют его поведение. Это следующие регистры: регистр управления (PPI control register, PPI_CONTROL), регистр состояния (PPI status register, PPI_STATUS), регистр счетчика задержки (delay count register, PPI_DELAY), регистр счетчика транзакций (transfer count register, PPI_COUNT) и регистр количества строк на фрейм (lines per frame register, PPI_FRAME).
Регистр управления, PPI control register (PPI_CONTROL), конфигурирует рабочий режим PPI, управляет полярностью сигналов и шириной данных. См. рис. 11-1, где показана битовая диаграмма этого регистра.
Рис. 11-1. PPI Control Register (PPI_CONTROL).
POLC, POLS. Биты POLC и POLS позволяют выполнить выборочную инверсию сигналов PPI_CLK и PPI_FS1/PPI_FS2 соответственно. Это предоставляет дополнительную гибкость для подключения к PPI широкого спектра источников данных и приемников с разной полярностью сигналов управления.
DLEN[2:0]. Поле бит DLEN[2:0] программирует ширину данных порта PPI в любом режиме. Обратите внимание, что поддерживаются варианты ширины данных порта от 8 до 16 бит, за исключением ширины 9 бит. Любые выводы PF, которые не используются PPI в результате настройки поля DLEN, свободны для использования как обычные выводы PF GPIO.
В режимах ITU-R 656 поле DLEN не должно конфигурироваться в любое значение для ширины данных больше чем 10 бит. Если это так, то PPI зарезервирует дополнительные выводы, делая их недоступными для других периферийных устройств.
SKIP_EN. Бит SKIP_EN, будучи установленным, позволяет селективно пропускать элементы данных, которые читаются через PPI. Путем игнорирования элементов данных PPI может сохранить полосу пропускания DMA.
SKIP_EO. Когда установлен бит SKIP_EN, бит SKIP_EO позволяет PPI игнорировать либо нечетные, либо четные элементы входящего потока данных. Это полезно, к примеру, когда считывается цветной видеосигнал в формате YCbCr (Cb, Y, Cr, Y, Cb, Y, Cr, Y...). Пропуск каждого чередующегося элемента позволяет PPI читать только значения яркости (Y) или только цвета (Cr или Cb). Это также может быть полезно, когда синхронизируются два процессора на один и тот же входящий поток видеосигнала. Один процессор может обрабатывать сигнал яркости, а другой (у которого бит SKIP_EO установлен по-другому) сигнал цвета. Эта функция пропуска допустима в режимах ITU-R 656 и RX с внешними сигналами синхронизации фрейма.
PACK_EN. Бит PACK_EN имеет значение только когда порт PPI настроен битами DLEN[2:0] на ширину 8 бит. Каждое событие на шине DMA, инициированное PPI_CLK (операция ввода или вывода) обрабатывает 16-битные элементы данных. Другими словами, порт ввода 10 бит все ещё приводит к 16-битному входному слову для каждого PPI_CLK, старшие 6 будут нулями. Подобным образом с шириной данных 8 бит также приводит к 16-битному вводимому слову, где обнулены все старшие 8 бит. В случае 8-битных данных обычно более эффективно паковать эту информацию так, чтобы два байта данных передавались в каждом 16-битном слове. Это и есть функция бита PACK_EN - когда он установлен, то разрешается упаковка данных для всех режимов RX.
Предположим, что через PPI с помощью DMA принимаются данные:
0xCE, 0xFA, 0xFE, 0xCA, ...
Тогда если PACK_EN установлен, то через PPI, сконфигурированным для 8-битной ширины данных, будет принята последовательность байт 0xCE, 0xFA, 0xFE, 0xCA, ..., и по шине DMA будут переданы данные 0xFACE, 0xCAFE, ...
Если же PACK_EN очищен, то в PPI будут прочитаны данные 0xCE, 0xFA, 0xFE, 0xCA, ..., и по шине DMA будут переданы данные 0x00CE, 0x00FA, 0x00FE, 0x00CA, ...
Для режимов TX установка PACK_EN разрешает распаковку байт. Предположим, что в памяти находятся данные, которые будут передаваться через PPI DMA (0xFA и 0xCA это самые значащие байты MSB для соответствующих 16-битных слов):
0xFACE, 0xCAFE, ...
Тогда если PACK_EN установлен, то через PPI DMA будут переданы данные 0xFACE, 0xCAFE, ..., и сконфигурированный на 8-битную ширину слова PPI выдаст байты (обратите внимание, что младшие байты идут первыми) 0xCE, 0xFA, 0xFE, 0xCA, ...
Если же PACK_EN очищен, то через DMA пройдут те же данные 0xFACE, 0xCAFE, ..., и сконфигурированный на 8-битную ширину слова PPI выведет только младшие байты слов 0xCE, 0xFE, ...
FLD_SEL. Бит FLD_SEL используется главным образом в активном поле только режима ITU-R 656. Этот бит определяет, будет ли передаваться только поле Field 1 в каждом кадре видео, или же оба поля Field 1 и Field 2. Таким образом, это позволяет экономить полосу DMA, передавая только каждый чередующийся фрейм активного видео.
PORT_CFG[1:0]. Поле PORT_CFG[1:0] используется для конфигурирования рабочего режима PPI. Оно работает совместно с битом PORT_DIR, который устанавливает направление данных порта.
XFR_TYPE[1:0]. Это поле также используется для конфигурирования рабочего режима, что обсуждается далее. Оно работает совместно с другими битами PPI_CONTROL для определения рабочего режима. См. таблицу 11-2, где показаны возможные рабочие режимы PPI.
Таблица 11-2. Рабочие режимы PPI.
Режим PPI
# sync
PORT_DIR
PORT_CFG
XFR_TYPE
POLC
POLS
FLD_SEL
RX, 0 frame sync, external trigger
0
0
11
11
0 или 1
0 или 1
0
RX, 0 frame sync, internal trigger
1
RX, 1 external frame sync
1
00
X
RX, 2 или 3 external frame sync
3
10
RX, 2 или 3 internal frame sync
01
RX, ITU-R 656, Active Field Only
embedded
XX
00
0
0 или 1
RX, ITU-R 656, Vertical Blanking Only
10
X
RX, ITU-R 656, Entire Field
01
TX, 0 frame sync
0
1
00, 01, 10
0 или 1
TX, 1 internal или external frame sync
1
00
11
TX, 2 external frame sync
2
01
TX, 2 или 3 internal frame sync, FS3 синхронизирован по установке FS1
3
01
TX, 2 или 3 internal frame sync, FS3 синхронизирован по установке FS2
11
PORT_EN. Когда этот бит установлен, разрешена работа порта PPI.
Обратите внимание, что когда PPI сконфигурирован на ввод, то PPI не запускает перемещение данных после того, как разрешен битом PORT_EN, пока не будут получены соответствующие сигналы синхронизации. Если PPI сконфигурирован на вывод, то перемещение данных (включая соответствующие сигналы синхронизации) начнется как только будут разрешены синхроимпульсы кадра (frame syncs, в единицах таймера), так что все синхроимпульсы кадра должны быть сконфигурированы до того, как произойдет разрешение PPI и синхроимпульсов кадра. Для дополнительной информации см. ниже врезку "Синхронизация фрейма в GP-режимах".
Регистр состояния, PPI status register (PPI_STATUS) содержит биты, которые предоставляют информацию от текущем рабочем состоянии PPI.
При чтении очищается весь регистр (это так называемые "sticky" биты), так что слово статуса должно быть проанализировано для того, чтобы установить, какие биты были установлены.
Рис. 11-2. PPI Status Register (PPI_STATUS).
ERR_DET (sticky). Этот бит обозначает, была или нет определена ошибка в преамбуле слова управления ITU-R 656. Он достоверен только в режимах ITU-R 656. Если ERR_DET = 1, то в преамбуле была обнаружена ошибка, если ERR_DET = 0, то в преамбуле ошибки не было обнаружено.
ERR_NCOR (sticky). Этот бит также относится только к режимам ITU-R 656. Если ERR_NCOR = 0 и ERR_DET = 1, то все ошибки, которые обнаружены в преамбуле, были скорректированы. Если ERR_NCOR = 1, то была обнаружена ошибка в преамбуле, но она не была скорректирована. Эта ситуация генерирует прерывание ошибки PPI, если это прерывание разрешено битами регистра SIC_IMASKx.
FT_ERR (sticky). Когда этот бит установлен, то произошла ошибка трекинга кадра (frame track error). Этот бит достоверен только в RX-режимах. В этой ситуации запрограммированное количество строк в кадре регистра PPI_FRAME не соответствует состоянию начала кадра (frame start detect, см. ниже информацию в примечаниях врезки с описанием регистра PPI_FRAME). Ошибка трекинга фрейма генерирует прерывание ошибки PPI, если это прерывание разрешено битами регистра SIC_IMASKx.
FLD. Этот бит устанавливается или очищается в момент изменения состояния F (в режимах ITU-R 656) или PPI_FS3 (в других RX-режимах). Бит достоверен только для режимов ввода (RX). Состояние FLD отражает текущий логический уровень сигналов F или PPI_FS3. Другими словами, бит FLD всегда отражает текущее поле видео, обрабатываемое PPI.
OVR (sticky). Когда этот бит установлен, то PPI FIFO переполнен и не может больше принять данные. Ошибка переполнения FIFO генерирует прерывание ошибки PPI, если это прерывание разрешено битами регистра SIC_IMASKx.
PPI FIFO имеет разрядность 16 бит и глубину 16 элементов.
UNDR (sticky). Когда UNDR установлен, то в PPI FIFO произошла ошибка недогрузки данных (underrun, нехватка данных для вывода). Ошибка недогрузки FIFO генерирует прерывание ошибки PPI, если это прерывание разрешено битами регистра SIC_IMASKx.
Регистр счетчика задержки, PPI delay count register (PPI_DELAY) может использоваться во всех конфигурациях, кроме режимов ITU-R 656 и GP с нулевым количеством синхроимпульсов кадра (0 frame syncs). Регистр содержит количество тактов PPI_CLK для задержки после установки PPI_FS1 перед тем, как начать читать вводимые данные или записывать выводимые данные.
Рис. 11-3. Delay Count Register (PPI_DELAY).
Имейте в виду, что в TX режимах, использующих как минимум один синхроимпульс кадра (frame sync), имеется один цикл задержки, указанный содержимым регистра PPI_DELAY.
Счетчик перемещений данных, PPI transfer count register (PPI_COUNT), используется только в тех случаях, где применены повторяющиеся аппаратные синхроимпульсы кадра (frame syncs, генерируемые внутри или подаваемые снаружи). Это не требуется в режимах ITU-R 656 или режимах с нулевым количеством синхроимпульсов кадра (0 frame syncs). Для режимов RX этот регистр хранит количество выборок которые читаются в PPI на одну строку минус 1. Для режимов TX регистр хранит количество выводимых через PPI выборок на строку минус 1. В действительности сам по себе регистр не декрементируется с каждой транзакцией. Таким образом, в начале новой строки данных нет необходимости перезаписывать значение этого регистра. Например, для приема или передачи 100 выборок через PPI установите PPI_COUNT в значение 99.
Позаботьтесь о том, чтобы гарантировать, что количество выборок, запрограммированное в PPI_COUNT, было согласовано с количеством выборок, ожидаемом на "горизонтальном" интервале, заданном PPI_FS1.
Регистр количества строк в кадре lines per frame (PPI_FRAME) используется во всех режимах TX и RX с внешними сигналами синхронизации кадра (frame syncs). Для режимов ITU-R 656 этот регистр хранит количество строк, ожидаемых на каждый кадр (frame) данных, где кадр определяется как комбинация Field 1 и Field 2, обозначаемых индикатором F в потоке ITU-R. Здесь строка определена как полный цикл ITU-R 656 SAV-EAV.
Рис. 11-5. Lines Per Frame Register (PPI_FRAME).
Для не-ITU-R 656 режимов с внешними frame sync, кадр (frame) определен как данные, ограниченные между установками PPI_FS2, независимо от состояния PPI_FS3. Строка определена как полный цикл PPI_FS1. В этих режимах PPI_FS3 используется только для определения оригинального начала фрейма (frame start) каждый раз, когда разрешен PPI. Он игнорируется на каждом последующем поле и фрейме, и его состояние (лог. 1 или лог. 0) не важно, за исключением начала оригинального фрейма.
Если начало нового фрейма (или поля для режима ITU-R 656) было детектировано до того, как было передано указанное в PPI_FRAME количество строк, то произойдет ошибка трекинга кадра (frame track error), и установится бит FT_ERR в регистре PPI_STATUS. Однако PPI все еще автоматически переинициализируется для подсчета значения, запрограммированного в PPI_FRAME, и перемещение данных продолжится.
В режимах ITU-R 656 определение начала кадра (frame start) происходит на спаде F, индикатора поля. Это происходит в начале поля Field 1.
В режиме RX с тремя внешними frame sync определение начала фрейма (frame start) соответствует состоянию, где за установкой PPI_FS2 следует установка PPI_FS1, когда PPI_FS3 в лог. 0. Это происходит в начале поля Field 1.
Обратите внимание, что PPI_FS3 должен быть в лог. 0 только когда устанавливается PPI_FS1, но не когда устанавливается PPI_FS2. Также PPI_FS3 используется только для синхронизации начала каждого первого фрейма после того, как разрешен PPI. Впоследствии это игнорируется.
Когда используется режим RX с тремя внешними frame sync, и нужно только 2 синхроимпульса, сконфигурируйте PPI для работы с тремя frame sync, и подключите внешний подтягивающий к лог. 0 резистор (pull-down GND) для вывода PPI_FS3.
[Режимы ITU-R 656]
PPI поддерживает 3 режима ввода для данных фреймов (кадров) ITU-R 656, которые описываются в этой секции. Хотя PPI не поддерживает явно режим вывода ITU-R 656, здесь также предоставлены рекомендации для использования PPI при выводе фреймов ITU-R 656.
Что такое ITU-R 656. В соответствии с рекомендациями ITU-R 656 (ранее известными как CCIR-656), поток цифрового видео должен иметь характеристики, показанные на рис. 11-6 и рис. 11-7 для систем 525/60 (NTSC) и 625/50 (PAL). Процессор поддерживает только параллельный режим бит ITU-R 656. Поддерживаются 8-ми и 10-ти битные элементы видео.
В этом режиме сигналы строк (horizontal, H), кадров (vertical, V) и полей (field, F) передаются как встроенная часть потока видеоданных в последовательности байт, формирующих слово управления (control word). Сигналы начала активного видео (start active video, SAV) и его окончания (end active video, EAV) показывают начало и окончание элементов данных для чтения в каждой строке. SAV происходит при переходе 1 -> 0 сигнала H, и EAV начинается при переходе 0 -> 1 сигнала H. Все поле видео состоит из активного видео + горизонтальное гашение (интервал между кодом EAV и SAV) и вертикальное гашение (интервал, где V = 1). Поле видео начинается на изменении бита F. Нечетное поле обозначается значением F = 0, в то время как четное поле обозначается F = 1. Видео с прогрессивной разверткой (progressive video) не разделяет поля Field 1 и Field 2, в то время как видео с через-строчной разверткой (interlaced video) требует уникальной обработки каждого поля, потому что комбинация двух полей создает реальный кадр видео.
Рис. 11-6. ITU-R 656 8-Bit Parallel Data Stream для систем NTSC/PAL.
Рис. 11-7. Типовое разделение кадра видео (Video Frame Partitioning) систем NTSC/PAL для ITU-R BT.656-4.
Коды SAV и EAV более подробно показаны в таблице 11-3. Обратите внимание, что здесь определена преамбула из трех байт (0xFF, 0x00, 0x00), за которой идет слово регистра XY, которое кроме бит F (field), V (vertical blanking) и H (horizontal blanking) содержит также 4 бита защиты для детектирования и коррекции ошибок в одном бите. Также F и V могут быть изменены как часть последовательностей EAV (т. е. переход от H = 0 к H = 1). Определения бит следующие:
• F = 0 для Field 1 • F = 1 для Field 2 • V = 1 во время вертикального гашения • V = 0 когда нет вертикального гашения • H = 0 на SAV • H = 1 на EAV • P3 = V XOR H • P2 = F XOR H • P1 = F XOR V • P0 = F XOR V XOR H
Таблица 11-3. Последовательности управляющего байта для 8-битного и 10-битного ITU-R 656 Video.
8-битные данные
10-битные данные
D9 (MSB)
D8
D7
D6
D5
D4
D3
D2
D1
D0
Преамбула
1
1
1
1
1
1
1
1
1
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
Байт управления
1
F
V
H
P3
P2
P1
P0
0
0
Во многих приложениях могут быть применены video-потоки, отличающиеся от форматов NTSC/PAL (например, CIF, QCIF). По этой причине интерфейс процессор достаточно гибок, чтобы обеспечивать разные длины строки и поля. В общем случае, пока входящее видео снабжено правильными кодами EAV/SAV, интерфейс PPI может прочитать его. Другими словами, образ CIF должен быть отформатирован "656-compliant", где значения EAV и SAV определяют диапазон картинки для каждой строки, и коды V и F могут использоваться для разделения кадров (frame) и полей (field).
Рис. 11-8 в общем виде показывает перемещение данных в режимах ввода ITU-R 656. На этом рисунке такты CLK либо предоставляются источником видео, либо подаются системой снаружи.
Рис. 11-8. Режимы ввода ITU-R 656.
Есть 3 под-режима, поддерживаемые для ввода ITU-R 656: entire field, active video only и vertical blanking interval only. На рис. 11-9 показаны эти три подрежима.
Рис. 11-9. ITU-R 656 Input Sub-Modes.
Entire Field. В этом режиме весь входящий поток бит читается через PPI. Этот поток включает как активное видео, так и последовательности управляющего байта и вспомогательные данные, которые могут быть встроены в интервалы горизонтального или вертикального гашения. Перемещение данных стартует сразу после того, как произойдет синхронизация для Field 1, но не включает первый код EAV, который содержит присвоение F = 0.
Обратите внимание, что первая строка, переданная в после разрешения PPI, пропустит свою первую 4-байтовую преамбулу. Однако последующие строки и кадры должны иметь все неповрежденные управляющие коды.
Одно из достоинств этого режима - он позволяет использовать функцию "loopback", с которой один или два кадра данным могут быть прочитаны через PPI и впоследствии выведены на совместимое устройство отображения видео. Конечно, это требует мультиплексирования выводов PPI, однако это предоставляет удобный способ проверить, что данные ITU-R 656 могут быть прочитаны в PPI или записаны из PPI.
Active Video Only. Этот режим используется только когда интересует только активные данные поля видео, а не любые интервалы гашения. PPI игнорирует (не читает в себя) все данные между EAV и SAV, как и все данные, которые представлены при V = 1. В этом режиме в память не сохраняется последовательность управляющего байта, она отфильтровывается интерфейсом PPI. После синхронизации по началу Field 1, интерфейс PPI игнорирует приходящие выборки, пока не увидит SAV.
В этом режиме пользователь задает в регистре PPI_FRAME общее количество строк в кадре (активных строк плюс количество строк во время интервала вертикального гашения).
Vertical Blanking Interval (VBI) Only. В этом режиме перемещение данных активно только когда V = 1 в последовательности байта управления. Это показывает, что источник видео находится среди интервала вертикального гашения (vertical blanking interval, VBI), который иногда используется для передачи вспомогательных данных (например телетекста). Рекомендация ITU-R 656 определяет формат этих вспомогательных пакетов данных, однако PPI не оборудован декодером содержимого этих данных, эта задача должна быть выполнена программно. Данные горизонтального гашения сохраняются, когда они совпадают со строками в интервале VBI. Также всегда записывается последовательность управляющего байта. В регистре PPI_FRAME пользователь задает общее количество строк на кадр (активных строк плюс строк во время вертикального гашения).
Обратите внимание, что VBI поделен на два региона в каждом поле. С точки зрения PPI он считает эти два отдельные региона как одно непрерывное пространство. Однако имейте в виду, что синхронизация фрейма происходит в начале Field 1, которое не обязательно соответствует началу вертикального гашения. Например, в системах 525/60 начало Field 1 (F = 0) соответствует строке 4 VBI.
PPI не предоставляет явный функционал кадров вывода потока ITU-R 656 с надлежащими преамбулами и интервалами гашения. Однако в TX-режиме с нулевым количеством синхроимпульсов кадра (0 frame syncs), это можно обработать вручную. По существу этот режим предоставляет вывод потока данных из памяти через PPI. Данные и коды управления должны быть предварительно подготовлены в памяти, чтобы они были выведены как стандартный видеопоток. С использованием системы 2D DMA это может быть реализовано несколькими способами. Например, одна строка гашения (H + V) должна быть сохранена в буфере и отправлена N раз контроллером DMA, когда это необходимо, перед тем как отправить через DMA активное видео. Альтернативно в статическом буфере памяти могут быть подготовлены данные всего поля целиком (вместе с кодами управления и гашения), в то время как система DMA кадр за кадром перемещает в буфер только область активного видео.
Синхронизация в режимах ITU-R 656 всегда происходит по спаду F, индикатора поля. Это соответствует моменту начала Field 1. Следовательно, может быть игнорировано до двух полей (например, если Field 1 только что началось перед установкой канала между PPI и камерой) перед тем, как данные будут приняты в PPI.
Поскольку в режимах ITU-R 656 вся сигнализация H и V встроена в поток данных, регистр PPI_COUNT не нужен. Однако регистр PPI_FRAME используется для проверки на ошибки синхронизации. Пользователь программирует этот регистр количеством строк, ожидаемых на каждом кадре видео, и PPI отслеживает количество переходов EAV -> SAV, которые произошли от начала кадра до момента, когда будет определен конец кадра (переход от F = 1 к F = 0). В этот момент реальное количество обработанных строк сравнивается с значением регистра PPI_FRAME. Если они не соответствуют, то установится бит FT_ERR в регистре PPI_STATUS. Например, если пропущено изменение SAV, то текущее поле будет иметь NUM_ROWS – 1 строк, однако ресинхронизация заново произойдет в начале следующего кадра.
По завершении приема всего поля в регистре PPI_STATUS переключится бит поля F. По этому биту обработчик прерывания (interrupt service routine, ISR) может отличить, какое поле было только что прочитано.
[GP-режимы PPI]
Режимы общего назначения (general-purpose, GP) PPI предназначены для самого широкого спектра приложений захвата и передачи данных. В таблице 11-4 суммарно показаны эти режимы. Если для какого-то режима показано, что определенный PPI_FSx frame sync не используется, то подразумевается, что этот вывод доступен для своей альтернативной, мультиплексированной процессором функции (т. е. как вывод таймера или как вывод флага, т. е. как ножка порта GPIO). Исключение их этого правила - когда PPI сконфигурирован в режиме двух синхросигналов кадра (2-frame-sync mode), PPI_FS3 не может использоваться как ножка флага GPIO, даже когда она реально не используется PPI.
Таблица 11-4. Режимы PPI общего назначения.
Режим PPI
Направление PPI_FS1
Направление PPI_FS2
Направление PPI_FS1
Направление данных
RX, 0 frame sync, external trigger
Вход
Не используется
Вход
RX, 0 frame sync, internal trigger
Не используется
RX, 1 external frame sync
Вход
Не используется
RX, 2 или 3 external frame sync
Вход
RX, 2 или 3 internal frame sync
Выход
TX, 0 frame sync
Не используется
Выход
TX, 1 external frame sync
Вход
Не используется
TX, 2 external frame sync
Вход
Выход
TX, 1 internal frame sync
Выход
Не используется
TX, 2 или 3 internal frame sync
Выход
Рис. 11-10 иллюстрирует общий поток данных GP-режимов. Верхняя часть диаграммы показывает пример RX-режима с 1 внешним синхроимпульсом кадра (external frame sync). После того, как PPI примет аппаратный импульс frame sync (PPI_FS1), он осуществляет задержку PPI_CLK тактов, запрограммированную в регистр PPI_DELAY. Затем контроллер DMA передает количество выборок, заданное регистром PPI_COUNT. После этого принимается каждая выборка, но перед тем, как поступит следующий PPI_FS1, поступающие данные игнорируются и не передаются по шине DMA.
Если следующий PPI_FS1 frame sync поступит перед указанным количеством введенных выборок PPI_COUNT, счетчик выборок заново инициализируется в 0, и снова начитает считать вверх до PPI_COUNT. Эта ситуация может привести к потере синхронизации сконфигурированного канала DMA в процессе перемещения данных PPI.
Рис. 11-10. Поток данных для GP-режимов (подразумевается положительная полярность PPI_FS1).
На нижней части рисунка 11-10 показан пример режима TX, где генерируется один внутренний frame sync. После того, как установится PPI_FS1, есть задержка в 1 такт PPI_CLK, и затем вставляется задержка PPI_CLK тактов, количество которых программируется в регистре PPI_DELAY. Далее контроллер DMA выводит количество выборок, заданное в регистре PPI_COUNT. Дальнейшие перемещения данных DMA не происходят, пока не произойдет следующий синхроимпульс PPI_FS1 и не пройдет запрограммированная задержка.
Если следующий синхроимпульс PPI_FS1 поступит перед тем, как будет выведено заданное PPI_COUNT количество выборок, то синхроимпульс имеет приоритет, и запустит последовательность передачи новой строки. Эта ситуация может привести к тому, что конфигурация канала DMA потеряет синхронизацию с процессом передачи PPI.
PPI поддерживает несколько режимов ввода данных. Эти режимы отличаются в основном способом деления данных на фреймы. Обратитесь к таблице 11-2 для получения информации, как конфигурировать PPI для каждого режима.
No Frame Syncs. Эти режимы покрывают набор приложений, где периодические синхроимпульсы фрейма (frame sync) не генерируются для фрейма приходящих данных. Есть две опции начала перемещения данных, обе конфигурируются регистром PPI_CONTROL.
• External trigger: внешний источник посылает один frame sync (на вывод PPI_FS1) в начале транзакции, когда FLD_SEL=0 и PORT_CFG=b#11. • Internal trigger: программа начинает процесс установкой PORT_EN=1, когда FLD_SEL=1 и PORT_CFG=b#11.
Все последующие манипуляции над данными осуществляются по управлением DMA. Например, может быть настроено чередование между буферами в памяти по 1 килобайту. Когда один буфер заполняется, DMA продолжит заполнять второй буфер, в то время как другая операция DMA очищает первый буфер памяти для повторного использования.
Из-за синхронизации домена тактов режимов RX без frame sync может быть задержка как минимум 2 такта PPI_CLK, когда этот режим разрешен, и когда приняты достоверные данные. Таким образом, детектирование начала достоверных данных должно осуществляться программно.
1, 2 или 3 External Frame Sync. Режим 1-sync предназначен для приложений аналого-цифрового преобразования (analog-to-digital converter, ADC). Верхняя часть рисунка 11-11 показывает типичную систему для этого режима.
Режим 3-sync, показанный в нижней части рис. 11-11, поддерживает приложения видео, которые используют аппаратную сигнализацию (HSYNC, VSYNC, FIELD) в соответствии с рекомендацией ITU-R 601. Назначение сигналов синхронизации (frame syncs) в этом режиме следующее: PPI_FS1 = HSYNC, PPI_FS2 = VSYNC, PPI_FS3 = FIELD. Подробную информацию по синхронизации в этом режиме см. во врезке "Синхронизация фрейма в GP-режимах".
Неявно поддерживается режим 2-sync, путем подтяжки PPI_FS3 к GND внешним резистором, когда сконфигурирован режим 3-sync.
2 или 3 Internal Frame Sync. Этот режим может быть полезен для подключения к источникам видео, которые могут управляться как подчиненное устройство от master-процессора. Другими словами, процессор контролирует, когда читать данные из источника видео, путем установки сигналов PPI_FS1 и PPI_FS2, и затем читать данные в PPI. PPI_FS3 frame sync предоставляет индикацию, какое поле передается в настоящий момент, однако поскольку PPI_FS3 это выход, то его можно просто оставить не подключенным, если он не используется. На рис. 11-12 показан пример использования в таком режиме.
Рис. 11-12. RX-режим, внутренние импульсы синхронизации.
PPI поддерживает несколько режимов вывода данных. Эти режимы отличаются в основном способом деления данных на фреймы. Обратитесь к таблице 11-2 для получения информации, как конфигурировать PPI для каждого режима.
No Frame Sync. В этом режиме блоки данных, указанные контроллером DMA, выводятся через PPI без деления на кадры (no framing). Таким образом, как только канал DMA сконфигурирован и разрешен, и PPI сконфигурирован и разрешен, немедленно начинаются передачи данных, синхронизированные с PPI_CLK. См. рис. 11-13, иллюстрирующий этот режим.
В этом режиме есть задержка до 16 тактов SCLK (для данных шире 8 бит) или 32 такта SCLK (для 8-битных данных) между разрешением PPI и передачей достоверных данных. Кроме того, DMA должен быть сконфигурирован для передачи как минимум 16 выборок (для данных шире 8 бит) или 32 выборок (для 8-битных данных).
Рис. 11-13. TX-режим, без импульсов синхронизации кадра (0 Frame Sync).
1 или 2 External Frame Sync. В этих режимах внешний приемник может кадрировать данные, отправляемые PPI. Поддерживаются оба режима, 1-sync и 2-sync. Верхняя часть рис. 11-14 показывает случай режима 1-sync, нижняя режима 2-sync.
Существует обязательная задержка 1.5 такта PPI_CLK плюс значение, запрограммированное в PPI_DELAY, между установкой внешнего сигнала frame sync (или двух сигналов frame sync) и передачей достоверных данных через PPI.
Рис. 11-14. TX-режим, 1 или 2 внешних импульсов синхронизации кадра (External Frame Sync).
1, 2 или 3 Internal Frame Syncs. Режим 1-sync предназначен для подключения цифро-аналоговых преобразователей (digital-to-analog converter, DAC), на которые подается 1 синхроимпульс. Верхняя часть рис. 11-15 показывает пример такого типа подключения.
Рис. 11-15. PPI GP Output.
Режим 3-sync полезен для подключения а дисплеям видео и графики, что показано на нижней части рис. 11-15. Неявно поддерживается режим 2-sync, когда выход PPI_FS3 остается никуда не подключенным.
Синхронизация фрейма (кадра) в режимах GP работает различается между режимами внутренних синхроимпульсов (internal frame syncs) и режимами внешних синхроимпульсов (external frame syncs).
Режимы с внутренними синхроимпульсами. В режимах с внутренними синхроимпульсами PPI_FS1 и PPI_FS2 напрямую соединяются со схемами ШИМ (pulse-width modulation, PWM) на таймере 1 (TIMER1) и таймере 2 (TIMER2) соответственно. Можно произвольно программировать длительности импульсов и периоды этих сигналов с помощью существующих регистров TIMERx, что удовлетворят широкий диапазон требований к формированию интервалов времени импульсов синхронизации. Обратите внимание, что эти схемы PWM тактируются от PPI_CLK, не от SCLK или PF1 (как это происходит при стандартной работе PWM таймера). Если PPI_FS2 не используется в сконфигурированном режиме PPI, то таймер 2 работает так же, как это обычно было бы, без ограничения функционала. Состояние PPI_FS3 полностью зависит от состояния PPI_FS1 и/или PPI_FS2, так что PPI_FS3 не имеет какой-либо возможности программирования.
Чтобы запрограммировать PPI_FS1 и/или PPI_FS2 для работы в internal frame sync mode:
1. Сконфигурируйте и разрешите DMA для PPI. См. далее раздел "Работа DMA". 2. Сконфигурируйте ширину и период для каждого сигнала frame sync программированием TIMER1_WIDTH и TIMER1_PERIOD (для PPI_FS1) или TIMER2_WIDTH и TIMER2_PERIOD (для PPI_FS2). 3. Настройте TIMER1_CONFIG для режима PWM_OUT (для PPI_FS1). Если используется второй синхроимпульс, то сконфигурируйте TIMER2_CONFIG для режима PWM_OUT (для PPI_FS2). Эти операции включают установку CLK_SEL=1 и TIN_SEL=1 для каждого таймера. 4. Запишите PPI_CONTROL для конфигурирования и разрешения PPI. 5. Запишите TIMER_ENABLE, чтобы разрешить таймер 1 и/или таймер 2.
Важно обеспечить правильную полярность frame sync между периферийными устройствами PPI и Timer. Для этого убедитесь, что если PPI_CONTROL[15:14] = b#10 или b#11, то PULSE_HI очищается в TIMER1_CONFIG и TIMER2_CONFIG. Подобным образом, если PPI_CONTROL[15:14] = b#00 или b#01, то бит PULSE_HI должен быть установлен в TIMER1_CONFIG и TIMER2_CONFIG.
Чтобы переключиться в другой режим PPI, который не использует internal frame syncs:
1. Запретите PPI (с помощью PPI_CONTROL). 2. Запретите таймеры (с помощью TIMER_DISABLE).
Режимы с внешними синхроимпульсами. В RX-режимах с внешними frame sync выводы PPI_FS1 и PPI_FS2 становятся входами, чувствительными к перепаду. В таком режиме таймеры 1 и 2 могут использоваться по назначению, не подразумевающему вовлечение в работу выводов TMR1 и TMR2. Однако доступ таймера к выводу TMRx запрещается, когда PPI использует этот вывод для функции ввода PPI_FSx frame sync. Для режимов, которые не требуют PPI_FS2, таймер 2 не ограничен в своей функциональности, и может работать как если бы PPI не использовался (т. е. вывод TMR2 становится полностью доступным для использованием таймером 2). Для дополнительной информации по конфигурированию и использованию таймеров обратитесь к Главе 16 "Timers" даташита [1], или см. статью [2].
В RX-режиме с тремя внешними frame sync детектирование начала фрейма происходит, когда за установкой PPI_FS2 следует установка PPI_FS1, и на PPI_FS3 присутствует лог. 0. Это происходит в начале Field 1.
Имейте в виду, что PPI_FS3 должен быть в лог. 0 только когда устанавливается PPI_FS1, а не когда устанавливается PPI_FS2. Также PPI_FS3 используется только для синхронизации по началу самого первого фрейма после того, как PPI разрешен. Впоследствии он игнорируется.
В TX-режимах с внешними frame sync выводы PPI_FS1 и PPI_FS2 обрабатываются как входы, чувствительные к перепаду. В этом режиме нет необходимости конфигурировать таймер (таймеры), связанные с одним или двумя синхроимпульсами кадра (frame sync) как вход (или входы), или разрешать их через регистр TIMER_ENABLE. Дополнительно сами по себе таймеры доступны для использования, даже когда вывод (выводы) таймера приняты PPI. В этом случае нет требований к временной базе (конфигурируемой TIN_SEL в TIMERx_CONFIG) PPI_CLK.
Однако если используется таймер, вывод которого подключен к внешнему frame sync, то убедитесь, что этот вывод запрещен битом OUT_DIS в регистре TIMERx_CONFIG. Тогда таймер сам по себе может быть сконфигурирован и разрешен для использования, не связанного с PPI, без влияния на работу PPI в этом режиме. Для дополнительной информации обратитесь к Главе 16 "Timers" даташита [1], или см. статью [2].
[Работа DMA]
PPI должен использоваться вместе с системой DMA процессора. В этом разделе рассматривается, как взаимодействуют PPI и DMA. Для дополнительной информации по DMA, включая описание регистров DMA и операций DMA, обратитесь к Главе 9 "Direct Memory Access" даташита [1], или см. статью [3].
Канал PPI DMA может быть сконфигурирован либо для передачи, либо для приема, и с максимальной пропускной способностью (PPI_CLK) x (16 бит/транзакция). В режимах, где длины данных больше 8 бит, только один элемент данных может тактироваться на такт PPI_CLK, что приводит к снижению полосы пропускания (поскольку упаковка невозможно). Самая большая полоса пропускания получается с 8-битными данными и установкой PACK_EN=1 (разрешен режим упаковки данных). Обратите внимание, что 16-битный режим упаковки должен обрабатывать четное количество элементов данных.
Конфигурирование канала PPI DMA - необходимый шаг при использовании интерфейса PPI. Система DMA генерирует прерывания по завершению перемещения строки, фрейма или части фрейма. Также система DMA координирует источник или место назначения данных, которые перемещаются с помощью PPI.
Функция 2D DMA процессора позволяет ему получить прерывание по окончании переданной строки или фрейма видео. Также прерывание может произойти, если случится ошибка DMA. Фактически настройка регистров MMR DMAx_XCOUNT и DMAx_YCOUNT позволяет гибко управлять моментами возникновения прерываний. Для примера предположим, что регистры DMA XMODIFY = YMODIFY = 1. Тогда если фрейм данных состоит из 320 x 240 байт (240 строк по 320 байт в каждой строке), то могут быть достигнуты следующие условия:
• Установка XCOUNT = 320, YCOUNT = 240 и DI_SEL = 1 (бит DI_SEL находится в регистре DMAx_CONFIG) приведет к прерыванию после передачи каждой строки на всем фрейме. • Установка XCOUNT = 320, YCOUNT = 240 и DI_SEL = 0 приведет к прерыванию только по завершению передачи фрейма (когда будут переданы 240 строк по 320 байт). • Установка XCOUNT = 38400 (320 x 120), YCOUNT = 2 и DI_SEL = 1 приведет к прерыванию, когда будет передана половина фрейма, и к повторному прерыванию, когда будет передан весь фрейм (2 прерывания на 1 фрейм).
Выполните следующую основную процедуру для настройки работы DMA вместе с PPI. Подробности по конфигурированию DMA см. в разделе "DMA и регистры MMR DMA" статьи [3].
1. Сконфигурируйте регистры DMA, как это необходимо для желаемого режима работы DMA. 2. Разрешите работу канала DMA. 3. Сконфигурируйте соответствующие регистры PPI. 4. Разрешите PPI установкой бита PORT_EN в регистре PPI_CONTROL.
[Сценарии перемещения данных]
Рис. 11-16 показывает два возможных способа использования PPI для передачи видео. Эти диаграммы весьма общие, и вычисления полосы пропускания должны быть сделаны только после определения полного режима PPI и настроек (например, передача только Field 1, передаче нечетных и четных элементов).
Рис. 11-16. Возможные сценарии транзакций данных PPI.
Верхняя часть рис. 11-16 показывает ситуацию, которая подходит, к примеру, для компрессии JPEG. Первые N строк видео с помощью DMA поступают в память L1 через PPI. Над данными в памяти L1 работает алгоритм сжатия, и результаты сжатия выводятся из процессора через SPORT. Обратите внимание, что для этого способа обработки не требуется доступ к SDRAM.
Нижняя часть диаграммы учитывает более сложный алгоритм компрессии, такой как MPEG-2 или MPEG-4. Здесь сырое видео передается сразу в SDRAM. Независимый канал memory DMA перемещает блоки данных между памятью SDRAM и L1 для промежуточных стадий обработки. В завершении сжатое видео выходит из процессора через SPORT.