Перейти к содержанию
    

Контроллер для 24-битного SPI

А в чем это принципиально отличается от ногодрыга?

Например тем, что потребует только 2-х прерываний на одно 17-битное слово. Вместо 17 прерываний.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А мне ни разу не встречались микросхемы, которым надо именно 17, 19 и т.д. бит. Все встречавшиеся мне микросхемы с некратными 8 битам управляющими регистрами защелкивали в них последние 17, 19 и т.д. битов перед снятием CS, то есть вместо поиска экзотического контроллера с 17-битным SPI или ногодрыга достаточно было дополнить посылку до кратного 8 количества битов, сместив полезную информацию в сторону младших или старших битов.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Например тем, что потребует только 2-х прерываний на одно 17-битное слово. Вместо 17 прерываний.

Ногодрыг делается без прерываний, а если с прерываниями, то их будет 17 * 2.

data_in = 0;
for(i = 0; i < 17; i++)
{
  set_pin(MOSI, data_out >> i);
  set_pin(SCK, 1);
  data_in |= (1 << get_pin(MISO));
  set_pin(SCK, 0);
}

В вашем примере как передать 17 слов по 17 бит через DMA?

Никак. Поэтому либо ногодрыг, либо 36 байт по 8 бит + 1 бит (ногодрыга).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ногодрыг делается без прерываний, а если с прерываниями, то их будет 17 * 2.

В вашем примере как передать 17 слов по 17 бит через DMA?

Никак. Поэтому либо ногодрыг, либо 36 байт по 8 бит + 1 бит (ногодрыга).

Бред какой-то... Нафига городить ногодрыг+DMA+таймер если есть аппаратный SPI??? Это уже мазохизм в квадрате какой-то. К тому-же как у Вас получилось 36 байт всего для 17 слов? На 17 ещё умножить не забыли? И что получается 36*17байт, плюс память под этот массив, его формирование, программирование всей этой байды - мой вариант в 100 раз лучше.

И делать что-то ещё и без прерываний, на 100% грузя процессор элементарной задачей?? Это разве что для школьных моргалок светодиодами подойдёт.

Тогда зачем вообще какую-либо периферию в МК делают? Ведь всё что угодно хоть I2C, хоть UART можно ногодрыгом сделать. А теперь представьте, что Вам не только надо неспеша опросить пару датчиков и поморгать лампочками надо, а сделать что-то реально полезное. В реальных задачах ногодрыг должен идти сразу на мусорку, если только нет реально серьёзного обоснования (типа 16-ти одновременно работающих SPI, хотя даже такое в некоторых МК можно сделать аппаратно).

 

А мне ни разу не встречались микросхемы, которым надо именно 17, 19 и т.д. бит. Все встречавшиеся мне микросхемы с некратными 8 битам управляющими регистрами защелкивали в них последние 17, 19 и т.д. битов перед снятием CS, то есть вместо поиска экзотического контроллера с 17-битным SPI или ногодрыга достаточно было дополнить посылку до кратного 8 количества битов, сместив полезную информацию в сторону младших или старших битов.

Вот именно. Автор скорей всего не видит простейших путей решения своей задачи и нагромождает на пустом месте.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тогда зачем вообще какую-либо периферию в МК делают? Ведь всё что угодно хоть I2C, хоть UART можно ногодрыгом сделать.
История знает такой пример - SX от Scenix (Ubicom) и их библиотека (кстати, очень грамотно написанная) виртуальной периферии.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

История знает такой пример - SX от Scenix (Ubicom) и их библиотека (кстати, очень грамотно написанная) виртуальной периферии.

Знаю такой, изучал в своё время. Только там идеология была соответствующая - за счёт высвобождения вентилей из под кучи разной периферии, большая часть которой в реальных проектах не используется, отдать их все ядру и памяти, за счёт этого повысить объём памяти и скорость CPU, а всю периферию делать программно.

И в настояще время такие примеры есть - это PRU-ядра в некоторых МК от TI.

 

В вашем примере как передать 17 слов по 17 бит через DMA?

Кстати, если уж так хочется поизвращаться, то и это возможно. По-крайней мере на LPC и некоторых других МК, которые знаю:

формируете массив из слов: слово управления установки размерности SPI =9бит, ст.9 бит данных, слово управления установки размерности SPI =8бит, мл.8 бит.

