AndruLud 0 5 октября, 2011 Опубликовано 5 октября, 2011 · Жалоба Приветствую участников форума! У меня 2 контроллера (LPC1768 и s3c2440) соединены по протоколу SPI. При этом LPC1768 в роли ведущего выдает через свой SSP контроллер, сконфигурированный как SPI, посылку в 8 байт с частотой 10 кГц. Прием посылки в s3c2440 организован через DMA, сконфигурированный для чтения 8 байт, после этого должно возникать прерывание. Проблема в том, что прерывания начинают появляться ~через 15 сек после включения обмена, далее все вовремя, но байты оказываются сдвинутыми на 1. Данные из ведущего появляются вовремя (смотрел по осциллографу). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AndruLud 0 6 октября, 2011 Опубликовано 6 октября, 2011 · Жалоба Проблема по всей видимости аппаратная. Переключил все действо на другой SPI порт, задержка исчезла. Однако, осталась другая: последний байт, принятый по SPI через DMA оказывается первым байтом следующей посылки. Т.е послал 80 01 C0 03 E0 07 F0 0F, а принял 0F 80 01 C0 03 E0 07 F0. Может, кто-нибудь сталкивался? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
porty 0 6 октября, 2011 Опубликовано 6 октября, 2011 · Жалоба В LPC1768 такое было. Во первых перед запуском нужно всё грамотно сбросить, все флаги о том что пришли данные, на всех стадиях, НА ВСЕХ. Т.е. у самого SPI, очистить SPI FIFO, контроллер ДМА сбросить, не забыть очистить DMA FIFO, сбросить прерывания, если есть флаг прерывания, на промежуточных стадиях (подсистемма событий) всё очистить. И самое главное - сбрасывать ДМА после всех остальных сбросов. У меня такое было что вроде дма сброшен. принудительно его фифо очищен, SPI сброшен перед сбросом ДМА, флаг прерывания тоже перед ДМА сброшен - запускаешь - точно такой же сдвиг в 1 слово как у автора. Всё оказалось что нужно было выключить и включить ДМА именно для SPI и после этого сбрасывать ДМА. т.е. сделать что то вроде: LPC_SSP1->DMACR = 0; LPC_SSP1->DMACR = 3; (LPC1768) Только поcле этого норм Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AndruLud 0 10 октября, 2011 Опубликовано 10 октября, 2011 · Жалоба Спасибо за совет, буду продолжать копать в предложенном направлении, хотя у меня уже первый пакет приходит вывернутый, когда DMA было только что инициализировано и по SPI еще ничего не передавалось. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AndruLud 0 30 декабря, 2011 Опубликовано 30 декабря, 2011 · Жалоба Теперь возникла задача передавать данные по SPI из s3c2440 в lpc1768 , причем последний по-прежнему работает мастером. Проблема опять та же: ведомый s3c2440 посредством DMA передает сначала конец предыдущей посылки, потом все остальное, кроме конца, т.е имеем сдвиг данных. Лекарство, использованное ранее для приема ведомым, - включать/выключать DMA после получения каждого пакета - не работает. Может, кто сталкивался? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AndruLud 0 30 декабря, 2011 Опубликовано 30 декабря, 2011 · Жалоба Я бы даже сказал, что сброс DMA после передачи каждого пакета вредит. Если убрать сброс, то при первом включении посылки идут нормально. Потом, если мастер отрубается, все включается вновь, но криво. Чтобы побороться с кривизной поставил сторожевой таймер, с частотой чуть меньшей, чем частота посылок. В прерывании по приему посылки от DMA таймер сбрасывается, если приема нет, срабатывает прерывание от таймра, в котором сбрасывается DMA. Результат достаточно скромный в 7 из 10 случаев отрубания мастера и срабатывания таймера имеется сдвиг на байт. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AndruLud 0 30 декабря, 2011 Опубликовано 30 декабря, 2011 · Жалоба Проблема решена. Надо по таймеру после отключения мастера перейти в режим мастера и выпихнуть байт, застрявший в передающем регистре. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Aaron 1 11 января, 2012 Опубликовано 11 января, 2012 · Жалоба а в этих процах разве нет возможности настройки у SPI таймингов задержки до отправки бит и после отправки бит? у атмела это точно настраивается всё. И проблем бы возможно не возникало в вашем случае. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AndruLud 0 11 января, 2012 Опубликовано 11 января, 2012 · Жалоба Не-а. Здесь все параллельно и перпендикулярно, без подтанцовок с бубном. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться