|
|
 |
Ответов
(1 - 8)
|
Oct 6 2011, 11:06
|
Участник

Группа: Участник
Сообщений: 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. Может, кто-нибудь сталкивался?
|
|
|
|
|
Oct 6 2011, 13:28
|
Местный
  
Группа: Свой
Сообщений: 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ле этого норм
|
|
|
|
|
Oct 10 2011, 19:17
|
Участник

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

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

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

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

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

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

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

|
Проблема решена. Надо по таймеру после отключения мастера перейти в режим мастера и выпихнуть байт, застрявший в передающем регистре.
|
|
|
|
|
Jan 11 2012, 12:40
|
Участник

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

|
Не-а. Здесь все параллельно и перпендикулярно, без подтанцовок с бубном.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|