Запускаете DMA с тактированием от таймера, так чтобы таймер генерил DMA-евенты, а DMA был запрограммирован на передачу связным списком для передачи в разные регистры SPI через определённые промежутки времени. Будет примерно то же самое, что с Вашим примером ногодрыг+DMA, только массив будет гораздо меньше и времянка чуть стабильнее.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Бред какой-то...

Ок. Давайте без эмоций.

 

Нафига городить ногодрыг+DMA+таймер если есть аппаратный SPI??? Это уже мазохизм в квадрате какой-то.

Я к этому не призывал. Если нужно передать-принять 17 бит, то кусок простейшего кода привел.

Без DMA, без таймеров и без аппаратного SPI.

Если нужно передать одиночные 17 бит на максимальной скорости, то это самый простой и довольно быстрый вариант.

Вы предлагаете использовать аппаратный SPI с программируемым словом.

Исходник не поленитесь набросать? Чую там переинициализацию SPI, сборки 17 битного слова при отправке и приеме, обработку флагов и все

это в прерывании, на вхождение и выход из которого тратятся порядка 12 тактов. При этом нужно как-то передавать состояние в прерывание,

рулить CS и прочее. Если вы по прежнему считаете свое решение проще моего варианта с ногодрыгом (который я изобразил на лету секунд за 30),

то через 5 минут ждем от вас код. Напоминаю, что не у всех STM32 есть управляемая длина слова - чаще всего это либо 8, либо 16 бит.

 

К тому-же как у Вас получилось 36 байт всего для 17 слов?

Слово 17-битное. Всего 17 слов. Итого 17 * 17 = 289 бит или 36 байт + 1 бит.

А как вы считаете?

 

мой вариант в 100 раз лучше.

Прошу показать код, чтоб обсуждать вопрос предметно.

 

И делать что-то ещё и без прерываний, на 100% грузя процессор элементарной задачей??

Ок. 8 бит по SPI передается за 16 тактов. Вы предлагаете инициализировать SPI (сколько тактов?), записать в SPI->DR байт и ждать прерывание.

Через 16 тактов вызовется ваш обработчик, в котором вы окажитесь через 12 тактов и будете должны проверить флаги, инициализировать SPI,

записать новую порцию, выйти из прерывания и тут же в нем за 12 тактов оказаться, т.к. SPI уже все отправит. Ничоси экономия нагрузки - под 100% сидеть в прерывании. ;)

 

Это разве что для школьных моргалок светодиодами подойдёт.

Это легко может оказаться какой-нить индикатор со встроенным сдвиговым регистром на 17 сегментов.

 

Тогда зачем вообще какую-либо периферию в МК делают?

Чтобы ее использовать. Например, популярные дисплеи Nokia (1202) имеют 9 битное слово.

Я управляю таким через 8-битный аппаратный SPI. Просто в памяти 8 слов упакованы в 9 байт.

Затем по DMA отправляется весь буфер.

 

 

только массив будет гораздо меньше и времянка чуть стабильнее.

В моем массиве 36..37 байт. Никаких списков нет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я к этому не призывал. Если нужно передать-принять 17 бит, то кусок простейшего кода привел.

Начнём с того, что этот код в общем случае нерабочий, так как совершенно непонятно - какова будет частота SCLK? А большинство устройств подключаемых по SPI имеют как правило конечную максимальную частоту SCLK. Вашему коду нужна пара задержек. И лучше чтобы эти задержки были привязаны например к таймеру (чтобы гарантировать времянки).

Теперь прикинем: предположим что требуется работа с конечным устройством на частоте SCLK==1МГц, получаем 17*17==289мкс - длительность передачи всего массива. Очевидно, что задержка на 1мкс может быть сделана пожалуй только просто циклом с поллингом таймера внутри. Т.е. - на всё время передачи 17*17 бит CPU будет занят 100%, а все задачи с более низким приоритетом, чем задача SPI, будут остановлены на всё время обмена.

 

Исходник не поленитесь набросать? Чую там переинициализацию SPI, сборки 17 битного слова при отправке и приеме, обработку флагов и все

это в прерывании, на вхождение и выход из которого тратятся порядка 12 тактов.

И что такого страшного? В любом ISR, обслуживающем периферию как правило производится до нескольких десятков обращений к регистрам периферии. При этом код именно работает, выполняет полезную работу, а не крутится в пустых задержках.

Да, в ISR будет сброс флага прерывания, чтение принятого слова (опционально), запись нового слова в регистр управления, запись следующих передаваемых бит в регистр передатчика. Примерно так.

На 100МГц-овом МК всё это займёт менее 1мкс.

CS-ом рулить не надо - он обычно устанавливается в начале посылки и снимается в конце.

 

Напоминаю, что не у всех STM32 есть управляемая длина слова - чаще всего это либо 8, либо 16 бит.

Причём тут STM32? У Вас на STM свет клином сошёлся?

 

Слово 17-битное. Всего 17 слов. Итого 17 * 17 = 289 бит или 36 байт + 1 бит.

А как вы считаете?

Нет, как Вы считаете? У Вас DMA умеет разворачивать байты в биты чтобы записать в один пин управления одной ногой GPIO ??? Это в каком МК имеется такой DMA?

Каждый бит Вам придётся положить как минимум в отдельный байт. Так что как минимум 289байт. Это если выбранный МК умеет адресовать регистр управления пином GPIO как байт, а не только как слово.

Если нет - ещё больше.

 

Ок. 8 бит по SPI передается за 16 тактов.

Ещё раз - каких тактов?? Видимо Вы живёте в идеальном мире, где любое slave-устройство SPI имеет неограниченную частоту SCLK. В реальном мире каждое устройство имеет конечную максимальную частоту SCLK указанную в даташите.

А ещё бывает, что такие устройства находятся за гальваническим барьером, ещё более ограничивающим частоту SCLK.

А ещё - есть SPI-слэйвы, формат обмена с которыми зависит от частоты SCLK. Т.е. - работаете на SCLK большей чем столько-то МГц? Пожалуйста, только вставьте доп. пустые такты в битовый поток.

Или Вы программируете только AVR-ы работающие на частоте пару МГц :biggrin:

А представьте - есть МК с тактовой до неск. сотен МГц, да и ещё и приличной частотой GPIO (десятки МГц).

 

Это легко может оказаться какой-нить индикатор со встроенным сдвиговым регистром на 17 сегментов.

Как раз в этом случае 17-бит - абсолютно бессмысленно делать. ПишИте 8*3 или 16*2 бит - старшие биты просто не будут использоваться.

 

Чтобы ее использовать. Например, популярные дисплеи Nokia (1202) имеют 9 битное слово.

Я управляю таким через 8-битный аппаратный SPI. Просто в памяти 8 слов упакованы в 9 байт.

Затем по DMA отправляется весь буфер.

И каким образом эта информация поможет вопрошающему отправить 17 бит??? Не 17*8 и не 17*17, а именно - просто 17бит, очевидно обрамлённых CS.

Я тоже много чего отправляю разным устройствам в разных проектах по SPI+DMA и что? В некоторых проектах это довольно сложные драйвера с арбитражём SPI-шины между несколькими обслуживаемыми устройствами на шине с разным форматом данных и разной SCLK и даже разной разрядностью SPI-шины. И причём тут это??

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Начнём с того, что этот код в общем случае нерабочий, так как совершенно непонятно - какова будет частота SCLK?

Вряд ли ногодрыгом можно получить настолько высокую частоту, чтоб не работало.

У типового 74HC595 частота под 100МГц.

 

Для "медленных" устройств с fSCK < 1МГц и решение будет другим. Пока никаких ограничений на частоту не накладывали.

 

Нет, как Вы считаете? У Вас DMA умеет разворачивать байты в биты чтобы записать в один пин управления одной ногой GPIO ??? Это в каком МК имеется такой DMA?

Вы неправильно понимаете зачем я предлагал использовать DMA: для записи в SPI, а не в GPIO.

 

Если кода для вашего решения не будет, предлагаю закончить обсуждение.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

off... всю тему не читал, нет сил.

но это резануло слух (взгляд)

У типового 74HC595 частота под 100МГц.

что за типовые 74HC595? ds на такие покажите.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вряд ли ногодрыгом можно получить настолько высокую частоту, чтоб не работало.

У типового 74HC595 частота под 100МГц.

А насколько высокая частота получится ногодрыгом в Вашей функции на некоем неизвестном МК? Как Вы это определяете? И как определить - будет Ваш код работать или нет с данным устройством для которого из док известна его максимальная SCLK? Или как получится - может будет может нет? А с переносом на новый МК или хотя-бы с новой партией микросхем SPI-слэйвов опять - как получится - может заработает может нет?

 

