к1986ве92fi подключение датчика по I2C_часть3
к1986ве92fi подключение датчика по I2C_часть3
это барометер си а хэ в следующем видео #include "Barometer.h" // ===== БАЗОВЫЕ I2C ФУНКЦИИ ===== void Press_IO_Write(uint8_t addr, uint8_t reg, uint8_t value) { while(I2C_GetFlagStatus(I2C_FLAG_BUS_FREE) != SET); I2C_Send7bitAddress(addr, I2C_Direction_Transmitter); while(I2C_GetFlagStatus(I2C_FLAG_nTRANS) != SET); I2C_SendByte(reg); while(I2C_GetFlagStatus(I2C_FLAG_nTRANS) != SET); I2C_SendByte(value); while(I2C_GetFlagStatus(I2C_FLAG_nTRANS) != SET); I2C_SendSTOP(); } uint8_t Press_IO_Read(uint8_t addr, uint8_t reg) { uint8_t data = 0; while(I2C_GetFlagStatus(I2C_FLAG_BUS_FREE) != SET); I2C_Send7bitAddress(addr, I2C_Direction_Transmitter); while(I2C_GetFlagStatus(I2C_FLAG_nTRANS) != SET); I2C_SendByte(reg); while(I2C_GetFlagStatus(I2C_FLAG_nTRANS) != SET); I2C_Send7bitAddress(addr, I2C_Direction_Receiver); while(I2C_GetFlagStatus(I2C_FLAG_nTRANS) != SET); I2C_StartReceiveData(I2C_Send_to_Slave_NACK); while(I2C_GetFlagStatus(I2C_FLAG_nTRANS) != SET); data = I2C_GetReceivedData(); I2C_SendSTOP(); return data; } // ===== ИНИЦИАЛИЗАЦИЯ LPS25HB (ПО ДАТАШИТУ) ===== void PressInit(void) { uint8_t value = 0; // 1. Проверяем WHO_AM_I uint8_t who = Press_IO_Read(LPS25HB_ADDRESS, LPS25HB_WHO_AM_I); if (who != 0xBD) { // Датчик не отвечает — можно вставить бесконечный цикл while(1); } // 2. Выключаем датчик (PD = 0) value = Press_IO_Read(LPS25HB_ADDRESS, LPS25HB_CTRL_REG1); value &= ~LPS25HB_PD_MASK; value |= LPS25HB_PD_POWERDOWN; Press_IO_Write(LPS25HB_ADDRESS, LPS25HB_CTRL_REG1, value); // 3. Настройка ODR = 25 Гц value = Press_IO_Read(LPS25HB_ADDRESS, LPS25HB_CTRL_REG1); value &= ~LPS25HB_ODR_MASK; value |= LPS25HB_ODR_25HZ; Press_IO_Write(LPS25HB_ADDRESS, LPS25HB_CTRL_REG1, value); // 4. Включаем BDU (Block Data Update) value = Press_IO_Read(LPS25HB_ADDRESS, LPS25HB_CTRL_REG1); value &= ~LPS25HB_BDU_MASK; value |= LPS25HB_BDU_ENABLE; Press_IO_Write(LPS25HB_ADDRESS, LPS25HB_CTRL_REG1, value); // 5. Настройка усреднения (RES_CONF) value = Press_IO_Read(LPS25HB_ADDRESS, LPS25HB_RES_CONF); value &= ~(LPS25HB_AVGT_MASK | LPS25HB_AVGP_MASK); value |= LPS25HB_AVGT_16; // 16 выборок для температуры value |= LPS25HB_AVGP_32; // 32 выборки для давления Press_IO_Write(LPS25HB_ADDRESS, LPS25HB_RES_CONF, value); // 6. Включаем датчик (PD = 1) value = Press_IO_Read(LPS25HB_ADDRESS, LPS25HB_CTRL_REG1); value &= ~LPS25HB_PD_MASK; value |= LPS25HB_PD_ACTIVE; Press_IO_Write(LPS25HB_ADDRESS, LPS25HB_CTRL_REG1, value); Delay(100); // Ждём первого измерения } // ===== ЧТЕНИЕ ТЕМПЕРАТУРЫ ===== void Press_Get_Temp(float* pData) { uint8_t buffer[2]; int16_t raw = 0; // Читаем младший и старший байты температуры buffer[0] = Press_IO_Read(LPS25HB_ADDRESS, LPS25HB_TEMP_OUT_L); buffer[1] = Press_IO_Read(LPS25HB_ADDRESS, LPS25HB_TEMP_OUT_H); // Собираем 16-битное значение (дополнительный код) raw = (int16_t)((buffer[1] ﹤﹤ 8) | buffer[0]); // Формула из даташита: T(°C) = 42.5 + raw / 480 *pData = 42.5f + (raw / 480.0f); } // ===== ЧТЕНИЕ ДАВЛЕНИЯ ===== void Press_Get_Pressure(float* pData) { uint8_t buffer[3]; int32_t raw = 0; // Читаем 3 байта давления (XL, L, H) buffer[0] = Press_IO_Read(LPS25HB_ADDRESS, LPS25HB_PRESS_OUT_XL); buffer[1] = Press_IO_Read(LPS25HB_ADDRESS, LPS25HB_PRESS_OUT_L); buffer[2] = Press_IO_Read(LPS25HB_ADDRESS, LPS25HB_PRESS_OUT_H); // Собираем 24-битное значение (дополнительный код) raw = (int32_t)((buffer[2] ﹤﹤ 16) | (buffer[1] ﹤﹤ 8) | buffer[0]); // Расширение знака для отрицательных значений if (raw & 0x800000) { raw |= 0xFF000000; } // Формула из даташита: P(мбар) = raw / 4096 *pData = raw / 4096.0f; }