Jump to content

    
Sign in to follow this  
AndruLud

тормозит DMA

Recommended Posts

Приветствую участников форума! У меня 2 контроллера (LPC1768 и s3c2440) соединены по протоколу SPI. При этом LPC1768 в роли ведущего выдает через свой SSP контроллер, сконфигурированный как SPI, посылку в 8 байт с частотой 10 кГц. Прием посылки в s3c2440 организован через DMA, сконфигурированный для чтения 8 байт, после этого должно возникать прерывание. Проблема в том, что прерывания начинают появляться ~через 15 сек после включения обмена, далее все вовремя, но байты оказываются сдвинутыми на 1. Данные из ведущего появляются вовремя (смотрел по осциллографу).

Share this post


Link to post
Share on other sites

Проблема по всей видимости аппаратная. Переключил все действо на другой SPI порт, задержка исчезла. Однако, осталась другая: последний байт, принятый по SPI через DMA оказывается первым байтом следующей посылки. Т.е послал 80 01 C0 03 E0 07 F0 0F, а принял 0F 80 01 C0 03 E0 07 F0. Может, кто-нибудь сталкивался?

Share this post


Link to post
Share on other sites

В LPC1768 такое было.

Во первых перед запуском нужно всё грамотно сбросить, все флаги о том что пришли данные, на всех стадиях, НА ВСЕХ. Т.е. у самого SPI, очистить SPI FIFO, контроллер ДМА сбросить, не забыть очистить DMA FIFO, сбросить прерывания, если есть флаг прерывания, на промежуточных стадиях (подсистемма событий) всё очистить. И самое главное - сбрасывать ДМА после всех остальных сбросов.

 

У меня такое было что вроде дма сброшен. принудительно его фифо очищен, SPI сброшен перед сбросом ДМА, флаг прерывания тоже перед ДМА сброшен - запускаешь - точно такой же сдвиг в 1 слово как у автора.

Всё оказалось что нужно было выключить и включить ДМА именно для SPI и после этого сбрасывать ДМА. т.е. сделать что то вроде:

LPC_SSP1->DMACR = 0;

LPC_SSP1->DMACR = 3;

(LPC1768)

 

Только поcле этого норм

Share this post


Link to post
Share on other sites

Спасибо за совет, буду продолжать копать в предложенном направлении, хотя у меня уже первый пакет приходит вывернутый, когда DMA было только что инициализировано и по SPI еще ничего не передавалось.

Share this post


Link to post
Share on other sites

Теперь возникла задача передавать данные по SPI из s3c2440 в lpc1768 , причем последний по-прежнему работает мастером. Проблема опять та же: ведомый s3c2440 посредством DMA передает сначала конец предыдущей посылки, потом все остальное, кроме конца, т.е имеем сдвиг данных. Лекарство, использованное ранее для приема ведомым, - включать/выключать DMA после получения каждого пакета - не работает. Может, кто сталкивался?

Share this post


Link to post
Share on other sites

Я бы даже сказал, что сброс DMA после передачи каждого пакета вредит. Если убрать сброс, то при первом включении посылки идут нормально. Потом, если мастер отрубается, все включается вновь, но криво. Чтобы побороться с кривизной поставил сторожевой таймер, с частотой чуть меньшей, чем частота посылок. В прерывании по приему посылки от DMA таймер сбрасывается, если приема нет, срабатывает прерывание от таймра, в котором сбрасывается DMA. Результат достаточно скромный в 7 из 10 случаев отрубания мастера и срабатывания таймера имеется сдвиг на байт.

Share this post


Link to post
Share on other sites

а в этих процах разве нет возможности настройки у SPI таймингов задержки до отправки бит и после отправки бит? у атмела это точно настраивается всё. И проблем бы возможно не возникало в вашем случае.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this