Два дня бьюсь и не могу понять в чем причина данного поведения контроллера. Запустил dma + uart передатчик, все работает как надо. А для приемника возникает странный эффект. Идея следующая: инициализируется уарт, разрешается его прерывание. При срабатывании прерывания, читается байт (это длинна будущего сообщения), разрешается dma на прем этой длинны байт и запрещается прерывание от uart. Далее dma выгребает требуемое количество байт, генерирует свое прерывание. В этом прерывании отключается dma и разрешается прерывание uart. Все повторяется снова, первый пришедший байт и будет длинной будущего пакета. Первый раз все работает как надо. А дальше байт длинны попадает первым байтом в dma. Т.е., к примеру, отправляем 3, затем 1 2 3, вызывается прерывание dma, в памяти 1 2 3, но далее я отправляю 3 1 2 3 и после приема двойки вызывается прерывание dma, а в памяти 3 1 2 и так далее. Т.е. dma захватывает байт длинны всегда кроме первого запуска. Предполагаю, что что-то не так с остановкой dma, но что понять не могу. Помогите, плиз...
Поначалу тоже решил забить, но все же напишу. Может кому пригодится. Кроме выключения дма, оказывается надо еще ее отключать от уарта, а то все равно уарт данные пихает в дма. Не совсем до конца понимаю как это происходит, в библиотечных функциях было рыться лень. Но эта строка лечит проблему
Да... как частный случай может кому и сгодится... как панацея - нет... Там довольно сложный механизм взаимодействия... поэтому дело даже не в библиотечных функциях... они не могут охватить всех нюансов периферии... Всё решается думалкой и логическим анализатором... ну и знанием железа... Но вся эта сложность, как не странно, позволяет добиться удивительных результатов простыми методами...
_________________ "Я не даю готовых решений, я заставляю думать!"(С)
Уважаемый HHIMERA. Я к тому, что как помигать светодиодиком или запустить шим советчиков много. Как только вопрос чуть посложнее... Тишина.
Человек когда идет на форум? Когда собственные мысли и идеи кончились. Когда полный голяк. Понятно, что если надо, то ты все равно разберешься. Вопрос в том, сколько времени ты потратишь. День, неделю или месяц? Никто же не ожидает готового решения проблемы. Имеется ожидание свежей идеи, новой мысли.
Уважаемый HHIMERA. Я к тому, что как помигать светодиодиком или запустить шим советчиков много. Как только вопрос чуть посложнее... Тишина.
Уважаемый eess9... Это нормально... Именно поэтому я никогда не открываю тем и не задаю вопросов... проще самому разобраться... иногда такого насоветуют... Но по своему опыту... по завершению трансфера битами подключения ДМА никогда не рулил... разве что... только если нужна полная переконфигурация периферии...
Цитата:
Человек когда идет на форум? Когда собственные мысли и идеи кончились. Когда полный голяк. Понятно, что если надо, то ты все равно разберешься. Вопрос в том, сколько времени ты потратишь. День, неделю или месяц? Никто же не ожидает готового решения проблемы. Имеется ожидание свежей идеи, новой мысли.
Не спорю... но данный нюанс более смахивает на костыль... Обычно с такими вещами лучше разбираться до конца... во избежание... SPL не юзаю... поэтому мысли и идеи иссякли незамедлительно...
_________________ "Я не даю готовых решений, я заставляю думать!"(С)
Кстати, вопрос. Что будет, если приемник включится во время передачи пакета? Поймает какой-нибудь байт из его середины? Допустим, со значением 200. Далее, он будет ждать 200 байт? Не переполнится ли буфер? Если пакеты небольшие - сколько он их сжуёт? Ладно, пусть жуёт, но где он остановится? Скорее всего в середине очередного пакета и следующим байтом длины опять будет ерунда? Вам бы, батенька, над организацией протокола подумать, а не DMA лепить куда ни попадя. Если я что-то не так понял и зря наезжаю извиняй конечно.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 20
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения