Форум Микро-Чип
Поиск и заказ электронных компонентов
 

Вернуться   Форум Микро-Чип > Продукция MICROCHIP

Продукция MICROCHIP Технические вопросы по всей продукции Microchip

Ответ
 
Опции темы Опции просмотра
Старый 20.04.2016, 14:20   #1
DimaK
Member
 
Регистрация: 11.04.2016
Адрес: Пфорцхайм, Германия
Возраст: 35
Сообщений: 78
Вес репутации: 323/20
DimaK is a jewel in the roughDimaK is a jewel in the roughDimaK is a jewel in the roughDimaK is a jewel in the rough
По умолчанию Помогите разобраться с DMA на PIC32

Приветствую, уважаемые!
Уже третий день пытаюсь настроить два канала DMA в режиме Chain.
Написал тестовую прогу на основе даташитовского примера. Все задумывалось так: DMA0 настроенный как мастер срабатывает по фронту INT1 и переносит содержимое порта D (т.е. 2 байта) в i-тое место "буфера 1". DMA1, настроенный как ведомый канала 0, должен сразу же после каждого трансфера двух байт, переносить содержимое порта D в i-тое место "буфера 2".
Т.е. как только DMA0 перекидывает порт D в "буфер 1", DMA1 тут же перекидывает порт D в "буфер 2". И все это крутится в бесконечном цикле. Вот текст программщины:

IEC2CLR = 0x00000F00; // Запретить прерывания от DMA
IFS2CLR = 0x00000F00; // и стереть все флаги.
IEC2SET = 0x00000100; // Разрешить прерывания от DMA0 IEC2<8>

DMACON = 0x8000; // Включить модуль DMA
DCH0CON = 0x0003; // DMA0 выключен, приоритет 3
DCH1CON = 0x0062; // DMA1 выключен, приоритет 2, chaining on
// (Ch0 - Ведущий), CHADET = 1

DCH0ECON = 0x0810; // Событие для DMA0: INT1 (CHSIRQ = 8)
DCH0ECONbits.SIRQEN = 1; // Разрешить трансфер при наступлении заданного события
DCH1ECON = 72 << 8; // Событие для DMA1: прерывание от DMA0
DCH1ECONbits.SIRQEN = 1; // Разрешить трансфер при наступлении //заданного события

DCH0SSA = VirtToPhys(&PORTD); // Содержимое порта D копируется в i-ю
DCH0DSA = VirtToPhys(BUFF1); // ячейку BUFF1.
DCH0SSIZ = 2; // Отправной регистр (Port D) 2 Байта
DCH0DSIZ = 20; // Регистр назначения - 20 байт (10 ячеек по 16 бит)
DCH0CSIZ = 2; // Ячейка трансфера размером в 2 байта

DCH1SSA = VirtToPhys(&PORTD); // Содержимое порта D копируется в i-
DCH1DSA = VirtToPhys(BUFF2); // в i-ю ячейку BUFF2.
DCH1SSIZ = 2; // Отправной регистр (Port D) 2 Байта
DCH1DSIZ = 20; // Регистр назначения - 20 байт (10 ячеек по 16 бит)
DCH1CSIZ = 2; // Ячейка трансфера размером в 2 байта

DCH0INTCLR = 0x00FF00FF; // DMA0: все прерывания выключены, все флаги будут
DCH1INTCLR = 0x00FF00FF; // DMA1: все прерывания выключены, все флаги будут
DCH0INTbits.CHCCIE = 1; // разрешить прерывание DMA0: "Cell transfer complete"
DCH0INTbits.CHBCIE = 0; // запретить прерывание DMA0: "Block transfer complete"

IPC10CLR = 0x1F1F0000; // DMA0 und DMA1: стереть все преоритеты прерываний от DMA
IPC10SET = 0x001C0000; // DMA0 приоритет 7
IPC10SET = 0x00030000; // DMA0 субприоритет 3
IPC10SET = 0x18000000; // DMA1 приоритет 3
IPC10SET = 0x06000000; // DMA1 субприоритет 3

