SPI чтение 16 bit одним пакетом

AntonULN
Offline
Зарегистрирован: 21.03.2018
Всем привет, хотелось подключить датчик (энкодер EMS22A50) который работает по шине SSI это почти SPI, НО! есть проблема нужно принимать пакет из 16 bit..
 
ВОПРОС: кто может подсказать как настроить на arduino (может на DUE есть) прием 16 битных пакетов?
andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

А в чем проблема то?

У SPI нет заголовка либо чего-то, что могло бы как-то ограничивать длину пакета.

AntonULN
Offline
Зарегистрирован: 21.03.2018

Разве по умолчанию SPI не настроен на передачу 8 bit ?..и если это так, то для принятия 16 бит необходимо  после 8 бит «передернуть» SS?  но при этом потеряется пару бит ..

mixail844
Offline
Зарегистрирован: 30.04.2012

AntonULN пишет:

Разве по умолчанию SPI не настроен на передачу 8 bit ?..и если это так, то для принятия 16 бит необходимо  после 8 бит «передернуть» SS?  но при этом потеряется пару бит ..

https://www.arduino.cc/en/Reference/SPITransfer 

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

AntonULN пишет:

Разве по умолчанию SPI не настроен на передачу 8 bit ?..и если это так, то для принятия 16 бит необходимо  после 8 бит «передернуть» SS?

Зачем?

SS, если используется единственное устройство, можно вообще запаять на землю. Более того, существуют устройства, у которых в принципе нет входа SS, но при этом которые способны рабоать по SPI.

Не надо изобретать лишние сложности.

AntonULN
Offline
Зарегистрирован: 21.03.2018

andriano, про SS все верно, перемудрил.. но все же регистр приема/передачи у 8 bit AVR: SPDR имеет всего 8 bit  (а у DUE вроде как 16bit) так, что пока вопросы еще есть..

mixail844, спасибо за инфу, придут энкодеры буду пробовать..

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

AntonULN, это говорит лишь о том, что нелшьзя передать меньше 8 бит. Ну, например, датчику нужно 11 бит, а передавать приходится все 16.

a5021
Offline
Зарегистрирован: 07.07.2013

Не совсем так. Есть SPI-устройства, экраны, например, для которых битность имеет значение. У тех же STM32 в новых сериях для таких случаев битность можно задавать произвольным образом от 8 до 16 бит.

Волшебник
Offline
Зарегистрирован: 22.12.2016

AntonULN пишет:

Разве по умолчанию SPI не настроен на передачу 8 bit ?..и если это так, то для принятия 16 бит необходимо  после 8 бит «передернуть» SS?  но при этом потеряется пару бит ..

Тоже так подумал, что при 2 МГц тактовой ардуино не успеет 8-бит умыкнуть. Потом на картинку посмотрел, ардуино мастер на шине, такты она сама выдаёт и паузу после первой 8-ки битов ей никто не запретит. Тупой енкодер будет вынужден ждать всех 16-тактов или сброса СС. 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Странно это.

У меня и на 4 МГц все прекрасно работает (Мега 2560).

Волшебник
Offline
Зарегистрирован: 22.12.2016

andriano пишет:

Странно это.

У меня и на 4 МГц все прекрасно работает (Мега 2560).

А Мега кем, слэйвом? Мастером и на 8 проблем не должно быть, а слэйву надо 3-5 тактов перенести баит из приёмного регистра в память.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

В Arduino SPI поддерживается только режим master. https://www.arduino.cc/en/Reference/SPI

Волшебник
Offline
Зарегистрирован: 22.12.2016

А в дата шите на 328-ю сказано:

19.2
Full-duplex, Three-wire Synchronous Data Transfer
Master or Slave Operation
LSB First or MSB First Data Transfer
Seven Programmable Bit Rates
End of Transmission Interrupt Flag
Write Collision Flag Protection
Wake-up from Idle Mode
Double Speed (CK/2) Master SPI Mode
 
 
andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

А Вы понимаете разницу между 328 и Ардуино?

Волшебник
Offline
Зарегистрирован: 22.12.2016

А кто вам сказал, что использование интегрированных библиотек в ардуино ИДЕ обязательно? 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Ну тогда вопрос ТС теряет смысл.

Да и про нестандартные библиотеки никто, вроде, не упоминал.

AntonULN
Offline
Зарегистрирован: 21.03.2018

Волшебник: Из выше сказанного можно сделать вывод, что "тупо" использование стандартной библиотеки не даст arduinе правильно считать 16 бит..?

Может у кого есть опыт по работе SPI в 16 битном варианте?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

AntonULN, Вы бы задавали конкретные вопросы.

Ардуино вполне способна "тупо" работать с 16-разрядными данными по SPI. Проблемы могут быть лишь с особенностями конктретного датчика, но об этом следует смотреть в его дэйташите.

Лично мне приходилось передавать по SPI 8-, 10-, 16- и 32-разрядные данные, и никаких проблем при этом не возникало. А если возникали - оперативно решались, но я не помню, чтобы хоть одна проблема была связана с разрядностью данных.

Т.е. вопрос "в общем" лишен смысла.

 

PS. Да, лично я использовать только стандартную библиотеку.

Волшебник
Offline
Зарегистрирован: 22.12.2016

Кроме того какая шина (SPI) ещё надо смотреть если датчик мастер или холоп. С холопом стандартная SPI библиотека ардуиновская будет читать сколько угодно байт, хоть 1000. Сложности могут быть с мастером-датчиком, как выяснилось, ардуино не поддерживает. Тогда процедура обычная:

1. Ищется готовый код для конкретного датчика в инэте;

2. Если нету, ищется готовый код для похожего по формату данных датчика, и адаптируется.

3. -//-, библиотека для ардуино, поддерживаючая не стандартные протоколы / скорости.

4. --//, когда совсем облом, пишется на ассемблере под ардуиновской ИДЕ - примеров полно в инэте.

В вашем случае, вариант 2, нету для конкретного энкодера, ищите какой угодно SPI-код 16-бит слэйв, хоть для АЦП хоть для чёрта лысого, с большой долей вероятности он подойдёт. Данные только "раскадрировать" по дата шиту на энкодер.  

a5021
Offline
Зарегистрирован: 07.07.2013

Волшебник пишет:
надо смотреть если датчик мастер или холоп.

Если переводить на отечественный понятийный аппарат, да с учетом культурных традиций, то тогда уж "барин или холоп". :)