В памяти компьютера создаётся блок 64*8=512 байт - это блок дескрипторов.
Каждый дескриптор - это четыре байта: описание здесь:
http://src.ds-dev.ru/doc/core/block_pe_ext_fifo.htmБлок содержит 63 дескриптора и указатель на следующий блок. Что будет происходить после завершения обмена с текущим блоком определяют три бита в поле CMD. Может быть установлен один из них, либо все нули.
Если все нули - то канал DMA остановиться.
Если JUMP_NEST_DS=1, то произойдёт переход к следующему дескриптору в этом блоке.
Если JUMP_NEXT_BLOCK=1, то произойдёт переход к следующему блоку (при этом следующий дескритор содержит адрес следующего блока). Это бит может быть установлен у любого дескриптора. Т.е. не обязательно заполнять все 63 элемента, оставшиеся можно заполнить нулями.
Если JUMP_DS0=1, то произойдёт переход к нулевому дескриптору в текущем блоке. Это позволяет не читать блоки дескрипторов из памяти.
Обратите внимание - обмен всегда ведётся блоками кратными 4 кбайтам. А при выделении памяти в USER MEMORY - так и просто по 4 килобайта. Если выделено три блока памяти (допустим по 4096 байт), то нужно создать один блок дескрипторов размером 512 байт.
1. адрес блока 1, команда *JUMP_NEST_DS*, размер(4096), направление передачи
2. адрес блока 2, команда *JUMP_NEST_DS*, размер(4096), направление передачи
3. адрес блока 3, команда *EOT*, размер(4096), направление передачи
Остальные дескрипторы - нули. В конце надо записать сигнатуру и контрольную сумму.
Прерывание будет получено после завершения обмена с блоком 3. P.S. Направление передачи всегда одно и то же для одного сеанса работы.
По поводу расчёта CRC - постараюсь выделить кусок программы, но чуть позже.
По поводу записи в PE_EXT_FIFO и чтении FF. Интересное наблюдение. Я таких экспериментов не ставил, но вроде бы такого быть не должно. А для записи используются 32-х разрядные команды ?