Esp32 Micropython Max31865 Spi-соединение и чтение данных

Мне нужно прочитать данные о температуре с использованием связи MAX31865 SPI. Первым делом я попытался прочитать 4-х байтовые данные:

import machine
import ubinascii

spi = machine.SPI(1, baudrate=5000000, polarity=0, phase=0)

#baudrate controls the speed of the clock line in hertz.
#polarity controls the polarity of the clock line, i.e. if it's idle at a low or high level.
#phase controls the phase of the clock line, i.e. when data is read and written during a clock cycle
cs = machine.Pin(15, machine.Pin.OUT)
cs.off()


cs.on()
data = spi.read(4)
cs.off()


print(ubinascii.hexlify(data))

Я много раз пробовал с разными кодами, но результат всегда одинаковый b'00000000'.

Я использую ESP32 WROOM.

Я использовал эти булавки:

ESP32: D12 - D14 - 3V3 - GND - D15

Max31865: SDO - CLK - VIN - GND - CS

Я новичок в micropython и esp32.

Я не знаю, что мне делать. Есть ли какие-либо предложения, рекомендуемые уроки или идеи?


person noobinmath    schedule 26.02.2021    source источник


Ответы (1)


Краткий ответ: посмотрите, можете ли вы использовать 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 (новичку немного сложно читать, но все равно попробуйте, поскольку это авторитетный источник информации для этого чипа). На высоком уровне это работает так:

  1. Запишите в регистр конфигурации значение, которое инициирует преобразование.
  2. Дождитесь завершения преобразования.
  3. Считайте данные из регистров RTD (Resistance-To-Digital), чтобы получить результат преобразования.
  4. Рассчитайте значение температуры по результату преобразования.

Код может быть ближе к этому (не протестирован и, скорее всего, не сработает с места в карьер, но он должен передать идею):

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
comment
Благодарю за помощь в этом вопросе, большое вам спасибо. Собственно, когда я попробовал исправленный код, результат был таким же, возможно, из-за micropython и esp32. Должен ли я использовать circuitPython с ESP WROOM 32? - person noobinmath; 26.02.2021
comment
Мне нужно изучить spi и micropython, потому что после этого я должен написать код для этого - person noobinmath; 26.02.2021
comment
Что ж, заставить работать новое периферийное устройство всегда сложно. Сначала дважды и трижды проверьте свои соединения. Если возможно, купите или одолжите логический анализатор или цифровой осциллограф, подключите его к линиям SPI и убедитесь, что сигналы действительно попадают на провода. Перепроверьте протокол в таблице данных (я просмотрел его всего 5 минут, вероятно, что-то пропустил) и т. Д. - person Tarmo; 26.02.2021