DCH0CONbits.CHEN = 1; // включить DMA Ch0

while(1) // бесконечный цикл
{

}


При этом, ведущий канал (т.е. DMA0) работает без нареканий, т.е. на каждый импульс, пришедший через INT1, перекидывает порт Д в буфер BUFF1. А вот ведомый ведет себя странно: только после заполнения буфера BUFF1 (всех 10 элементов), кидает одно еднственное значение в нулевую ячейку BUFF2 и затыкается навсегда. Не понимаю почему - как я понимаю, после каждого трансфера ведущий канал генерит прерывания, по которым и срабатывает ведомый....
Вообщем, заранее благодарен за подсказки!
DimaK вне форума   Ответить с цитированием
Старый 22.04.2016, 09:49   #2
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 33
Сообщений: 2,455
Вес репутации: 4677/100
besogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond repute
По умолчанию Re: Помогите разобраться с DMA на PIC32

DimaK
добрый день.
0x00000F00 и.т.д. - это все магия. мы не помним цифры. примем на веру, что Вы верно выставили. однако проверьте еще раз.

Как работает chaining.
Есть master. когда master заканчивает block tranfer, то начинает работать slave.
Мне кажется, что Вы перепутали block transfrer and cell transfer.
block - larger of DCHxSSIZ and DCHxDSIZ
cell - DCHxCSIZ
Посмотрите еще раз.
besogon вне форума   Ответить с цитированием
Старый 22.04.2016, 10:38   #3
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 33
Сообщений: 2,455
Вес репутации: 4677/100
besogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond repute
По умолчанию Re: Помогите разобраться с DMA на PIC32

При этом, ведущий канал (т.е. DMA0) работает без нареканий, т.е. на каждый импульс, пришедший через INT1, перекидывает порт Д в буфер BUFF1. А вот ведомый ведет себя странно: только после заполнения буфера BUFF1 (всех 10 элементов), кидает одно еднственное значение в нулевую ячейку BUFF2 и затыкается навсегда. - очень похоже, на документрированное поведение. по событию INT1 DMA0 выполняет block transfer. по завершению DMA0 block transfer DMA1 выполняет cell transfer.
besogon вне форума   Ответить с цитированием
Старый 22.04.2016, 10:53   #4
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 33
Сообщений: 2,455
Вес репутации: 4677/100
besogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond repute
По умолчанию Re: Помогите разобраться с DMA на PIC32

[off]
VirtToPhys и.т.д. - все это бредовые фокусы microchip.
не надо все это использовать.
есть стандартный sys/kmem.h
в нем все, что нужно для работы fixed mapping unit.
[/off]
besogon вне форума   Ответить с цитированием
Старый 22.04.2016, 12:19   #5
DimaK
Member
 
Регистрация: 11.04.2016
Адрес: Пфорцхайм, Германия
Возраст: 35
Сообщений: 78
Вес репутации: 323/20
DimaK is a jewel in the roughDimaK is a jewel in the roughDimaK is a jewel in the roughDimaK is a jewel in the rough
По умолчанию Re: Помогите разобраться с DMA на PIC32

"Мне кажется, что Вы перепутали block transfrer and cell transfer."
Так точно! Перепутал-с
Вроде разобрался: сделал канал 1 мастером, а 0 и 2 - слэйвами. Мастер считывает порт Д в промежуточный буфер, блок трансфер завершается и сразу после этого один канал кидает из промежуточного буфера в "буфер 1", а другой канал в "буфер 2"
DimaK вне форума   Ответить с цитированием
Старый 22.04.2016, 12:21   #6
DimaK
Member
 
Регистрация: 11.04.2016
Адрес: Пфорцхайм, Германия
Возраст: 35
Сообщений: 78
Вес репутации: 323/20
DimaK is a jewel in the roughDimaK is a jewel in the roughDimaK is a jewel in the roughDimaK is a jewel in the rough
По умолчанию Re: Помогите разобраться с DMA на PIC32

