Описание DMA в РП К1921ВГ1Т
Модераторы: ea, dav, bkolbov, Alis, pip, _sva_
-
RabidRabbit
- Сообщения: 213
- Зарегистрирован: 10 июн 2025, 12:11
- Предприятие: HomeWork
Re: Описание DMA в РП К1921ВГ1Т
Самое первое, за что цепляется глаз: Вы не ставите флаг CMD_LAST, так что по завершении передачи по установленным параметрам контроллер DMA пытается подгрузить следующий дескриптор с адреса 0x0 (что в поле CONFIG.NEXT_ADDR).
-
durimar_13
- Сообщения: 70
- Зарегистрирован: 26 фев 2025, 13:06
- Предприятие: Radioamateur
- Откуда: Свердловская обл.
Re: Описание DMA в РП К1921ВГ1Т
За инфу спасибо!
Это мне ИИ по имени Алиса Яндексовна посоветовала. Поначалу у меня было не так.
Счас вернусь и посмотрю, что будет.
Это мне ИИ по имени Алиса Яндексовна посоветовала. Поначалу у меня было не так.
Счас вернусь и посмотрю, что будет.
С уважением, Виктор.
-
durimar_13
- Сообщения: 70
- Зарегистрирован: 26 фев 2025, 13:06
- Предприятие: Radioamateur
- Откуда: Свердловская обл.
Re: Описание DMA в РП К1921ВГ1Т
Вернул в предыдущее состояние. Такое уже было. И это не то, что я хочу.
Скрин изменений в прицепе.
Скрин изменений в прицепе.
С уважением, Виктор.
-
durimar_13
- Сообщения: 70
- Зарегистрирован: 26 фев 2025, 13:06
- Предприятие: Radioamateur
- Откуда: Свердловская обл.
Re: Описание DMA в РП К1921ВГ1Т
Вот еще прицепил состояния регистра CONFIG DMA канала 0
С уважением, Виктор.
-
durimar_13
- Сообщения: 70
- Зарегистрирован: 26 фев 2025, 13:06
- Предприятие: Radioamateur
- Откуда: Свердловская обл.
Re: Описание DMA в РП К1921ВГ1Т
Вот еще скрин в прицепе, где видно, что перед второй итерацией флаги активного состояния канала не установились.
Тем не менее DMA отработал и заполнил 32 элемента в буфере ОЗУ. Я не понимаю, что происходит.
Тем не менее DMA отработал и заполнил 32 элемента в буфере ОЗУ. Я не понимаю, что происходит.
С уважением, Виктор.
-
durimar_13
- Сообщения: 70
- Зарегистрирован: 26 фев 2025, 13:06
- Предприятие: Radioamateur
- Откуда: Свердловская обл.
Re: Описание DMA в РП К1921ВГ1Т
Чтобы не сомневаться, я подал на вход канала 0 напряжение 3,3 вольта. Значения, похожие на правду.
С уважением, Виктор.
-
RabidRabbit
- Сообщения: 213
- Зарегистрирован: 10 июн 2025, 12:11
- Предприятие: HomeWork
Re: Описание DMA в РП К1921ВГ1Т
Я немного уже запутался
Не затруднит ли Вас озвучить, скажем так, "ТЗ"? Т.е. что должно работать и как?
Например: с одного входа АЦП непрерывно получать отсчёты с периодом таким-то, складывать в ОЗУ по N штук, использовать два буфера по N отсчётов и циклически переключаться между ними.
Например: с одного входа АЦП непрерывно получать отсчёты с периодом таким-то, складывать в ОЗУ по N штук, использовать два буфера по N отсчётов и циклически переключаться между ними.
-
durimar_13
- Сообщения: 70
- Зарегистрирован: 26 фев 2025, 13:06
- Предприятие: Radioamateur
- Откуда: Свердловская обл.
Re: Описание DMA в РП К1921ВГ1Т
Добрый день!
Значит, ТЗ - Так Задумано.
Одна из функций этого проекта - по запросу извне делать непрерывный множественный опрос (захват) аналоговых каналов со скоростью выборки АЦП, значение которой задается извне до начала захвата. Это основа для осциллографа. Результаты передаются в буфер ОЗУ с использованием DMA. Затем эти данные передаются в дальнейшую обработку. Важное требование - выборки должны идти непрерывно, без пропусков.
Один из простых способов регулировать скорость выборки - это использовать циклический режим АЦП с задержками между запусками. Эти задержку очень просто изменять, даже на лету, т.е. не останавливая опрос каналов. Можно, конечно, использовать запуск АЦП по таймеру, но это хуже для меня.
Подобный алгоритм работает уже в двух моих проектах: для ВГ015 и Baikal-U
Как должна работать эта программа.
В вечном main цикле функция fill_UBUFF() ожидает строку от UART0.
После получения строки должен делаться ее разбор (parser) на элементы настройки. Сейчас это выключено.
Сейчас любая вводимая через UART0 строка понимается как число - количество тактов ACLK - задержка между запусками.
Функция scope() - главная в осциллографе, делает ОДИН захват, количество измерений в захвате определяется длиной CAPBUFF_SIZE буфера CAPBUFF. Это количество можно программно менять. Но пока, чтобы не использовать цепочки дескрипторов, ограничимся максимально возможным количеством передач, которое можно записать в 10-битное поле BUFFER_SIZE регистра NDTL - регистра количества передач. Хотя в РП он называется "Регистр размера буфера", что не совсем верно.
Теперь запускаем DMA. DMA ждет запроса от АЦП, так настроено в ADC_init.
Запускаем АЦП.
Считывание результатов из FIFO сексенсора DMA начинает, когда в буфере будет не менее настроенного количества элементов (сейчас 16). Дальше DMA должен "смотреть" есть ли в буфере данные и считывать их. Потом эти данные DMA записывает в очередной элемент массива CAPBUFF. Когда все количество элементов, указанное в поле BUFFER_SIZE регистра NDTL будет передано, DMA должен остановиться. Но не раньше. Признаком завершения всех передач являются нулевые значения в полях состояния DMA ((DMA->CH[0].CH_STATUS_bit.CH_RD_ACTIVE и DMA->CH[0].CH_STATUS_bit.CH_WR_ACTIVE).
Дальше просто вывод результатов захвата.
Есть вопросы - задавайте!
Значит, ТЗ - Так Задумано.
Одна из функций этого проекта - по запросу извне делать непрерывный множественный опрос (захват) аналоговых каналов со скоростью выборки АЦП, значение которой задается извне до начала захвата. Это основа для осциллографа. Результаты передаются в буфер ОЗУ с использованием DMA. Затем эти данные передаются в дальнейшую обработку. Важное требование - выборки должны идти непрерывно, без пропусков.
Один из простых способов регулировать скорость выборки - это использовать циклический режим АЦП с задержками между запусками. Эти задержку очень просто изменять, даже на лету, т.е. не останавливая опрос каналов. Можно, конечно, использовать запуск АЦП по таймеру, но это хуже для меня.
Подобный алгоритм работает уже в двух моих проектах: для ВГ015 и Baikal-U
Как должна работать эта программа.
В вечном main цикле функция fill_UBUFF() ожидает строку от UART0.
После получения строки должен делаться ее разбор (parser) на элементы настройки. Сейчас это выключено.
Сейчас любая вводимая через UART0 строка понимается как число - количество тактов ACLK - задержка между запусками.
Функция scope() - главная в осциллографе, делает ОДИН захват, количество измерений в захвате определяется длиной CAPBUFF_SIZE буфера CAPBUFF. Это количество можно программно менять. Но пока, чтобы не использовать цепочки дескрипторов, ограничимся максимально возможным количеством передач, которое можно записать в 10-битное поле BUFFER_SIZE регистра NDTL - регистра количества передач. Хотя в РП он называется "Регистр размера буфера", что не совсем верно.
Теперь запускаем DMA. DMA ждет запроса от АЦП, так настроено в ADC_init.
Запускаем АЦП.
Считывание результатов из FIFO сексенсора DMA начинает, когда в буфере будет не менее настроенного количества элементов (сейчас 16). Дальше DMA должен "смотреть" есть ли в буфере данные и считывать их. Потом эти данные DMA записывает в очередной элемент массива CAPBUFF. Когда все количество элементов, указанное в поле BUFFER_SIZE регистра NDTL будет передано, DMA должен остановиться. Но не раньше. Признаком завершения всех передач являются нулевые значения в полях состояния DMA ((DMA->CH[0].CH_STATUS_bit.CH_RD_ACTIVE и DMA->CH[0].CH_STATUS_bit.CH_WR_ACTIVE).
Дальше просто вывод результатов захвата.
Есть вопросы - задавайте!
С уважением, Виктор.
-
RabidRabbit
- Сообщения: 213
- Зарегистрирован: 10 июн 2025, 12:11
- Предприятие: HomeWork
Re: Описание DMA в РП К1921ВГ1Т
К сожалению, в документации по DMA не нашёл, как устанавливается разрядность данных для записи/чтения. Пока мне не понятно, как это сделать, а значит и ничего предложить не сумею.
-
durimar_13
- Сообщения: 70
- Зарегистрирован: 26 фев 2025, 13:06
- Предприятие: Radioamateur
- Откуда: Свердловская обл.
Re: Описание DMA в РП К1921ВГ1Т
Ну, ничего страшного.
Отрицательный результат - тоже результат.
Большое Вам спасибо, хотя бы за попытку!
Отрицательный результат - тоже результат.
Большое Вам спасибо, хотя бы за попытку!
С уважением, Виктор.
