Я пропущу объявление переменной, потому что я буду ссылаться на него в остальной части описания.
Код начинается с этой строки:
TI_ADS1293_SPIStreamReadReg(read_buf, count);
В поиске Google я предполагаю, что у вас есть эта функция из этого файла . Если это именно эта функция, она будет читать три регистра из этого модуля (см. 8.6 Карты регистров , регистры данных DATA_CHx_ECG
имеют длину три байта, что должно быть в переменной count
).
После выполнения этой функции у вас есть данные ЭКГ в первых трех байтах переменной read_buf
, но вам нужно 24-битное значение, так как квантифицированное значение является 24-битным значением.
Поскольку у нас нет uint24_t
в C (и нет другого языка, о котором я знаю), мы берем следующий возможный размер, который равен uint32_t
, чтобы объявить переменную adc_data
.
Теперь следующий код перестраивает одно 24-битное значение из 3 байтов, которые мы читаем из АЦП:
adc_data = ((uint32_t) read_buf[0] << 16) | ((uint16_t) read_buf[1] << 8)
| read_buf[2];
Из таблицы данных и TI_ADS1293_SPIStreamReadReg
мы знаем, что функция считывает значения в том порядке, в котором их адреса поступают, в данном случае старшие байты, средние байты и младшие байты в этом порядке (соответственно в read_but[0]
, read_buf[1]
и read_buf[2]
).
Чтобы восстановить 24-битное значение, код сдвигает значение с соответствующим смещением: read_buf[0]
идет от битов 23 к 16, таким образом сдвинуты 16 битов, read_buf[1]
от битов 15 к 8, таким образом сдвинуты 8 битов и read_buf[2]
от 7 до 0, таким образом, смещено 0 бит (это смещение не представлено). Мы представим их как таковые (0xAA
, 0xBB
и 0xCC
являются примерами значений, чтобы показать, что происходит):
read_buf[0] = 0xAA => read_buf[0] << 16 = 0xAA0000
read_buf[1] = 0xBB => read_buf[0] << 8 = 0x00BB00
read_buf[2] = 0xCC => read_buf[0] << 0 = 0x0000CC
Чтобы объединить три сдвинутых значения, код использует побитовый или |
, что приводит к следующему:
0xAA0000 | 0x00BB00 | 0x0000CC = 0xAABBCC
И теперь у вас есть 24-битное значение вашего АЦП.