Что делает этот код Arduino?

Я понимаю, что делает большинство из этого, однако,

    if (digitalRead(miso)) {      d |= 1;    }

Это линия, которую я не понимаю. Этот код взят из библиотеки Adafruit MAX31855, которая используется для плат Arduino. Я пытаюсь перенести код на мой C8051F020 MCU в c. Этот код считывает данные с термопары, и MAX31855 является цифровым интерфейсом к MCU. Вот весь код этого файла. Я не знаком с digitalRead(), Выражение if, опубликованное выше, — это то, где я не могу интерпретировать. Это если заявление в uint32_t Adafruit_MAX31855::spiread32(void) функция.

        /***************************************************
This is a library for the Adafruit Thermocouple Sensor w/MAX31855K

Designed specifically to work with the Adafruit Thermocouple Sensor
----> https://www.adafruit.com/products/269

These displays use SPI to communicate, 3 pins are required to
interface
Adafruit invests time and resources providing this open source code,
please support Adafruit and open-source hardware by purchasing
products from Adafruit!

Written by Limor Fried/Ladyada for Adafruit Industries.
BSD license, all text above must be included in any redistribution
****************************************************/

#include "Adafruit_MAX31855.h"#include <avr/pgmspace.h>
#include <util/delay.h>
#include <stdlib.h>Adafruit_MAX31855::Adafruit_MAX31855(int8_t SCLK, int8_t CS, int8_t MISO) {
sclk = SCLK;
cs = CS;
miso = MISO;

//define pin modes
pinMode(cs, OUTPUT);
pinMode(sclk, OUTPUT);
pinMode(miso, INPUT);

digitalWrite(cs, HIGH);
}double Adafruit_MAX31855::readInternal(void) {
uint32_t v;

v = spiread32();

// ignore bottom 4 bits - they're just thermocouple data
v >>= 4;

// pull the bottom 11 bits off
float internal = v & 0x7FF;
internal *= 0.0625; // LSB = 0.0625 degrees
// check sign bit!
if (v & 0x800)
internal *= -1;
//Serial.print("\tInternal Temp: "); Serial.println(internal);
return internal;
}

double Adafruit_MAX31855::readCelsius(void) {

int32_t v;

v = spiread32();

//Serial.print("0x"); Serial.println(v, HEX);

/*
float internal = (v >> 4) & 0x7FF;
internal *= 0.0625;
if ((v >> 4) & 0x800)
internal *= -1;
Serial.print("\tInternal Temp: "); Serial.println(internal);
*/

if (v & 0x7) {
// uh oh, a serious problem!
return NAN;
}

// get rid of internal temp data, and any fault bits
v >>= 18;
//Serial.println(v, HEX);

// pull the bottom 13 bits off
int16_t temp = v & 0x3FFF;

// check sign bit
if (v & 0x2000)
temp |= 0xC000;
//Serial.println(temp);

double centigrade = v;

// LSB = 0.25 degrees C
centigrade *= 0.25;
return centigrade;
}

uint8_t Adafruit_MAX31855::readError() {
return spiread32() & 0x7;
}

double Adafruit_MAX31855::readFarenheit(void) {
float f = readCelsius();
f *= 9.0;
f /= 5.0;
f += 32;
return f;
}

uint32_t Adafruit_MAX31855::spiread32(void) {
int i;
uint32_t d = 0;

digitalWrite(sclk, LOW);
_delay_ms(1);
digitalWrite(cs, LOW);
_delay_ms(1);

for (i=31; i>=0; i--)
{
digitalWrite(sclk, LOW);
_delay_ms(1);
d <<= 1;
if (digitalRead(miso)) {
d |= 1;
}

digitalWrite(sclk, HIGH);
_delay_ms(1);
}

digitalWrite(cs, HIGH);
//Serial.println(d, HEX);
return d;
}

2

Решение

DigitalRead

Считывает значение с указанного цифрового вывода, ВЫСОКОЕ или НИЗКОЕ.


MISO (Master In Slave Out): вход регистра сдвига Мастера и выход регистра сдвига Ведомого.

Обзор SPI


| является побитовым оператором ИЛИ.

d |= 1 это сокращенное обозначение для

d = d | 1

Этот код устанавливает последний бит d до 1, если условие верно.


Итак, что вы делаете, это читаете выходные данные ведомого регистра, и если он равен 1, он устанавливает последний бит d 1. Прямо перед этой линией она сдвигается d оставил один бит с d <<= 1;, И это происходит в цикле:

  • сдвиг d осталось 1 бит
  • Читайте мисо, если это 1установите наименее значимый бит d в 1,
  • повторение
8

Другие решения

MISO — это вывод Master In / Slave Out на шине SPI. В этом коде вы играете роль Мастера, так что это булавка, с которой вы читаете ввод от ведомого. d | = 1 — это просто установка последнего бита в d на 1, если он читает 1 из ведомого устройства (и все остальные биты не будут затронуты). На каждой итерации последний бит (LSB) d устанавливается в 1, если он читает 1, а затем в начале следующей итерации сдвигает d влево.

2

У меня нет опыта работы с этим API, однако …

Если вы просматриваете digitalRead () документация, все, что делает функция — читает бит на выводе, который вы указываете в качестве аргумента. Возвращает либо HIGH или же LOW,

Итак, в основном, что я вижу: если miso бит включен, сделать первый бит в d на.

0
По вопросам рекламы [email protected]