Краткий ответ: посмотрите, можете ли вы использовать CircuitPython и его драйверы для MAX31865.
Длинный ответ: куча всего. Я подозреваю, что вы следовали руководству Adafruit для MAX31855, но его интерфейс SPI сильно отличается от MAX31865.
В вашем SPI-соединении отсутствует контакт SDI
. Вам необходимо подключить его, так как связь двунаправленная. Кроме того, я предлагаю использовать распиновку SPI по умолчанию на стороне ESP32, как описано в документация micropython для ESP32.
В стартапе SPI, похоже, чего-то не хватает. При просмотре документации SPI для обращения к machine.SPI()
необходимо, чтобы вы присвоить значения аргументам sck
, mosi
, miso
. Вероятно, это будут контакты на стороне ESP32, к которым вы подключили SCLK
, SDI
, SDO
на MAX31865 (обратите внимание, что mosi означает главный выход, подчиненный вход, а мисо - главный вход, подчиненный выход).
Сигнал выбора микросхемы на MAX инвертирован (это то, что означает строка над входом CS
в таблице данных). Вы должны установить его низким, чтобы активировать чип, и высоким, чтобы отключить его.
Вы не можете просто считывать данные с чипа, у него есть протокол, которому вы должны следовать. Сначала вы должны запросить преобразование температуры в сопротивление микросхемы. В техническом описании вашего чипа объясняется, как это сделать. страница 13 (новичку немного сложно читать, но все равно попробуйте, поскольку это авторитетный источник информации для этого чипа). На высоком уровне это работает так:
- Запишите в регистр конфигурации значение, которое инициирует преобразование.
- Дождитесь завершения преобразования.
- Считайте данные из регистров RTD (Resistance-To-Digital), чтобы получить результат преобразования.
- Рассчитайте значение температуры по результату преобразования.
Код может быть ближе к этому (не протестирован и, скорее всего, не сработает с места в карьер, но он должен передать идею):
import ubinascii, time
from machine import Pin, SPI
cs = Pin(15, Pin.OUT)
# Assuming you've rewired according to default SPI pinout
spi = machine.SPI(1, baudrate=100000, polarity=0, phase=0, sck=Pin(14), mosi=Pin(13), miso=Pin(12))
# Enable chip
cs.off()
# Prime a 1-shot read by writing 0x40 to Configration register 0x00
spi.write(b'\x00\x40')
# Wait for conversion to complete (up to 66 ms)
time.sleep_ms(100)
# Select the RTD MSBs register (0x01) and read 1 byte from it
spi.write(b'\x01')
msb = spi.read(1)
# Select the RTD LSBs register (0x02) and read 1 byte from it
spi.write(b'\x02')
lsb = spi.read(1)
# Disable chip
cs.on()
# Join the 2 bytes
result = msb * 256 + lsb
print(ubinascii.hexlify(result))
Преобразуйте результат в температуру в соответствии с разделом «Преобразование значений регистра данных RTD в температуру» в таблице данных.
Боковое примечание 1: здесь spi = machine.SPI(1, baudrate=5000000, polarity=0, phase=0)
вы настроили скорость передачи данных 5 МГц, которая является максимальной для этого чипа. В зависимости от того, как вы подключили свои устройства, это может не сработать. Протокол SPI является синхронным и управляется главным устройством, поэтому вы можете установить любую скорость передачи данных, какую захотите. Начните с гораздо более низкого значения, может быть, 100 кГц или около того. Увеличьте это после того, как вы выяснили, как разговаривать с чипом.
Боковое примечание 2: если вы хотите, чтобы результат преобразования был быстрее, чем сон в 100 мс в моем коде, подключите линию DRDY
от MAX к ESP32 и подождите, пока она не станет низкой. Это означает, что преобразование завершено, и вы можете сразу прочитать результат.
person
Tarmo
schedule
26.02.2021