Открываю даташит на МК с которым сейчас работаю (Tiva TM4C129DNCPDT), читаю хар-ки GPIO:

Fast GPIO rise time, 12-mA drive = 1.75ns (nominal)

Fast GPIO fall time, 12-mA drive = 1.73ns (nominal)

Итого - ногодрыгом можно получить до ~30МГц и это только исходя из номинального значения параметра, а ведь может попасться экземпляр процессора с минимальным значением.

 

Конечно, если постараться, можно найти микросхему, которая будет работать с любой частотой которая может быть выведена ногодрыгом.

Только вот в реальных проектах, в которых я работаю последнее время, более земные параметры: FRAM FM25W256 <=20МГц; ADE78xx <=4МГц; AT45DBxx <=33 или 66МГц (и ещё и формат посылки меняется в зависимости от SCLK); ILI9340 - вроде макс. около 6МГц для операций чтения; SD-карты на SPI - так вообще <=400кГц на этапе инициализации, а потом и того хуже - максимально допустимая SCLK - в зависимости от типа карты.

А ещё часто приходится работать с чипами, находящимися за гальваническим барьером (типа ADUMxxx), обрезающим макс. допустимую SCLK до 1-2МГц.

 

Если кода для вашего решения не будет, предлагаю закончить обсуждение.

Код я уже описал выше, словами. Да и он очевиден и зависим от типа МК что приводить-то? Для сферического коня в вакууме? Кому оно нужно?

Ваше решение в общем случае также нерабочее. К тому-же - где ещё выдержка сигнала CS==1 между транзакциями на минимально необходимое по даташиту время?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И непонятно, что за задача такая хитрая, где надо передавать по 17 бит?? Скорей всего, у автора, в архитектуре решения в целом что-то сделано неправильно.

у моторолы с ихним бдм сделано

 

PS: А вообще - самый крутой SPI-контроллер который я использовал - у OMAP-L137. На нём можете сделать пересылку двух слов 9+8 бит просто двумя записями в регистр данных: его SPI-контроллер позволяет предварительно запрограммировать 4-ре режима передачи и выбирать нужный режим старшими битами записываемого в регистр данных слова. Так что на нём нетрудно строить пересылки сплошных пакетов данных из слов разной длины без всяких ногодрыгов и перепрограммирований в процессе передачи.

нужно не руководить на шине,а слушать шину. Без аппаратной поддержки именно 17 бит - никак.

но это так... лирика. Задача вялотекущая, сделаем - сделаем, нет - нет. А так, все-таки, склоняюсь к CPLD, проще будет, не видел я в ширпотребе навороченных SPI на борту

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

нужно не руководить на шине,а слушать шину. Без аппаратной поддержки именно 17 бит - никак.

В смысле - МК должен быть SPI-слэйвом? Что-ж Вы сразу не сказали??? А мы тут копий столько сломали :biggrin:

Со слэйвом всё конечно сложнее... Ну МК где есть аппаратная поддержка я писал выше.

В принципе - если нужно принять/передать одиночное слово 17бит (с дыркой до или после него), то можно извернуться:

запрограммировать SPI например на 3*8бит; получить 17 SCLK от удалённого устройства; заведя дополнительный сигнал SCLK от самого же МК, добить туда необходимые 3*8-17 тактов SCLK самим МК.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

нужно не руководить на шине,а слушать шину. Без аппаратной поддержки именно 17 бит - никак.

:) Мы тут чуть не разругались, обсуждая ногодрыг для Мастера.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Плохо читаете доки LPC17x: 4...16 бит.

 

Хоть там написано и по английски, но читаю хорошо. UM10360, LPC17xx User manual, Rev. 2 — 19 August 2010, страница 407

Table 361: SPI Control Register (S0SPCR - address 0x4002 0000) bit description
11:8 BITS
1000 8 bits per transfer
1001 9 bits per transfer
1010 10 bits per transfer
1011 11 bits per transfer
1100 12 bits per transfer
1101 13 bits per transfer
1110 14 bits per transfer
1111 15 bits per transfer
0000 16 bits per transfer

 

Конкретно процессор LPC1754.

 

В LPC178x/7x (UM10470 LPC178x/7x User manual) SSP - вот там действительно от 4х до 16ти бит.

В LPC11xx (UM10398 LPC111x/LPC11Cxx User manual) тоже SSP от 4х до 16ти бит.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...