mlx90615 заставляет зависнуть ардуину

AltSobor
Offline
Зарегистрирован: 15.07.2020

Добрый день. У меня есть предположительно mlx90615. Прикол в том, что возможности достать отдельный датчик у меня не было, я для тестов взяла дешевый китайский ик-термометр dt8220 и  выдрала от туда ик-датчик, предварительно я все это дело прозвонила, сняла осцилограмму и по распиновке определила, что скорее всего это mlx90615). Теперь я воткнула это в плату и присоединила к ардуине. На родной плате все работало и до сих пор работает, хотя в первый раз я немного промахнулась с распиновкой и подавала питание не на те ноги. Сейчас есть другая проблема - при простой попытке прочитать адрес i2c ардуина просто виснет, данными на датчик она спамит, но ответа никакого не получает. я использовала вот эту штуку для того, чтоб посмотреть адрес:

#include "Wire.h"
void setup(){
    Wire.begin();
    Serial.begin(9600);
    while (!Serial);
    Serial.println("nI2C Scanner");
} 
 
void loop(){
    byte error, address;
    int nDevices;
 
    Serial.println("Scanning...");
 
    nDevices = 0;
    for(address = 8; address < 127; address++ ){
        Wire.beginTransmission(address);
        Serial.println(".");
        error = Wire.endTransmission();
 Serial.println(".");
        if (error == 0){
            Serial.print("I2C device found at address 0x");
            if (address<16)
                Serial.print("0");
            Serial.print(address,HEX);
            Serial.println(" !");
 
            nDevices++;
        }
        else if (error==4) {
            Serial.print("Unknown error at address 0x");
            if (address<16)
                Serial.print("0");
            Serial.println(address,HEX);
        } 
    }
    if (nDevices == 0)
        Serial.println("No I2C devices foundn");
    else
        Serial.println("donen");
 
    delay(5000);

Судя по нему она открывает сессию общения с i2c, но закрыть не может, поэтому сидит и ждет ответа. Может кто подскажет, как еще можно потестить i2c и что может быть с ним не так. По подтяжкам - я проставила все резисторы (4.7к к питанию) и кондеры. (0.1мк между питанием и землей).

sadman41
Offline
Зарегистрирован: 19.10.2016

MLX9061x работают не только в I2C, но и в PWM.

Проверить это можно подключением по схеме, которая приводится в разделе "10.3 PWM output" документа "MLX90615 Infra Red Thermometer"

Если по дефолту в них установлен режим PWM (Config register, bit 0), то в I2C они переключаются специальной процедурой.

AltSobor
Offline
Зарегистрирован: 15.07.2020

А есть какие-то косвенные признаки, что оно переключилось на i2c? Я сделала по инструкции из даташита, разницы при выполнении не вижу. + я анализатором чтото такое поймала. Тут как-то можно различить будет запрос с мк и ответ?

sadman41
Offline
Зарегистрирован: 19.10.2016

Подмигивать он явно не начнет после переключения.

15-го у меня нет, 14-й просто надо было за ногу подержать, а потом сразу, не снимая питания, работать как с I2C устройством. Во всяком случае - до логанализатора у меня дело не доходило. Была ерунда с SoftwarWire, но решилась обновлением библиотеки.

Единственное что - у 14-го несколько модификаций с разным напряжением питания имеется. Может и у 15-го так же и дело в этом?

В вашей софтине есть декодер I2C вроде - он что-то кажет?

AltSobor
Offline
Зарегистрирован: 15.07.2020

И +вопрос. У меня весть подтяжка к VDD, соответственно, если даже питания на scl нет, напряжение становиться не сильно меньше. При этой перезагрузке питание на scl должно вообще пропасть или просто вот так вот понизиться?

sadman41
Offline
Зарегистрирован: 19.10.2016
AltSobor
Offline
Зарегистрирован: 15.07.2020

sadman41 пишет:
В вашей софтине есть декодер I2C вроде - он что-то кажет?

кажет, что идети запрос на адрес i2c (с перебором на все 128) + некий NAK (пытаюсь нагуглить что это), ответа при этом ни в одном из случаев нет, судя по всему.

sadman41
Offline
Зарегистрирован: 19.10.2016

AltSobor пишет:

И +вопрос. У меня весть подтяжка к VDD, соответственно, если даже питания на scl нет, напряжение становиться не сильно меньше. При этой перезагрузке питание на scl должно вообще пропасть или просто вот так вот понизиться?

Если у вас SCL подтянуто к VCC (для I2C), то надо сделать OUTPUT+LOW на >39мс , тогда МК должен перетянуть вход к земле и на нём напряжение должно упасть (см. 8.5.1 PWM to SMBus mode). Затем отпускаете SCL переводом в INPUT и подтяжка возвращает на него VCC. Далее Wire.begin() и сканируйте адрес.