реклама на сайте
подробности

 
 
> тормозит DMA
AndruLud
сообщение Oct 5 2011, 10:56
Сообщение #1


Участник
*

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



Приветствую участников форума! У меня 2 контроллера (LPC1768 и s3c2440) соединены по протоколу SPI. При этом LPC1768 в роли ведущего выдает через свой SSP контроллер, сконфигурированный как SPI, посылку в 8 байт с частотой 10 кГц. Прием посылки в s3c2440 организован через DMA, сконфигурированный для чтения 8 байт, после этого должно возникать прерывание. Проблема в том, что прерывания начинают появляться ~через 15 сек после включения обмена, далее все вовремя, но байты оказываются сдвинутыми на 1. Данные из ведущего появляются вовремя (смотрел по осциллографу).
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 8)
AndruLud
сообщение Oct 6 2011, 11:06
Сообщение #2


Участник
*

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



Проблема по всей видимости аппаратная. Переключил все действо на другой SPI порт, задержка исчезла. Однако, осталась другая: последний байт, принятый по SPI через DMA оказывается первым байтом следующей посылки. Т.е послал 80 01 C0 03 E0 07 F0 0F, а принял 0F 80 01 C0 03 E0 07 F0. Может, кто-нибудь сталкивался?
Go to the top of the page
 
+Quote Post
Porty
сообщение Oct 6 2011, 13:28
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 246
Регистрация: 28-05-08
Из: г. Ижевск
Пользователь №: 37 893



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

У меня такое было что вроде дма сброшен. принудительно его фифо очищен, SPI сброшен перед сбросом ДМА, флаг прерывания тоже перед ДМА сброшен - запускаешь - точно такой же сдвиг в 1 слово как у автора.
Всё оказалось что нужно было выключить и включить ДМА именно для SPI и после этого сбрасывать ДМА. т.е. сделать что то вроде:
LPC_SSP1->DMACR = 0;
LPC_SSP1->DMACR = 3;
(LPC1768)

Только поcле этого норм
Go to the top of the page
 
+Quote Post
AndruLud
сообщение Oct 10 2011, 19:17
Сообщение #4


Участник
*

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



Спасибо за совет, буду продолжать копать в предложенном направлении, хотя у меня уже первый пакет приходит вывернутый, когда DMA было только что инициализировано и по SPI еще ничего не передавалось.
Go to the top of the page
 
+Quote Post
AndruLud
сообщение Dec 30 2011, 09:29
Сообщение #5


Участник
*

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



Теперь возникла задача передавать данные по SPI из s3c2440 в lpc1768 , причем последний по-прежнему работает мастером. Проблема опять та же: ведомый s3c2440 посредством DMA передает сначала конец предыдущей посылки, потом все остальное, кроме конца, т.е имеем сдвиг данных. Лекарство, использованное ранее для приема ведомым, - включать/выключать DMA после получения каждого пакета - не работает. Может, кто сталкивался?
Go to the top of the page
 
+Quote Post
AndruLud
сообщение Dec 30 2011, 10:59
Сообщение #6


Участник
*

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



Я бы даже сказал, что сброс DMA после передачи каждого пакета вредит. Если убрать сброс, то при первом включении посылки идут нормально. Потом, если мастер отрубается, все включается вновь, но криво. Чтобы побороться с кривизной поставил сторожевой таймер, с частотой чуть меньшей, чем частота посылок. В прерывании по приему посылки от DMA таймер сбрасывается, если приема нет, срабатывает прерывание от таймра, в котором сбрасывается DMA. Результат достаточно скромный в 7 из 10 случаев отрубания мастера и срабатывания таймера имеется сдвиг на байт.
Go to the top of the page
 
+Quote Post
AndruLud
сообщение Dec 30 2011, 12:49
Сообщение #7


Участник
*

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



Проблема решена. Надо по таймеру после отключения мастера перейти в режим мастера и выпихнуть байт, застрявший в передающем регистре.
Go to the top of the page
 
+Quote Post
Aaron
сообщение Jan 11 2012, 12:25
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 243
Регистрация: 5-10-06
Из: Зеленоград
Пользователь №: 21 007



а в этих процах разве нет возможности настройки у SPI таймингов задержки до отправки бит и после отправки бит? у атмела это точно настраивается всё. И проблем бы возможно не возникало в вашем случае.
Go to the top of the page
 
+Quote Post
AndruLud
сообщение Jan 11 2012, 12:40
Сообщение #9


Участник
*

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



Не-а. Здесь все параллельно и перпендикулярно, без подтанцовок с бубном.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 15:29
Рейтинг@Mail.ru


Страница сгенерированна за 0.01424 секунд с 7
ELECTRONIX ©2004-2016