Я ссылаюсь этот сообщение для подключения к 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-битная) выглядит следующим образом:
Диаграмма связи SPI для MCP3208 (12-битная) выглядит следующим образом:
Таким образом, первый байт, который я посылаю (для одностороннего измерения канала 0), должен быть 00000110, второй байт должен быть 00000000, а третий также может быть 00000000.
Как я могу изменить приведенный выше пример кода, чтобы отразить эту информацию, включая изменение чтения и объединения байтов данных [x]?
Путем программирования культового груза и большого количества проб и ошибок я обнаружил, что это работает для меня:
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))
Других решений пока нет …