Изменение кода spidev на С++ с 10-битного на 12-битное устройство

Я ссылаюсь на этот пост для подключения к 12-битному АЦП MCP3208. Связанный пост использует MCP3008, который является только 10-битным АЦП, поэтому отправка/получение данных SPI немного отличается.

Вот 10-битный код:

mcp3008Spi a2d("/dev/spidev0.0", SPI_MODE_0, 1000000, 8);
int a2dVal = 0;
int a2dChannel = 0;
unsigned char data[3];

data[0] = 1;  //  first byte transmitted -> start bit
data[1] = 0b10000000 |( ((a2dChannel & 7) << 4)); // second byte transmitted -> (SGL/DIF = 1, D2=D1=D0=0)
data[2] = 0; // third byte transmitted....don't care

a2d.spiWriteRead(data, sizeof(data) );

a2dVal = 0;
a2dVal = (data[1]<< 8) & 0b1100000000; //merge data[1] & data[2] to get result
a2dVal |=  (data[2] & 0xff);

cout << "The Result is: " << a2dVal << endl;

Диаграмма связи SPI для MCP3008 (10-бит) выглядит следующим образом:

MCP3008 10-битный АЦП SPI-коммуникации

Схема связи SPI для MCP3208 (12-бит) выглядит следующим образом:

MCP3208 12-разрядный АЦП SPI-коммуникации

Таким образом, первый байт, который я отправляю (для несимметричного измерения канала 0), должен быть 00000110, второй байт должен быть 00000000, а третий также может быть 00000000.

Как я могу изменить приведенный выше пример кода, чтобы отразить эту информацию, включая изменение чтения и слияния байтов данных [x]?


person jars121    schedule 04.03.2018    source источник


Ответы (2)


С помощью культового программирования и множества проб и ошибок я обнаружил, что это работает для меня:

import spidev

#                  [         Array of bytes sent             ]                                              
#rdata = spi.xfer2([Start, Config        ,stuffing ,?        ] , speed Hz , delay default 0 , wordlength )
rdata  = spi.xfer2([1    ,(8+channel)<<4 ,255      ,0        ] ,15000     ,0                , 8          )

#rdata is an Array of bytes received
a= (rdata[1]&3)  << 10 # binary AND with 3 -> only last two bits count,  <<shift left by 10 
b=  rdata[2]     <<2   # shift left by 2
c= (rdata[3]&192)>>6   # binary AND with 192 -> only fisrt two bits count, >>shift right by 6
data= a + b + c

print( "a:{}  b:{}  c:{} data:{} ".format(a,b,c,data))
person Mehlmann86    schedule 12.06.2018

Хотя это старый вопрос и определенно не связанный с тем, что я искал, я решил ответить на него, поскольку единственный ответ находится в Python и не отвечает на вопрос.

Реальный ответ на этот вопрос, насколько я вижу, заключается в том, что почти ничего не нужно менять. data[0] следует заменить на вашу команду. Чтобы объединить полученные байты, вам просто нужно расширить маску, используемую для младшего байта. Помимо этих изменений, все должно работать нормально.

Чтобы изменить команду:

data[0] = 0x06;

Чтобы объединить байты:

uint16_t val = 0;
val |= (data[1] & 0x0F) << 8;
val |= data[2];

Это старый вопрос, и я уверен, что ОП уже нашел ответ, но будущие читатели, ищущие аналогичную проблему, могут найти этот ответ полезным.

person Will Eccles    schedule 01.06.2021