Цитата:
Сообщение от besogon Посмотреть сообщение
[off]
VirtToPhys и.т.д. - все это бредовые фокусы microchip.
не надо все это использовать.
есть стандартный sys/kmem.h
в нем все, что нужно для работы fixed mapping unit.
[/off]
Спасибо, сейчас посмотрю о чем речь....
DimaK вне форума   Ответить с цитированием
Старый 22.04.2016, 12:27   #7
DimaK
Member
 
Регистрация: 11.04.2016
Адрес: Пфорцхайм, Германия
Возраст: 35
Сообщений: 78
Вес репутации: 323/20
DimaK is a jewel in the roughDimaK is a jewel in the roughDimaK is a jewel in the roughDimaK is a jewel in the rough
По умолчанию Re: Помогите разобраться с DMA на PIC32

Цитата:
Сообщение от besogon Посмотреть сообщение
DimaK
добрый день.
0x00000F00 и.т.д. - это все магия. мы не помним цифры. примем на веру, что Вы верно выставили. однако проверьте еще раз.

Как работает chaining.
Есть master. когда master заканчивает block tranfer, то начинает работать slave.
Мне кажется, что Вы перепутали block transfrer and cell transfer.
block - larger of DCHxSSIZ and DCHxDSIZ
cell - DCHxCSIZ
Посмотрите еще раз.
Теперь вот другая проблема:
нужно как-то инициировать трансфер у слэйвов, после того как отработает мастер. CFORCE сбрасывается после каждого трансфера, что ни есть гут. Не хотелось бы привязывать к какому-то флагу прерываний, который будет навечно переведен в "1". Как я понял, нельзя принудительно оставить CFОRCE взведенным?
DimaK вне форума   Ответить с цитированием
Старый 22.04.2016, 13:04   #8
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 33
Сообщений: 2,455
Вес репутации: 4677/100
besogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond repute
По умолчанию Re: Помогите разобраться с DMA на PIC32

DimaK
ничего не понимаю.
CFORCE - принудительно начать передачу по DMA.
нужно как-то инициировать трансфер у слэйвов, после того как отработает мастер. - мб. Вы что-то не так поняли. Вам просто нужно правильно настроить chaining.

бы привязывать к какому-то флагу прерываний - это каша. это так не работает. у dma контроллера свои внутренние флаги которые идут напрямую с периферии. у контроллера прерываний - свои флаги которые с периферии. не по цепочке.

перечитайте еще раз pic32mx frm section 31: dma controller.
наверное это сразу избавит Вас от кучи вопросов о dma.
иначе Вас с ходу даже трудно понять, с какого рода затруднениями Вы столкнулись.

dma - ключевое свойство мк. азы работы с МК. его нужно один раз очень твердо выучить и все.
besogon вне форума   Ответить с цитированием
Старый 22.04.2016, 13:41   #9
DimaK
Member
 
Регистрация: 11.04.2016
Адрес: Пфорцхайм, Германия
Возраст: 35
Сообщений: 78
Вес репутации: 323/20
DimaK is a jewel in the roughDimaK is a jewel in the roughDimaK is a jewel in the roughDimaK is a jewel in the rough
По умолчанию Re: Помогите разобраться с DMA на PIC32

Так, секундочку: мастер включает слэйвы, но не инициирует передачу как таковую! Т.е. после того как мастер отработает, то оба слэйва у меня только включатся. А как иницировать трансфер - это уже другой вопрос.
А инициировать его можно двумя способами: запись единицы в CFORCE или совпадение вектора прерываний IRQ с тем что задан в регистре DCHxECON. Правильно?
Вот у меня и стоит задача как-то их включать без участия ЦПУ. То что напрашивается - CFORCE=1 - не получится потому, что после первого же трансфера сей бит слетит назад в ноль и последующие включения слэйва (т.е. по завершению передачи мастером) будут проигнорированы. Поэтому я и хотел привязать трансферы слэйвов к каким-нибудь флагам прерываний из CHSIRQ<7:0>. Т.е. чтобы было так:
Мастер отработал - включились слэйвы и тут же пошел трансфер, т.к. условие всегда висит в "1". Или я что-то генерально не втыкаю?
DimaK вне форума   Ответить с цитированием
Старый 22.04.2016, 14:10   #10
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 33
Сообщений: 2,455
Вес репутации: 4677/100
besogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond repute
По умолчанию Re: Помогите разобраться с DMA на PIC32

