Здравствуйте. Поделюсь небольшим экспериментом.
Был у меня один проект автоматизации с очень ограниченным бюджетом. Алгоритм системы был довольно прост, автоматизировалась солнечная батарея. Сначала ее установили в одно положение, потом решили, что лучше, если она будет все время повернута на солнце. Установили два дигателя,горизонтального и вертикального перемещения и энкодеры.
Так вот для пробного испытания, никто не захотел приобретать профессиональные пром контроллеры, типа Siemens. решили остановиться на AVRке. Конечно, простота хуже воровства. При наладке требовалось постоянно править программу. Были бы это пром контроллеры, то ничего особого нет, так как они прошиваются удаленно, да и интерфейсы удобны. Но этот дрючек атмеловский нужно же по месту прошивать!
Расстояние от станции до помещения около 40м. Взял я как-то обыкновенный телефонный кабель, или не телефонный, точно не помню уже подключил его к SPI контроллера и к программатору. На мое удивление, программатор сразу определил контроллер. Правда прошивка не получалась сначала. Очевидно было, что частота слишком большая, для такой линии. После того как частоту программирования снизил до 10кГц, прошивка начала заливаться успешно.
Общая длина между МК и компьютером было 50м! Пока делал отладку, прошивал контроллер раз 100 наверно, всего в нескольких раз прошивка прерывалась, да и то, похоже не из-за длинной линии.
Видео:КАК ПОДКЛЮЧИТЬ SPI адресную бегущую ленту? | SWGСкачать
Arduino.ru
Видео:Цифровые интерфейсы: 04. SPI (Периферийный последовательный интерфейс)Скачать
MMA7455 SPI длина линии
Есть акселерометр MMA7455, подключаю его к Arduino по шине SPI. При короткой линии коммуникации и питания все хорошо работает; при подключении 15м кабеля по питанию (- и +) коммуникации нет с акселерометром. Если один из полюсов питания имеет длинный провод, а другой короткий, то взаимодействие успешно.
Сопротивление 15 метрового кабеля 4 Ом.
Я понимаю, если 15 м по шине комуникации, тогда может и не работать, а тут по питанию такое.
Если смогли померить сопротивление проводов, то в чем была трудность померить напряжение питания на акселерометре, когда он не работает?
И еще. Любая линия данных работает относительно одной из линий питания, чаще всего относительно земли (GND), поэтому удлинение линий питания так же может сказываться на связь. Попробуйте снизить скорость SPI:
Длинная линия — это всегда проблемма. Начинает сказываться ёмкость и индуктивность линии (точнее, ее волновое сопротивление), возможно, придется позаботиться о согласовании линии по волновому сопротивлению (входное сопротивление приемника должно быть равно волновому сопротивлению линии). Старайтесь использовать только витые пары и для каждого сигнала — свой земляной провод. То есть если всего 4 сигнальных провода, то потребуется кабель UTP-5 (от комповой сети).
Если смогли померить сопротивление проводов, то в чем была трудность померить напряжение питания на акселерометре, когда он не работает?
С напряжением, кажется все в порядке, это одно из первых что я проверил.
Понижение скорости SPI не желательно.
Длинная линия — это всегда проблемма. Начинает сказываться ёмкость и индуктивность линии (точнее, ее волновое сопротивление), возможно, придется позаботиться о согласовании линии по волновому сопротивлению (входное сопротивление приемника должно быть равно волновому сопротивлению линии). Старайтесь использовать только витые пары и для каждого сигнала — свой земляной провод. То есть если всего 4 сигнальных провода, то потребуется кабель UTP-5 (от комповой сети).
Видео:AVR 38# Последовательный интерфейс SPIСкачать
Максимальная длина spi шины
Возникла необходимость разместить модули устройства в разные корпуса, в зависимости от функциональности 1 главный модуль где находится МК и 1-5 дополнительных модулей.
Модули общаются с МК по SPI шине, поэтому возникает вопрос — если растояние между блоками не более 50 см и все они будут присоеденены к главному блоку (звезда) с помощью экранированного кабеля — будет ли в данном случае обеспечиваться нормальная работа шины SPI ?
Если кто то сталкивался с чем то подобным был бы очень благодарен за коментарии по данному вопросу.
большая скорость не нужна — там раз в 1 сек опрос датчиков
резисторы ставить возле каждого внешнего блока ? и номиналы какие ?
тоесть резюмирую вышесказанное — если длинна около 50 см и скорости до 5кбит обычный экранированный кабель с витой парой внутри — позволит работать долго и счастливо
опробую на реальной железке в ближайшее время — отпишу про устойчивость\надежность
Видео:Теория и практика UART, I2C (TWI), SPI на arduino.Скачать
Максимальная длина spi шины
Последний раз редактировалось xmavr Пн июн 03, 2013 15:48:38, всего редактировалось 1 раз.
Друг Кота |
Несколько метров для SPI многовато.
Самое простое — на приемном конце, непосредственно перед микросхемой, поставить резисторы около 300 Ом в разрыв каждой линии интерфейса. Это предотвратит (ну или уменьшит) выбросы на фронтах («звон» из-за несогласованной линии передач). Учесть, что для линий MISO и MOSI приемные концы с противоположных сторон. Может, для такой длинной линии поставить резисторы с обоих сторон линии.
Если не поможет, то можно ставить на передающем конце микросхемы — шинные формирователи, а на приемном — соответственно шинные приемники. Я бы так стал делать.
JLCPCB, всего $2 за прототип печатной платы! Цвет — любой!
Зарегистрируйтесь и получите два купона по 5$ каждый:https://jlcpcb.com/cwc
Поставщик валерьянки для Кота |
Сборка печатных плат от $30 + БЕСПЛАТНАЯ доставка по всему миру + трафарет
Вымогатель припоя |
Приглашаем 30 ноября всех желающих посетить вебинар о литиевых источниках тока Fanso (EVE). Вы узнаете об особенностях использования литиевых источников питания и о том, как на них влияют режим работы и условия эксплуатации. Мы расскажем, какие параметры важно учитывать при выборе литиевого ХИТ, рассмотрим «подводные камни», с которыми можно столкнуться при неправильном выборе, разберем, как правильно проводить тесты, чтобы убедиться в надежности конечного решения. Вы сможете задать вопросы представителям производителя, которые будут участвовать в вебинаре.
Друг Кота |
Это полезно, но не так важно, т.к. SPI — изначально быстрый интерфейс, и даже если его «замедлить», уменьшив частоту CLK, останутся проблемы искажения фронтов из-за длинных несогласованных линий и т.д.
Хотя при меньших скоростях можно советовать переходить на UART, тоже с установкой каких-то доп.микросхем.
Приглашаем всех желающих 25/11/2021 г. принять участие в вебинаре, посвященном антеннам Molex. Готовые к использованию антенны Molex являются компактными, высокопроизводительными и доступны в различных форм-факторах для всех стандартных антенных протоколов и частот. На вебинаре будет проведен обзор готовых решений и перспектив развития продуктовой линейки. Разработчики смогут получить рекомендации по выбору антенны, работе с документацией и поддержкой, заказу образцов.
Мудрый кот |
_________________
Когда уже ничего не помогает — прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души — Леонтьев А. (сказано в 1965 г.)
Читайте также: Коробка уравнивания потенциалов открытой установки с заземляющей шиной куп hegel
Мудрый кот |
Друг Кота |
Друг Кота |
Мудрый кот |
_________________
Когда уже ничего не помогает — прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души — Леонтьев А. (сказано в 1965 г.)
Друг Кота |
Интересный документ, очень детальный.
Только не раскрыта тема сигнала SS (или CS, или CE, в общем как его там. ). Часто «слейвы» требуют такого сигнала в обязательном порядке, от мастера. При двухсторонней коммуникации по принципу, описанному в документе, может еще и потребоваться такой сигнал назад, от «слейва» ко второму SPI мастера, который тоже будет «слейв» (согласно Figure 2 документа). Хотя при односторонней передаче данных, например, в случае вывода информации на устройство отображения, будет проще. Так что, считаю, в статье полезный пример, но не окончательный рецепт на все случаи жизни.
Кто сейчас на форуме
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2
Видео:Лекция 308. Шина I2CСкачать
Обзор шины SPI и разработка драйвера ведомого SPI устройства для embedded Linux (Часть первая, обзорная)
В этой статье я хочу провести краткий обзор шины SPI (интерфейса, широко распространённого во встраиваемой технике, используемого для подключения различных устройств) и попытаюсь описать процесс создания драйвера протокольного уровня SPI устройства для Linux. Данный документ не претендует на роль полного руководства, а скорее преследует цель указать нужное направление. Так как статья не вошла в размер одного топика, мне пришлось разбить её на две части.
0. Вместо введения
Что это за статья?
Эта статья представляет собой компиляцию информации из различных источников, вольный перевод некоторых частей документации, а также мои собственные комментарии, дополнения и описания возникших проблем.
Для кого эта статья?
В первую очередь, для новичков, каковым являюсь и я. На форумах по embedded Linux очень часто можно встретить вопрос: «А как на этой плате работать с SPI?». Именно на него я и попытаюсь дать ответ. В качестве примера, я приведу код написанный для работы с моим тестовым SPI устройством.
Структура статьи
По причине того, что информации получилось достаточно много, статья разбита на несколько подразделов:
- Что такое SPI?
- Обзор SPI подсистемы в Linux
- Разработка userspace протокольного SPI драйвера с использованием spidev
- Разработка протокольного SPI драйвера уровня ядра
- Документация
Первые два пункта войдут в первую часть статьи, оставшиеся во вторую.
Первый подраздел описывает работу шины SPI, данная часть статьи конкретно к Linux никак не привязана, поэтому её можно читать тем, кому Linux не интересен, а нужно лишь получить информацию об этом интерфейсе.
Второй подраздел описывает структуры и механизмы лежащие в основе работы с SPI в Linux, его нужно прочесть для понимания того, о чём пойдёт речь в третьей и четвёртой частях.
Если вас не интересует мои переводы и дополнения, можете смело переходить сразу к пятой части, там можно найти информацию о том, где получить всю необходимую информацию по данному вопросу.
Если вы видите ссылки в названии какой-либо структуры или функции, можете открыть её в новой вкладке, так вы сможете попасть непосредственно на описание данной структуры/функции в официальной документации к ядру Linux.
Ошибки
Я не волшебник, я только учусь. Если найдёте какие-либо ошибки или неточности, пожалуйста, сообщите мне.
1. Что такое SPI?
Аббревиатура SPI означает «Serial Peripheral Interface» или в русском варианте «последовательный периферийный интерфейс». Название говорит само за себя, данный интерфейс используется для работы с различными периферийными устройствами. Например, это могут быть различные ЦАП/АЦП, потенциометры, датчики, расширители портов ввода/вывода (GPIO), различная память и даже более сложная периферия, такая как звуковые кодеки и контроллеры Ethernet.
С технической точки зрения SPI — это синхронная четырёхпроводная шина. Она представляет собой соединение двух синхронных сдвиговых регистров, которые является центральным элементом любого SPI устройства. Для соединения используется конфигурацию ведущий/ведомый. Только ведущий может генерировать импульсы синхронизации. В схеме всегда только один ведущий (в отличие от той же шины I2C, где возможен вариант с более чем одним ведущим), количество ведомых может быть различно. В общем случае выход ведущего соединяется со входом ведомого, и наоборот, выход ведомого соединяется со входом ведущего. При подаче импульсов синхронизации на выход SCK, данные выталкиваются ведущим с выхода MOSI, и захватываются ведомым по входу MISO. Таким образом если подать количество импульсов синхронизации соответствующее разрядности сдвигового регистра, то данные в регистрах обменяются местами. Отсюда следует что SPI всегда работает в полнодуплексном режиме. А вот нужны ли нам данные, полученные от устройства при записи какого-либо параметра, это уже другой вопрос. Часто бывает что данные полученные от устройства при записи в него данных являются мусором, в таком случае их просто игнорируют, но мы их получим вне зависимости от нашего желания.
Контроллер SPI, как правило, реализуется периферийным блоком в MCU или eMPU. В большинстве чипов он может работать как в режиме ведущего, так и в режиме ведомого. Но на данный момент Linux поддерживает только режим ведущего (Master).
Существует несколько способов включения SPI устройств.
Простейший из них вы видите на рисунке выше (спасибо Wikipedia за рисунки под свободной лицензией GFDL). В данном случае к ведущему все ведомые подключаются параллельно, за исключением сигнала выбора ведомого (
CS). Для каждого ведомого необходим отдельный сигнал выбора ведомого (на рисунке они обозначены как SSx). Для сигналов выбора ведомого могут использоваться как специально предназначенные для этого выходы SPI-контроллера, так и порты ввода/вывода общего назначения (GPIO) микроконтроллера.
Два проводника используются для передачи данных, один для подачи тактовых импульсов и по одному сигналу выбора ведомого для каждого из ведомых.
Описание используемых сигналов:
- MOSI — Master Output, Slave Input (выход ведущего, вход ведомого). Данный сигнал предназначен для последовательной передачи данных от ведущего к ведомому. Также может называться SDO, DO и т.п.
- MISO — Master Input, Slave Output (вход ведущего, выход ведомого). Данный сигнал предназначен для последовательной передачи данных от ведомого к ведущему. Может называться SDI, DI и т.п.
- SCK — Serial Clock (сигнал синхронизации). Используется для синхронизации при передаче данных. Также может иметь название SCLK, CLK и др.
- CPOL (Clock Polarity) — определяет начальный уровень (полярность) сигнала синхронизации.
CPOL=0 показывает, что сигнал синхронизации начинается с низкого уровня, так что передний фронт является нарастающим, а задний — падающим.
CPOL=1, сигнал синхронизации начинается с высокого уровня, таким образом передний фронт является падающим, а задний — нарастающим. - CPHA (Clock Phase) — фаза синхронизации, определяет по какому из фронтов синхронизирующего сигнала производить выборку данных.
CPHA=0 показывает что необходимо производить выборку по переднему фронту, а
CPHA=1 показывает что выборку данных необходимо производить по заднему фронту.
Эти два бита и образуют номер режима. CPOL является старшим битом, а CPHA — младшим. Иногда в документации к устройству явно не указывают номер режима, но его всегда можно легко определить по временным диаграммам. Также важно понимать, что выборка и установка данных всегда происходят по противоположенным фронтам синхронизирующего сигнала. Например, пусть наше устройство работает в режиме 0 (наиболее распространённый вариант), в таком случае ведомое устройство будет считывать бит данных со входа MOSI по переднему нарастающему фронту синхронизирующего сигнала, а ведущее устройство будет считывать данные от ведомого на входе MISO также по переднему нарастающему фронту. Для большей наглядности я приведу осциллограммы для всех четырёх режимов работы:
На этом рисунке показаны сигналы MOSI (синяя линия) и SCK (жёлтая линия). Во всех случаях передаётся число 0x64. Светлые вертикальные линии показывают момент выборки данных. Рассмотрим режим 2, для которого, как мы помним, CPOL=1, а CPHA=0. Таким образом мы видим что синхронизирующий сигнал изначально имеет высокий уровень, а выборка производится по переднему фронту (в данном случае спадающему). Так как осциллограф у меня имеет только два канала, сигналы
CS и MISO не показаны. Но в данном случае они не так интересны, например, сигнал
CS представляет собой просто «провал» на всём протяжении передачи данных.
2. Обзор SPI подсистемы в Linux
Драйверы SPI в Linux делятся на две части. Первая — это драйверы SPI контроллеров, которые работают непосредственно с железом конкретно взятого контроллера. Такие драйверы определяют как настроить контроллер, какие действия предпринять при переходе в режим пониженного энергопотребления (suspend) и выходе из него(resume), выбор следующей передачи (spi_transfer) из очереди передач в сообщении (spi_message, об очередях чуть ниже) и отправка его непосредственно в порт, также определяется как активировать/деактивировать конкретное устройство посредством CS (функции cs_activate/cs_deactivate). В этой статье я не буду описывать данный тип драйверов. Как правило, они уже реализованы для тех MCU/eMPU на которые существует порт Linux, и лезть в них руками надо только в том случае, если вам нужна какая-то специфичная функция, вроде Chip Select Decoding, для возможности активации нужного ведомого устройства посредством внешней логики. Иногда это бывает полезно, например, в случае недостатка GPIO.
Вторая часть — это протокольные драйверы, используемые для работы с различными ведомыми устройствами, которые подключены к шине SPI. Данные драйверы называют «протокольными», потому что они лишь отправляют и получают различные данные от ведомых устройств, при этом не работая напрямую с каким-либо оборудованием. Именно данный тип драйверов нам наиболее интересен, так как позволяет добавить поддержку интересующего ведомого устройства в систему, его то мы и рассмотрим.
Большинство протокольных драйверов представляет собой модули ядра. Например, если устройство представляет собой аудиокодек подключаемый по SPI, то драйвер будет также использовать функции предоставляемые ALSA, а программы (например, madplay) смогут работать с ним посредством символьного устройства /dev/audio, не имея ни малейшего понятия о том как он аппаратно устроен и к какой шине подключен.
Также ядро предоставляет протокольный драйвер общего назначения, называемый spidev, с интерфейсом в виде символьного устройства. Он позволяет совершать полудуплексные обращения к ведомому SPI-устройству посредством стандартных системных вызовов read() и write(), устанавливать режим работы, а также производить полнодуплексный обмен данными посредством ioctl() вызовов.
Таким образом протокольные драйверы для SPI устройств можно разделить на два типа:
- userspace драйверы, работающие в пространстве пользователя и представляющие собой обычные программы на любом языке, работающие с SPI устройством посредством чтения/записи соответствующего символьного устройства spidev.
- драйверы, работающие в пространстве ядра и предоставляющие интерфейс для userspace посредством файлов устройств в каталоге /dev, либо с помощью атрибутов в каталоге устройства в sysfs.
Все обращения к SPI устройствам Linux ставит в очередь. Протокольные драйверы SPI оперируют явно или не явно сообщениями представленными структурой struct spi_message, которая является мультисегментной SPI транзакцией.
transfers — связанный список передаваемых сегментов в транзакции (передач);
spi — указатель на spi устройство, в очереди которого стоит данное сообщение;
is_dma_maped — если данный флаг «истина», то предоставлены оба, dma и cpu виртуальные адреса для каждого буфера передачи;
complete — обратный вызов, вызываемый для извещения об окончании транзакции;
context — аргумент для обратного вызова complete();
actual_length — полное число байт, которые были переданы во всех успешных предачах;
status — 0 в случае успеха, либо отрицательное значение с errno в случае ошибки;
Структура spi_message используется для выполнения атомарной последовательности передач данных, каждая из которых представлена структурой spi_transfer. Последовательность передач «атомарна» в том смысле, что шина SPI не может быть использована для передачи другого сообщения spi_message до тех пор, пока не будет полностью отправлено предыдущее. На некоторых системах, многие такие последовательности могут быть выполнены как единая запрограммированная DMA передача. На всех системах данные сообщения ставятся в очередь, и могут быть завершены уже после транзакций с другими устройствами. Все обращения к отдельно взятому ведомому устройству всегда выполняются в FIFO порядке.
Структура struct spi_transfer описывает отдельную передачу в связанном списке сообщения и определяет пару буферов для чтения/записи.
tx_buf — указатель на буфер данных в пространстве памяти ядра, которые необходимо передать, либо NULL;
rx_buf — указатель на буфер данных в пространстве памяти ядра, в который данные следует считать, либо NULL;
len — размер буферов rx и tx в байтах;
tx_dma — DMA адрес tx_buf, используется если установлен параметр spi_message.is_dma_mapped;
rx_dma — DMA адрес rx_buf, используется если установлен параметр spi_message.is_dma_mapped;
speed_hz — устанавливает скорость для передачи, отличную от установленной по-умолчанию для устройства. Если данное значение равно 0, то используется скорость по-умолчанию, указанная в поле max_speed_hz структуры spi_device.
bits_per_word — устанавливает количество бит на слово, отличное от определённого по умолчанию. Если данное значение равно 0, то используется значенние по-умолчанию, указанное в поле bits_per_word структуры spi_device.
delay_usecs — время ожидания в микросекундах, после того как был отправлен последний бит передачи и перед тем как сменить состояние chipselect’а, либо начать передачу следующей передачи в очереди. Будьте крайне осторожны с данным параметром, нужно смотреть в какой части драйвера контроллера реализуется задержка. Например, для чипов серии at91 она реализована в обработчике прерывания, так что её использование чревато последствиями.
При инициализации структуры spi_transfer существует очень важный момент, они обязательно должны быть выделены в области памяти доступной для DMA через kmalloc, kzalloc и иже с ними. Если master-драйер использует dma, то при использовании статически объявленных массивов драйвер будет падать при попытке передачи.
При передаче данных по SPI количество записанных бит всегда равно количеству считанных. Протокольные драйверы всегда должны предоставлять указатели на буферы tx_buf и/или rx_buf. В некоторых случаях они могут предоставлять DMA адреса для передаваемых данных.
Возможность переопределения скорости передачи данных и количества бит на слово для каждой передачи в отдельности зависит от конкретной реализации драйвера и аппаратных возможностей контроллера. Например, для контроллера SPI в чипах серии at91 возможность переопределения полей speed_hz и bits_per_word не предусмотрена, поэтому они должны быть всегда установлены в 0, иначе вы получите ошибку при попытке передачи данных.
Если указатель на tx_buf установлен как NULL, то SPI контроллер будет выталкивать нули при заполнении буфера rx_buf. В случае, когда rx_buf установлен в NULL, считываемые данные будут игнорироваться. Количество выталкиваемых (и захватываемых) байтов всегда равно len. Попытка вытолкнуть только часть слова приведёт к ошибке. (Например, при попытке выталкивании трёх байт и длине слова 16 бит или 20 бит, в первом случае будет использовано 2 байта на слово, во втором — 4 байта).
Данные для передачи всегда хранятся в порядке специфичном для данной аппаратной платформы. При отправке/считывании данных происходит автоматическое конвертирование порядка байт из специфичного для SPI (обычно big-endian, за исключением случая когда выставлен параметр SPI_LSB_FIRST) в аппаратно-специфичный порядок для данного CPU. Например, если параметр bits_per_word равен 16, то буферы будут занимать по 2N байт, и содержать по N слов с длиной 16 бит каждое, хранящемся в байтовом порядке, специфичным для данного CPU.
В том случае, если размер слова не является степенью двойки, то представление слова в памяти включает дополнительные биты. Слова, хранящиеся в памяти для протокольного драйвера всегда являются выровненными по правому краю (right-justified), так что дополнительные биты всегда будут являться старшими разрядами.
Для наглядности снова приведу осциллограмму:
В данном случае tx-буфер содержит значение 0xf98e, установленное значение bits_per_word соответствует 12 битам на слово. Устройство работает в SPI_MODE_0. На рисунке синяя линия соответствует выходу MOSI контроллера, а жёлтая — SCK. Здесь хорошо видно что при отправке пришло только 0x098e, старшие четыре бита были отброшены, так как они считаются дополнительными. Если совсем просто, то одно 12-битное слово занимает в памяти два байта, а разница между размером слова в памяти и его действительным размером составляет 2*8 — 12 = 4 бита, которые отбрасываются при передаче.
Все SPI передачи начинаются с активации соответствующего chipselect’а. Обычно ведомое устройство остаётся активным до ухода последней передачи в сообщении. Драйвера могут изменять состояние cs посредством флага cs_change в структуре spi_transfer.
- Если передача не последняя в сообщении, то флаг cs_change используется для того, чтобы chipselect на короткое время стал неактивным в середине сообщения. Такое переключение cs может быть необходимо для завершения команды ведомого. Это позволяет с помощью одного spi_message выполнять сразу группу передач для одного ведомого.
- Когда передача является последней в сообщении, ведомый может оставаться выбранным до тех пор, пока не начнётся передача следующего сообщения. Начало передачи сообщения другому устройству деактивирует текущий cs. Для работы некоторых устройств транзакции должны состоять из очереди spi_message сообщений, где содержимое последующего сообщения зависит от результата предыдущих. В таком случае транзакция целиком завершается переведением cs в неактивное состояние.
Код, который передаёт spi_message (и его spi_transfer’ы) на нижние уровни отвечает за управление памятью данных структур. Все поля структур не определённые явно, должны быть инициализированы нулевым значением. После отправки сообщения (и отдельных передач в нём), необходимо игнорировать последующие сообщения до тех пор, пока не отработает обратный вызов завершения данного сообщения.
SPI не поддерживает какого-либо механизма автоматического обнаружения устройств. К тому же, в большинстве случаев, SPI устройства не предусматривают горячее подключение/отключение, поэтому они, как правило, просто распаиваются непосредственно на плате. В связи с этим данные устройства считаются специфичными для конкретной платы (board-specific). Параметры для таких устройств указываются в файле платы: arch/. /mach-*/board-*.c.
Например, вот так будет выглядеть установка параметров для аудиокодека tlv320aic23b для отладочной платы SK-AT91SAM9260:
где modalias – название драйвера ядра, отвечающего за обслуживание устройства (в нашем случае “tlv320aic23b”);
chip_select – номер соответсвующего chip select’а;
max_speed_hz – максимальная частота в Гц;
mode – режим SPI, определяемый константами SPI_MODE_0… SPI_MODE_3, также через операцию битового “или” могут быть добавлены флаги SPI_CS_HIGH (устанавливает активным высокий уровень для chipselect-а ), SPI_NO_CS (передача данных без активации CS в принципе). Полный список возможных флагов можно посмотреть в описании структуры spi_device;
bus_num – номер шины (как правило, соответсвует номеру SPI контроллера в даташите на MCU/eMPU).
Также структура spi_board_info содержит следующие поля, не инициализированные в примере выше:
const void *platform_data – данное поле предназначено для хранения указателя на данные специфичные для конкретного драйвера;
void *controller_data – для некоторых контроллеров необходима информация о настройке устройства, например, DMA;
int irq – зависит от подключения устройства.
Все поля структуры spi_board_info устанавливают соответствующие поля структуры spi_device.
В случае необходимости установки параметров для других SPI устройств, в масив добавляются ещё аналогичые элементы.
Данные структуры хранят информацию, которая не может быть всегда определена драйверами. Информация, которая может быть определена функцией probe() драйвера (например, количество бит на слово), в данную структуру не включается.
Стоит заметить, что всё же существует возможность горячего подключения ведомых SPI устройств. В этом случае используют функцию spi_busnum_to_master() для получения указателя на структуру spi_master по номеру шины SPI и дальнейшего перебора устройств на шине. Но данная тема выходит за рамки данной статьи.
- Свежие записи
- Нужно ли менять пружины при замене амортизаторов
- Скрипят амортизаторы на машине что делать
- Из чего состоит стойка амортизатора передняя
- Чем стянуть пружину амортизатора без стяжек
- Для чего нужны амортизаторы в автомобиле
🎥 Видео
SPI интерфейс в микроконтроллерах AVRСкачать
Интерфейсы :: SPI :: Часть 1:: Общие сведенияСкачать
STM32. Урок 20. SPI. Serial Peripheral InterfaceСкачать
Impedance Requirements: SPI vs. USBСкачать
Программирование МК STM32. УРОК 23. HAL. SPI. Сдвиговый регистр 74HC595Скачать
Программирование МК AVR. УРОК 33. Часть 1. SPI. Карта SDСкачать
Что означает маркировка на шинах! Значение цифр и букв на резине.Скачать
2020Весна ЦУиМП Шины RS485, RS422, SPI, I2SСкачать
Выбор оборудования и работа со светодиодными лентами с SPI (ws2815, ws2811, SK6822, UCS8903 и др.)Скачать
Как считать размер шин. Расчёт и расшифровка размеров и обозначений.Скачать
2. SPI- и I2C-интерфейсыСкачать
I2C and SPI on a PCB Explained!Скачать
Подключение SD к SPI с DMA STM32 без HAL: регистры, LL - код меньше, программа быстрее. STM32CubeIDEСкачать
Индекс скорости и Индекс нагрузки - что это такое?Скачать
Изучаем STM32F103: Передача по SPI с использованием библиотеки HAL и DMA || Батарон№12Скачать