SPI чтение 16 bit одним пакетом
- Войдите на сайт для отправки комментариев
Ср, 14/11/2018 - 09:11
Всем привет, хотелось подключить датчик (энкодер EMS22A50) который работает по шине SSI это почти SPI, НО! есть проблема нужно принимать пакет из 16 bit..
ВОПРОС: кто может подсказать как настроить на arduino (может на DUE есть) прием 16 битных пакетов?
А в чем проблема то?
У SPI нет заголовка либо чего-то, что могло бы как-то ограничивать длину пакета.
Разве по умолчанию SPI не настроен на передачу 8 bit ?..и если это так, то для принятия 16 бит необходимо после 8 бит «передернуть» SS? но при этом потеряется пару бит ..
Разве по умолчанию SPI не настроен на передачу 8 bit ?..и если это так, то для принятия 16 бит необходимо после 8 бит «передернуть» SS? но при этом потеряется пару бит ..
https://www.arduino.cc/en/Reference/SPITransfer
Разве по умолчанию SPI не настроен на передачу 8 bit ?..и если это так, то для принятия 16 бит необходимо после 8 бит «передернуть» SS?
Зачем?
SS, если используется единственное устройство, можно вообще запаять на землю. Более того, существуют устройства, у которых в принципе нет входа SS, но при этом которые способны рабоать по SPI.
Не надо изобретать лишние сложности.
andriano, про SS все верно, перемудрил.. но все же регистр приема/передачи у 8 bit AVR: SPDR имеет всего 8 bit (а у DUE вроде как 16bit) так, что пока вопросы еще есть..
mixail844, спасибо за инфу, придут энкодеры буду пробовать..
AntonULN, это говорит лишь о том, что нелшьзя передать меньше 8 бит. Ну, например, датчику нужно 11 бит, а передавать приходится все 16.
Не совсем так. Есть SPI-устройства, экраны, например, для которых битность имеет значение. У тех же STM32 в новых сериях для таких случаев битность можно задавать произвольным образом от 8 до 16 бит.
Разве по умолчанию SPI не настроен на передачу 8 bit ?..и если это так, то для принятия 16 бит необходимо после 8 бит «передернуть» SS? но при этом потеряется пару бит ..
Тоже так подумал, что при 2 МГц тактовой ардуино не успеет 8-бит умыкнуть. Потом на картинку посмотрел, ардуино мастер на шине, такты она сама выдаёт и паузу после первой 8-ки битов ей никто не запретит. Тупой енкодер будет вынужден ждать всех 16-тактов или сброса СС.
Странно это.
У меня и на 4 МГц все прекрасно работает (Мега 2560).
Странно это.
У меня и на 4 МГц все прекрасно работает (Мега 2560).
А Мега кем, слэйвом? Мастером и на 8 проблем не должно быть, а слэйву надо 3-5 тактов перенести баит из приёмного регистра в память.
В Arduino SPI поддерживается только режим master. https://www.arduino.cc/en/Reference/SPI
А в дата шите на 328-ю сказано:
А Вы понимаете разницу между 328 и Ардуино?
А кто вам сказал, что использование интегрированных библиотек в ардуино ИДЕ обязательно?
Ну тогда вопрос ТС теряет смысл.
Да и про нестандартные библиотеки никто, вроде, не упоминал.
Волшебник: Из выше сказанного можно сделать вывод, что "тупо" использование стандартной библиотеки не даст arduinе правильно считать 16 бит..?
Может у кого есть опыт по работе SPI в 16 битном варианте?
AntonULN, Вы бы задавали конкретные вопросы.
Ардуино вполне способна "тупо" работать с 16-разрядными данными по SPI. Проблемы могут быть лишь с особенностями конктретного датчика, но об этом следует смотреть в его дэйташите.
Лично мне приходилось передавать по SPI 8-, 10-, 16- и 32-разрядные данные, и никаких проблем при этом не возникало. А если возникали - оперативно решались, но я не помню, чтобы хоть одна проблема была связана с разрядностью данных.
Т.е. вопрос "в общем" лишен смысла.
PS. Да, лично я использовать только стандартную библиотеку.
Кроме того какая шина (SPI) ещё надо смотреть если датчик мастер или холоп. С холопом стандартная SPI библиотека ардуиновская будет читать сколько угодно байт, хоть 1000. Сложности могут быть с мастером-датчиком, как выяснилось, ардуино не поддерживает. Тогда процедура обычная:
1. Ищется готовый код для конкретного датчика в инэте;
2. Если нету, ищется готовый код для похожего по формату данных датчика, и адаптируется.
3. -//-, библиотека для ардуино, поддерживаючая не стандартные протоколы / скорости.
4. --//, когда совсем облом, пишется на ассемблере под ардуиновской ИДЕ - примеров полно в инэте.
В вашем случае, вариант 2, нету для конкретного энкодера, ищите какой угодно SPI-код 16-бит слэйв, хоть для АЦП хоть для чёрта лысого, с большой долей вероятности он подойдёт. Данные только "раскадрировать" по дата шиту на энкодер.
Если переводить на отечественный понятийный аппарат, да с учетом культурных традиций, то тогда уж "барин или холоп". :)