Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: spi slave @ 13 mhz
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Интерфейсы
andrewlekar
Бьюсь над простой с виду проблемой - реализацией spi slave. Проц шустрый (at91sam9260), spi аппаратно есть, от мастера идут посылки вида opcode-address-data. При чтении передаётся opcode-address и тут же идут такты на чтение данных. Не могу сообразить как грамотно сделать:
1. Если через прерывания, то есть только прерывание по приёму байта и даже если я оставляю только сохранение в буфер, то уже проц не поспевает за данными.
2. Если использовать dma, то непонятно как определять конец посылки. Если использовать в качестве признака конца посылки снятие чип селекта, то запарывается алгоритм чтения - чип селект снимается только после всего обмена. Но при дотачивании мастера вариант неплохой.
3. Если использовать поллинг флага без прерывания, то отъедается весь ресурс проца и могут пропадать байты при прерывании.

Так что делать то?
Правда ли что при высокой скорости uart возникнет точно та же проблема? Как лучше организовать обмен по uart если хочется иметь на нём одновременно приём ат команд с эхом и передачу больших блоков данных быстро?
aaarrr
Цитата(andrewlekar @ Oct 21 2009, 21:35) *
Проц шустрый (at91sam9260), spi аппаратно есть, от мастера идут посылки вида opcode-address-data. При чтении передаётся opcode-address и тут же идут такты на чтение данных. Не могу сообразить как грамотно сделать

Никак, только менять протокол обмена, т.к. для работы с процессором он совершенно не годится.

Цитата(andrewlekar @ Oct 21 2009, 21:35) *
Правда ли что при высокой скорости uart возникнет точно та же проблема? Как лучше организовать обмен по uart если хочется иметь на нём одновременно приём ат команд с эхом и передачу больших блоков данных быстро?

UART - асинхронный интерфейс, как там может возникнуть "точно та же проблема"?
Кроме того, у него есть прерывание по тайм-ауту, что позволяет вполне комфортно работать через DMA.
andrewlekar
Цитата(aaarrr @ Oct 22 2009, 00:43) *
Никак, только менять протокол обмена, т.к. для работы с процессором он совершенно не годится.

Почему именно не годится? Потому что нет паузы между запись и чтением?

Цитата(aaarrr @ Oct 22 2009, 00:43) *
UART - асинхронный интерфейс, как там может возникнуть "точно та же проблема"?

Например нулевая пауза между байтами. Аппаратно скорости может хватать, а программно нет.

Цитата(aaarrr @ Oct 22 2009, 00:43) *
Кроме того, у него есть прерывание по тайм-ауту, что позволяет вполне комфортно работать через DMA.

Любопытно. Но лучше я для uart буду использовать dma только для передачи.
aaarrr
Цитата(andrewlekar @ Oct 22 2009, 00:05) *
Почему именно не годится? Потому что нет паузы между запись и чтением?

Да, именно поэтому. Это АЦП какой-нибудь может лопатить данные влет, а процессору в любом случае подумать надо.

Цитата(andrewlekar @ Oct 22 2009, 00:05) *
Например нулевая пауза между байтами. Аппаратно скорости может хватать, а программно нет.

Да причем тут это? Проблема же у вас в скорости формирования ответа, а в случае UART'а мастер не донимает ведомого своими клоками - когда тот сможет, тогда и ответит.

Цитата(andrewlekar @ Oct 22 2009, 00:05) *
Любопытно. Но лучше я для uart буду использовать dma только для передачи.

Очень напрасно: это значит, что, например, при скорости UART'а 115200 время реакции на его прерывание не должно превышать 87мкс - есть немалый риск пролететь.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.