Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Atmel SAM9XE - непонятки с SPI
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
SuperAlex
Доброго времени суток.
Столкнулся с такой проблемой-при выводе данных по SPI с помощью DMA наблюдаются непонятные паузы между символами порядка 300 нс. Это при том, что DLYBS=0, DLYBCT=0. Частота тактирования 10 МГц, 8 бит на символ. Частота контроллера 120 МГц. Перерыл все доки, но причины не нашел. Кто-нибудь сталкивался с похожим? Очень надеюсь на помощь.
aaarrr
А память, к которой обращается DMA, другие мастера точно не трогают? FIFO нет, поэтому любое обращение может "сломать" таким образом обмен SPI, если только в MATRIX не зарубить бесконечные burst'ы.
SuperAlex
DMA канал работает только на SPI.
aaarrr
Причем тут DMA? Другие мастера обращаются к той же памяти, или нет?
SuperAlex
Что такое мастера. Не понимаю терминологию.
aaarrr
Посмотрите разделы 7.2 и 21 даташита. Вопрос очень простой: нет ли одновременных обращений к памяти со стороны PDC и, например, процессора? Если есть, то данные при передаче могут прерываться.

И уточнение: паузы наблюдаются после каждого байта, или же возникают спорадически?
SuperAlex
Паузы после каждого байта.
SuperAlex
Что то мне подсказывает, дело не в мастерах, хоты кто его знает. Может это особенности атмеловской периферии?
aaarrr
Цитата(SuperAlex @ Nov 1 2011, 18:27) *
Что то мне подсказывает, дело не в мастерах, хоты кто его знает.

Возможно. Но версию с мастерами лучше проверить. Всего-то нужно инициализировать MATRIX.

Цитата(SuperAlex @ Nov 1 2011, 18:27) *
Может это особенности атмеловской периферии?

Не скажу насчет XE, но ни на каких других атмеловских процессорах подобной паузы не наблюдал.
SuperAlex
А куска кода с инициализацией matrixa не подбросите?
aaarrr
Попробуйте просто установить в MATRIX_MCFG0 и 1 ненулевое значение (скажем, 1 или 2).

Процессор работает на 120МГц, а какая частота у шины?
SuperAlex
У SPI? 20 МГц.

Установил MATRIX_MCFG0 и 1, изменений нет.
aaarrr
Цитата(SuperAlex @ Nov 1 2011, 20:15) *
У SPI? 20 МГц.

У AHB. В первом посте указана частота SPI 10МГц, а к чему относится 20?
SuperAlex
Частоту SPI переставил на 20 МГЦ, все то же самое. А как узнать частоту AHB?
aaarrr
Цитата(SuperAlex @ Nov 1 2011, 21:05) *
А как узнать частоту AHB?

Например, умножить частоту SPI на делитель, необходимый для ее получения. Частота AHB = MCK.
SuperAlex
MCK=120 MHz
aaarrr
Цитата(SuperAlex @ Nov 1 2011, 21:11) *
MCK=120 MHz

По даташиту разрешенный максимум - 80.
SuperAlex
Не понял, а где же обещанные 180 МГц?
aaarrr
Цитата(SuperAlex @ Nov 1 2011, 21:27) *
Не понял, а где же обещанные 180 МГц?

180 - это для PCK, на котором работает только ядро.
MCK - частота внешней шины и базовая для периферии, макс. 80MHz.
SuperAlex
У меня частота кварца 10 МГц (MAINCK=10 МГц), DIVA=1, MULA=11 -> PLLACK=120 МГц, PMC_MCKR=2 -> MCK=120 МГЦ что здесь не так? У самого атмела в примере MCK=96 с чем то МГЦ.
aaarrr
Цитата(SuperAlex @ Nov 1 2011, 22:05) *
что здесь не так? У самого атмела в примере MCK=96 с чем то МГЦ.

Смотрим документацию:
Цитата
43.4.2 Master Clock Characteristics

1/(tCPMCK) Master Clock Frequency (VDDCORE = 1.65V T = 85°C) 80MHz MAX
1/(tCPMCK) Master Clock Frequency (VDDCORE = 1.8V T = 85°C) 90MHz MAX

В вашем случае MCK должен быть равен PCK/2 или ниже.

В "примерах" может быть (и бывает часто) любая ересь.

P.S. Правда, к наблюдаемой проблеме с SPI данный "оверклок" никакого отношения не имеет.
SuperAlex
Я так понимал, что частота процессора равняется MAINCLOCK (выход PLLA, например) на какой-то предделитель (PRES). Частота после предделителя PRES поступает на вход предделителя MDIV и уже после него получается MCK. Я правильно понимаю? (параграф 28.2 datasheet)
aaarrr
Правильно. Все это нарисовано на картинке Figure 28-1.
SuperAlex
Так как же тогда получить частоту процессора 180 МГц и частоту MCK<=80 МГц, если пределное значение частоты PLL после умножителей и делителей ограничено 240 МГц?
aaarrr
Никак. Можно получить PCK=180 и MCK=90, что укладывается в режим 1.8V VDDCORE. Если PCK=120, то MCK должна быть 60 или ниже.

Максимум 80 написал по памяти, поэтому немного ошибся - он для 1.65V VDDCORE.
SuperAlex
Чтобы получить PCK=180 и MCK=90 нужно установить PRES=2 и MDIV=PCK/2 при PLL=360 МГц, но PLL невозможно установить на 360 МГц. Как быть в этом случае?
aaarrr
Так зачем ставить PRES=2? Можно выставить PLL на 180, эти 180 использовать непосредственно как PCK, а MCK установить равным PCK/2.
SuperAlex
Точно, сам написал и тут же так подумал, торможу после безуспешных попыток убрать паузу между символами, уже не знаю, что и делать.
aaarrr
С какой областью памяти сейчас работает SPI - Internal SRAM, Flash, EBI (SRAM или SDRAM)?

Для теста можно в качестве источника данных SPI задействовать ROM - тут уж точно не будет конфликтов при обращении, если только USB Host не используется.
SuperAlex
Используется Internal SRAM, USB Host не используется, сейчас попробую использовать rom. А прием в ISRAM не будет конфликтовать?

Поставил на ROM, все то же самое. Но вот, что странно-при PCK=180 и MCK=90 отладчик начал выдавать invalid clock при настройке spi0. Что то странное происходит.
aaarrr
Цитата(SuperAlex @ Nov 2 2011, 00:13) *
А прием в ISRAM не будет конфликтовать?

Лучше отключите его пока совсем.
SuperAlex
поставил прием на rom

отключил прием, та же петрушка

Попробовал 16 бит на символ-изменений нет
aaarrr
Приведите на всякий случай свои настройки SPI/PDC. Вряд ли в них дело, но все же.
SuperAlex
aaarrr
Так здесь прописано DLYBCT=1, то есть 32MCK или 266ns, если MCK=120MHz.
SuperAlex
с нулем то же самое

я завтра проверю и отпишусь, но по-моему я ошибался и все таки 1.
SuperAlex
Да, действительно моя ошибка. ОГРОМНОЕ СПАСИБО aaarrr!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.