DimaK
Вы как-то так хотите?:
Выделить абстрактный большой буффер.
DMA0 on int1 start DMA transfer (block == cell == 16bits)
DMA1 on int1 регистрирует события даже будучи отключенным (CHAED)
По завершению передачи блока DMA0 включается DMA1.
besogon вне форума   Ответить с цитированием
Старый 22.04.2016, 14:23   #11
DimaK
Member
 
Регистрация: 11.04.2016
Адрес: Пфорцхайм, Германия
Возраст: 35
Сообщений: 78
Вес репутации: 323/20
DimaK is a jewel in the roughDimaK is a jewel in the roughDimaK is a jewel in the roughDimaK is a jewel in the rough
По умолчанию Re: Помогите разобраться с DMA на PIC32

Цитата:
Сообщение от besogon Посмотреть сообщение
DimaK
Вы как-то так хотите?:
Выделить абстрактный большой буффер.
DMA0 on int1 start DMA transfer (block == cell == 16bits)
DMA1 on int1 регистрирует события даже будучи отключенным (CHAED)
По завершению передачи блока DMA0 включается DMA1.
Да, именно так! Как я понимаю, флаги не сбрасываются аппаратно, поэтому риск самовольного сброса отсутствует...
DimaK вне форума   Ответить с цитированием
Старый 22.04.2016, 14:23   #12
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 33
Сообщений: 2,455
Вес репутации: 4677/100
besogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond repute
По умолчанию Re: Помогите разобраться с DMA на PIC32

Почему нельзя с помощью DMA0 заполнить буфер, а когда будет время - разобраться со всем этим?
двойная буферизация.
пусть DMA0 всегда загоняет предельное колличество данных в активный буфер, а на момент анализа Вы будете смотреть уже что к чему.
грубо говоря - DSIZ == buffersize, тогда в CPTR - сколько реально передалось. если блок кончился к моменту анализа - значит буфер мал.
в вашей некой абстрактной отложенной подсистеме ядра fastadc_ctl() будете менять местами активный и анализируемый буферы и анализировать содержимое неактивного буфера.

почему так нельзя? зачем что-то сразу куда-то пытаться рассовывать? это странно и мне непонятно.

Последний раз редактировалось besogon; 22.04.2016 в 14:30.
besogon вне форума   Ответить с цитированием
Старый 23.04.2016, 22:07   #13
DimaK
Member
 
Регистрация: 11.04.2016
Адрес: Пфорцхайм, Германия
Возраст: 35
Сообщений: 78
Вес репутации: 323/20
DimaK is a jewel in the roughDimaK is a jewel in the roughDimaK is a jewel in the roughDimaK is a jewel in the rough
По умолчанию Re: Помогите разобраться с DMA на PIC32

Я через ДМА хочу весь процесс измерения организовать - т.е. Чтобы через дма переферией внешней управлять
Глобальная задача - вообща от проца отвязаться на это время и все реализовать через дма. Так что - когда время будет, дма уже и не нужно. Если получится - буду собой гордиться
DimaK вне форума   Ответить с цитированием
Ответ

Метки
dma, pic32


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Синтезатор частоты на PIC16F84A. Помогите с прошивкой. Genezis Общетехнические вопросы 5 03.05.2010 07:25
помогите переложить рабочую прог с P16F628 на 12f629 gen22 Общетехнические вопросы 3 15.06.2009 14:27
помогите разобраться с OS_Delay monia Вопросы начинающих 8 12.04.2009 11:07
Мужики. Помогите разобраться с Delay на Си. Andrey Продукция MICROCHIP 18 28.05.2007 15:40


Часовой пояс GMT +3, время: 09:34.


Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd. Перевод: zCarot