Перейти к содержанию
    

приоритеты DMA запросов lpc1768

Привет всем! Ситуация следующая: 2 канала DMA lpc1768 сконфигурированы для предачи данных "память-память" и "память-перефирия" соответственно. Запрос на передачу генерит один и тот же таймер. Какой из каналов DMA начнет передачу первым? В мануале описана лишь ситуация, когда по одному каналу передача уже идет, а запрос поступает к другому каналу. Там же есть рекомендации использовать для передачи "память-память" каналы с более низким приоритетом, иначе другие каналы не запустятся.

 

С уважением.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Может, у кого есть идеи как сгенерировать сигнал на ноге , устанавливающийся в 1 за 1мкс до начала передачи по UART и в 0 при ее окончании? Длина пакета, скорость передачи известны, передача инициируется таймером, генерирующим dma-запрос. Прерывания и дополнительные таймеры не хотелось бы использовать, UART интерфейс rs-485 не поддерживает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У вас передача в UART идёт по событиям таймера или стартует по таймеру, а далее используются DMA-запросы от UART?

Вообще - есть в DMA (и данного проца тож) такая фича как linked list.

Если у вас все передачи в UART идут по событиям таймера, добавьте в конец и в начало передачи доп. пакеты пишущие в GPIO 0 и 1, и пакеты перепрограммирующие этот таймер.

Например: 1-й DMA пакет устанавливает GPIO==1 и программирует таймер на 1 мкс выдержку, потом идут пакеты передачи по UART, следующий DMA-пакет программирует таймер на выдержку, достаточную для завершения передачи по UART,последний пакет DMA - запись 0 в GPIO.

Я думаю - идея ясна.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо за ответ!

У меня таймер генерит запрос к дма, который вываливает данные из RAM в UART FIFO, из FIFO они уже передаются UARTом своим чередом.

Описанную Вами идею я в свое время пробовал реализовать в несколько упрощенном варианте (событие MR0 запускает пакет дма, переписывающий в GPIO единицу 100 раз (процесс занимает ~1мкс) далее запускается пакет, преписывающий данные в UART; по событию MR1 (конец пакета) запускается другой dma, сбрасывающий GPIO ), но не удачно. Либо молчит UART, либо не выставляется GPIO. Склонен полагать, проблема в том, что в LLI нельзя видоизменить конфигурационный регистр (DMAnConfig), в котором задается направление передачи. А мне надо сначала выдавать "память-память", потом "память-переферия".

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А где здесь "память-память"?

У вас несколько событий и несколько каналов DMA используется, к тому же закладывается на время выполнения GPIO и излишне грузит шину в первую мкс.

Мой метод проще и экономичнее.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я так понял, что "переферия"для DMA - это все, что может гененрировать запросы, остальное - "память", поправьте, если не так. Таким образом, когда я выставляю GPIO пакетом DMA - значит, пишу в память, когда отправляю данные в UART - пишу в переферию. Когда правлю управляющие регистры таймера - в память.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нет, не так. Запросы на DMA и адреса пересылок - две разные вещи. Никак не связанные.

Пересылки в периферию идут по другим шинам нежели пересылки в память, в этом и разница.

Если адрес назначения находится в адресном пространстве ввода-вывода (на одной из периферийных шин), то нужна пересылка в периферию, иначе - в память.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Согласен с Вами, что запросы DMA и пересылки - разные вещи, но их несвязанность на логическом уровне для меня не очевидна. Смущает следующая фраза из мануала (с.605), описывающая назначение бита, определяющего вроде как переферийный источник запроса: "Source peripheral. This value selects the DMA source request peripheral. This field is ignored if the source of the transfer is from memory...." Если бы не последнее предложение, то все прозрачно. Почему, согласно последнему предложению, контроллеру DMA становится все равно, откуда приходит запрос, если передача по DMA будет вестись из памяти?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да вроде там всё понятно: если передача память->периферия, то поле SrcPeripheral игнорится (старт передачи происходит по инициативе периферии), если передача память<-периферия, то поле DstPeripheral игнорится (то же), передачи память->память очевидно можно стартовать только вручную выставив запрос старта через DMACSoftBReq/DMACSoftSReq (оба поля DstPeripheral и SrcPeripheral игнорятся), насчёт случая периферия->периферия - не знаю, да и сомневаюсь в его нужности.

Думаю - если Вы выставите режим память->память, то не сможете такую передачу запустить от сигнала DMA-запроса периферии, а только вручную через DMACSoftBReq/DMACSoftSReq хотя утверждать не стану, ибо сам никогда не использовал память->память.

Так что поле TransferType определяет какое из полей DstPeripheral или SrcPeripheral используется для определения источника DMA-запроса.

(Возможно что в случае "периферия->периферия" используются оба - по одному чтение во внутренний буфер DMAC, по другому - запись в периферию из буфера. Никогда не использовал этот тип передачи).

В алгоритме предложенном мной выше, режим будет память->периферия всегда, а источник запросов - ваш таймер в DstPeripheral, SrcPeripheral - игнор.

 

Посмотрите мануал на LPC178x - там DMACCxConfig еще больше усложнился ;)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Все выглядит достаточно логично, однако представляется маловероятным, что передача память-память запускается только вручную. Да и проведенные сегодня эксперименты показали, что память-память и память-переферия запускаются от таймера и работают совершенно идентично. Никаких манипуляций с DMACSoftBReq/DMACSoftSReq не проводил, менял TransferType. Если сконфигурировать переферия-память, не работает выдача в FIFO UART, в GPIO выдает нормально. На днях реализую предложенный Вами алгоритм, идея которого весьма хороша, благодарю.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...