|
|
  |
приоритеты DMA запросов lpc1768, Кто кого? |
|
|
|
Mar 7 2012, 18:36
|
Участник

Группа: Участник
Сообщений: 26
Регистрация: 18-07-11
Пользователь №: 66 290

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

Группа: Участник
Сообщений: 26
Регистрация: 18-07-11
Пользователь №: 66 290

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

Группа: Участник
Сообщений: 26
Регистрация: 18-07-11
Пользователь №: 66 290

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

Группа: Участник
Сообщений: 26
Регистрация: 18-07-11
Пользователь №: 66 290

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

Группа: Участник
Сообщений: 26
Регистрация: 18-07-11
Пользователь №: 66 290

|
Согласен с Вами, что запросы 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 будет вестись из памяти?
|
|
|
|
|
Mar 13 2012, 16:48
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Да вроде там всё понятно: если передача память->периферия, то поле SrcPeripheral игнорится (старт передачи происходит по инициативе периферии), если передача память<-периферия, то поле DstPeripheral игнорится (то же), передачи память->память очевидно можно стартовать только вручную выставив запрос старта через DMACSoftBReq/DMACSoftSReq (оба поля DstPeripheral и SrcPeripheral игнорятся), насчёт случая периферия->периферия - не знаю, да и сомневаюсь в его нужности. Думаю - если Вы выставите режим память->память, то не сможете такую передачу запустить от сигнала DMA-запроса периферии, а только вручную через DMACSoftBReq/DMACSoftSReq хотя утверждать не стану, ибо сам никогда не использовал память->память. Так что поле TransferType определяет какое из полей DstPeripheral или SrcPeripheral используется для определения источника DMA-запроса. (Возможно что в случае "периферия->периферия" используются оба - по одному чтение во внутренний буфер DMAC, по другому - запись в периферию из буфера. Никогда не использовал этот тип передачи). В алгоритме предложенном мной выше, режим будет память->периферия всегда, а источник запросов - ваш таймер в DstPeripheral, SrcPeripheral - игнор. Посмотрите мануал на LPC178x - там DMACCxConfig еще больше усложнился
|
|
|
|
|
Mar 14 2012, 17:32
|
Участник

Группа: Участник
Сообщений: 26
Регистрация: 18-07-11
Пользователь №: 66 290

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