Добрый день.
Подключаю по I2C датчик давления MIS-3600-006DI к ESP32S3, CS подключен к GND.
Ни как не могу получить данные с датчика.
Не могу найти регистры для чтения давления и температуры.
Буду рад любой помощи.
За ранее всем спасибо.
ну так показывайте, как пытались.
Никак не пытались (вернее, “ни как”), нужна помощь в организации попытки ![]()
Мне одному это смешно?
Не обхохочись там, а то штаны промочишь.
Это выбор протокола.
CS connected to Device address
VDD 1110111
GND 1110110
Нужна помощь не в организации попытки, а конкретный правильный ответ.
Если не чего ответить, то не флуди тут.
Ты там что куришь? У тебя прямо в заголовке написано, что это SPI
Если хочешь получить конкретный ответ, спрашивай нормально. Покажи свою схему подключения (свою, а не из сети или мануала) и пример кода, как ты пытался читать регистры.
Ты не прав, при i2c, этот вывод задает адрес на шине.
Ты правда думаешь, что убрав упоминание СПИ на картинке, ты превратишь это подключение в I2c ?
У стандартного I2c, кроме питания, только два провода - scl и sda. А на твоей картинке их три.
И не подумай, что про схему и код с тобой шутят. Без них никто с тобой твои проблемы обсуждать не будет.
@xDrivеr, извини, друг, я ошибся, оказывается:
т.е. нехрен тут пытаться, просто конкретно распиши что и как делать (и не забывай, при этом, приветливо улыбаться).
А если “не чего” конкретно расписывать,
Питание датчика 3,3 вольта подключен. Плата ESP32-S3.
CS подключен на землю.
SDA_PIN 8
SCL_PIN 9
Датчик сканером нашел по адресу 0x76
Калибровочные коэффициенты успешно загружаю по адресам из даташита.
Reading coefficient C1 0Eh & 20h
Reading coefficient C2 0Eh & 28h
Reading coefficient C3 0Eh & 30h
Reading coefficient C4 0Eh & 38h
Reading coefficient C5 0Eh & 40h
Reading coefficient C6 0Eh & 48h
Reading coefficient C7 0Eh & 50h
Reading coefficient C8 0Eh & 58h
Reading coefficient C9 0Eh & 60h
Reading coefficient C10 0Eh & 68h
Reading coefficient C11 0Eh & 70h
Reading coefficient C12 0Eh & 78h
Reading coefficient C13 0Eh & 80h
В даташите также
Conversion start for pressure measurement(D1)For 5.8 & 15 psi 0Fh & 49h, For 0.5 & 1 psi 0Fh & 59h.
Conversion start for temperature measurement(D2)0Fh & 21h.
Но на это ответ приход везде 0.
Даташит сюда не загружается.
Положил в облако https://cloud.mail.ru/public/NqXX/PrVVvH3Fw
Код? Полностью!
#include <Wire.h>
#define SDA_PIN 8
#define SCL_PIN 9
#define PRESSURE_SENSOR_ADDRESS 0x76 // CS подключен к GND
float pressure = 0.0;
float temperature = 0.0;
bool sensorConnected = false;
byte foundSensorAddress = 0;
uint16_t C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13;
bool calibrationLoaded = false;
void setup() {
Serial.begin(115200);
while (!Serial) {
delay(10);
}
Wire.begin(SDA_PIN, SCL_PIN);
Wire.setClock(100000);
scanI2CDevices();
checkSensorConnection();
if (sensorConnected) {
identifySensor();
}
}
void loop() {
if (sensorConnected) {
readPressureData();
delay(2000);
} else {
checkSensorConnection();
delay(5000);
}
}
void scanI2CDevices() {
byte deviceCount = 0;
for (byte address = 1; address < 127; address++) {
Wire.beginTransmission(address);
byte error = Wire.endTransmission();
if (error == 0) {
if (address < 16) Serial.print("0");
Serial.print(address, HEX);
if (address == PRESSURE_SENSOR_ADDRESS) {
foundSensorAddress = address;
}
deviceCount++;
}
}
Serial.print(deviceCount);
Serial.println();
}
void checkSensorConnection() {
if (foundSensorAddress == 0) {
return;
}
Wire.beginTransmission(foundSensorAddress);
byte error = Wire.endTransmission();
if (error == 0) {
if (foundSensorAddress < 16) Serial.print("0");
Serial.println(foundSensorAddress, HEX);
sensorConnected = true;
} else {
Serial.println(error);
sensorConnected = false;
}
}
void identifySensor() {
initMIS3600();
}
void initMIS3600() {
loadCalibrationCoefficients();
if (calibrationLoaded) {
Serial.print("C1=");
Serial.print(C1);
Serial.print(", C2=");
Serial.print(C2);
Serial.print(", C3=");
Serial.print(C3);
Serial.println("...");
} else {
}
}
void loadCalibrationCoefficients() {
// Загружаем коэффициенты C1-C13
uint16_t coefficients[13];
byte commands[13][2] = {
{ 0x0E, 0x20 }, // C1
{ 0x0E, 0x28 }, // C2
{ 0x0E, 0x30 }, // C3
{ 0x0E, 0x38 }, // C4
{ 0x0E, 0x40 }, // C5
{ 0x0E, 0x48 }, // C6
{ 0x0E, 0x50 }, // C7
{ 0x0E, 0x58 }, // C8
{ 0x0E, 0x60 }, // C9
{ 0x0E, 0x68 }, // C10
{ 0x0E, 0x70 }, // C11
{ 0x0E, 0x78 }, // C12
{ 0x0E, 0x80 } // C13
};
int loadedCount = 0;
for (int i = 0; i < 13; i++) {
Wire.beginTransmission(foundSensorAddress);
Wire.write(commands[i][0]);
Wire.write(commands[i][1]);
Wire.endTransmission(false);
Wire.requestFrom((uint8_t)foundSensorAddress, (uint8_t)2);
if (Wire.available() >= 2) {
uint8_t msb = Wire.read();
uint8_t lsb = Wire.read();
coefficients[i] = (msb << 8) | lsb;
// Проверяем, что значение не стандартное
if (coefficients[i] != 0x8000 && coefficients[i] != 0xFFFF && coefficients[i] != 0x0000) {
Serial.print("C");
Serial.print(i + 1);
Serial.print(" (0x");
if (commands[i][0] < 16) Serial.print("0");
Serial.print(commands[i][0], HEX);
Serial.print(" 0x");
if (commands[i][1] < 16) Serial.print("0");
Serial.print(commands[i][1], HEX);
Serial.print("): 0x");
if (msb < 16) Serial.print("0");
Serial.print(msb, HEX);
if (lsb < 16) Serial.print("0");
Serial.print(lsb, HEX);
Serial.print(" (");
Serial.print(coefficients[i]);
Serial.println(")");
loadedCount++;
}
}
delay(10);
}
if (loadedCount > 0) {
C1 = coefficients[0];
C2 = coefficients[1];
C3 = coefficients[2];
C4 = coefficients[3];
C5 = coefficients[4];
C6 = coefficients[5];
C7 = coefficients[6];
C8 = coefficients[7];
C9 = coefficients[8];
C10 = coefficients[9];
C11 = coefficients[10];
C12 = coefficients[11];
C13 = coefficients[12];
calibrationLoaded = true;
Serial.println(loadedCount);
} else {
calibrationLoaded = false;
}
}
void readPressureData() {
if (foundSensorAddress == 0) {
return;
}
readMIS3600Working();
}
void readMIS3600Working() {
static uint16_t lastValue = 0;
static int staticCount = 0;
Wire.beginTransmission(foundSensorAddress);
Wire.write(0x0F);
Wire.write(0x49);
Wire.endTransmission();
delay(100);
Wire.beginTransmission(foundSensorAddress);
Wire.write(0x0F);
Wire.write(0x21);
Wire.endTransmission();
delay(100);
Wire.beginTransmission(foundSensorAddress);
Wire.write(0x60);
Wire.endTransmission(false);
Wire.requestFrom((uint8_t)foundSensorAddress, (uint8_t)2);
if (Wire.available() >= 2) {
uint8_t msb = Wire.read();
uint8_t lsb = Wire.read();
uint16_t rawValue = (msb << 8) | lsb;
if (rawValue != lastValue) {
Serial.print(lastValue);
Serial.print(rawValue);
staticCount = 0;
} else {
staticCount++;
if (staticCount % 10 == 0) {
Serial.print(staticCount);
}
}
lastValue = rawValue;
float pressure_kPa = (rawValue / 1000.0) * 100.0;
float temperature_C = (rawValue % 1000) / 10.0;
if (pressure_kPa < 0) pressure_kPa = 0;
if (pressure_kPa > 200) pressure_kPa = 200;
if (temperature_C < -50) temperature_C = -50;
if (temperature_C > 150) temperature_C = 150;
Serial.print("Raw: 0x");
if (msb < 16) Serial.print("0");
Serial.print(msb, HEX);
if (lsb < 16) Serial.print("0");
Serial.print(lsb, HEX);
Serial.print(" (");
Serial.print(rawValue);
Serial.print(") -> ");
Serial.print(pressure_kPa, 2);
Serial.print(" кПа, ");
Serial.print(temperature_C, 2);
Serial.println(" °C");
} else {
}
}
Вот это вот, по-моему, полная чушь, нет?
Во всяком случае, с даташитом не сходится.
Смотрим даташит - если Вы хотите послать сенсору запрос, например, на чтение температуры - вы должны послать ему команду 0x0F 0x21 и тут же прочитать в ответ два байта температуры.
А теперь смотрите, что у вас в коде - вы посылаете запрос на давление, ничего не читаете. Потом так же запрашиваете температуру и опять не читаете ответ. А потом шлете сенсору однобайтную команду 0x60(я такого вообще в даташите не нашел) и только тут начинаете читать ответы.
Так же формула преобразования полученных данных вообще непонятно откуда взята
Что-то я не увидел в даташите, чтобы данные температуры и давления возвращались в одном 16битном значении.
Но про это пока рано говорить, вы сначала получите от сенсора не_нулевые ответы, потом и за конверсию приметесь.
#include <Wire.h>
#define SDA_PIN 8
#define SCL_PIN 9
#define PRESSURE_SENSOR_ADDRESS 0x76 // CS подключен к GND
void setup() {
Serial.begin(115200);
while (!Serial) {
delay(10);
}
Wire.begin(SDA_PIN, SCL_PIN);
Wire.setClock(100000);
}
void loop() {
readPressureData();
delay(2000);
}
void readPressureData() {
// Читаем давление
Wire.beginTransmission(PRESSURE_SENSOR_ADDRESS);
Wire.write(0x0F);
Wire.write(0x49);
Wire.endTransmission();
delay(100);
Wire.beginTransmission(PRESSURE_SENSOR_ADDRESS);
Wire.write(0x60);
Wire.endTransmission(false);
Wire.requestFrom((uint8_t)PRESSURE_SENSOR_ADDRESS, (uint8_t)2);
uint16_t pressure = 0;
if (Wire.available() >= 2) {
uint8_t msb = Wire.read();
uint8_t lsb = Wire.read();
pressure = (msb << 8) | lsb;
}
// Читаем температуру
Wire.beginTransmission(PRESSURE_SENSOR_ADDRESS);
Wire.write(0x0F);
Wire.write(0x21);
Wire.endTransmission();
delay(100);
Wire.beginTransmission(PRESSURE_SENSOR_ADDRESS);
Wire.write(0x60);
Wire.endTransmission(false);
Wire.requestFrom((uint8_t)PRESSURE_SENSOR_ADDRESS, (uint8_t)2);
uint16_t temperature = 0;
if (Wire.available() >= 2) {
uint8_t msb = Wire.read();
uint8_t lsb = Wire.read();
temperature = (msb << 8) | lsb;
}
Serial.print("Pressure: 0x");
if ((pressure >> 8) < 16) Serial.print("0");
Serial.print((uint8_t)(pressure >> 8), HEX);
if ((pressure & 0xFF) < 16) Serial.print("0");
Serial.print((uint8_t)(pressure & 0xFF), HEX);
Serial.print(" (");
Serial.print(pressure);
Serial.print(") ");
Serial.print("Temperature: 0x");
if ((temperature >> 8) < 16) Serial.print("0");
Serial.print((uint8_t)(temperature >> 8), HEX);
if ((temperature & 0xFF) < 16) Serial.print("0");
Serial.print((uint8_t)(temperature & 0xFF), HEX);
Serial.print(" (");
Serial.print(temperature);
Serial.println(")");
}
На все запросы датчик отвечает одно и тоже.
17:19:24.503 → Pressure: 0x6B49 (27465) Temperature: 0x6B21 (27425)
17:19:26.730 → Pressure: 0x6B49 (27465) Temperature: 0x6B21 (27425)
Может он просто неисправен, а я тут второй день нервные клетки жгу.


