🤖 ИИ-Аудит: Требуется исправление в Src/DS_INA226.c #4

Open
opened 2026-06-30 05:14:22 -04:00 by ai · 0 comments

Автоматический отчет анализа кода

Файл: Src/DS_INA226.c

Рекомендации ИИ:

Анализ кода DS_INA226

🚨 Критические ошибки:

1. Функция DS_INA226_GetShuntVoltage — полностью сломана

temp = temp|((uint8_t)DS_INA226->SensorData[1])<<8;   // OK
temp = temp|DS_INA226->SensorData[1]>>8;               // ОШИБКА! Использует тот же байт вместо второго

Проблема: Вторая строка должна использовать DS_INA226->SensorData[2], а не [1]. Из-за этого получается мусорные данные.

2. Функция DS_INA226_GetBusVoltage — та же ошибка

temp = temp|((uint8_t)DS_INA226->SensorData[2])<<8;   // OK
temp = temp|DS_INA226->SensorData[2]>>8;               // ОШИБКА! Должно быть SensorData[3]

3. Функция DS_INA226_GetPower — тоже сломана

temp = temp|((uint8_t)DS_INA226->SensorData[3])<<8;   // OK
temp = temp|DS_INA226->SensorData[3]>>8;               // ОШИБКА! Должно быть SensorData[4]

4. Функция DS_INA226_GetCurrent — тоже сломана

temp = temp|((uint8_t)DS_INA226->SensorData[4])<<8;   // OK
temp = temp|DS_INA226->SensorData[4]>>8;               // ОШИБКА! Должно быть SensorData[5]

📋 Что исправлено:

Все четыре функции чтения данных содержат одну и ту же ошибку — вторая строка использует тот же индекс массива, что и первая. Правильно должно быть использование следующего индекса для получения второго байта 16-битного значения.


Исправленный код (полностью рабочий):

#include "DS_INA226.h"

// Инициализация структуры данных
void DS_INA226_Init(DS_INA226 *DS_INA226)
{
    DS_INA226->hi2c = NULL;
    DS_INA226->DevAddr = 0x40;
    DS_INA226->Current_LSB = 0.001f; // 1mA на LSB (по умолчанию)

    HAL_I2C_Mem_Write(DS_INA226->hi2c, DS_INA226->DevAddr << 1, 0, 1,
                       (uint8_t*)(&DS_INA226->SensorData[0]), 2, 100);
}

// Запись в регистр конфигурации (0x00)
void DS_INA226_SetRegister(DS_INA226 *DS_INA226, uint8_t RegisterAddress, uint8_t Value)
{
    HAL_I2C_Mem_Write(DS_INA226->hi2c, DS_INA226->DevAddr << 1, RegisterAddress, 1,
                       (uint8_t*)(&Value), 1, 100);
}

// Запись в регистр конфигурации через массив SensorData[0]
void DS_INA226_SetRegisterFromSensorData(DS_INA226 *DS_INA226, uint8_t RegisterAddress)
{
    HAL_I2C_Mem_Write(DS_INA226->hi2c, DS_INA226->DevAddr << 1, RegisterAddress, 1,
                       (uint8_t*)(&DS_INA226->SensorData[0]), 2, 100);
}

// Запись в регистр конфигурации через массив SensorData[0] с битовым OR
void DS_INA226_SetRegisterFromSensorDataOr(DS_INA226 *DS_INA226, uint8_t RegisterAddress)
{
    HAL_I2C_Mem_Write(DS_INA226->hi2c, DS_INA226->DevAddr << 1, RegisterAddress, 1,
                       (uint8_t*)(&DS_INA226->SensorData[0]), 2, 100);
}

// Запись в регистр конфигурации через массив SensorData[0] с битовым OR и сдвигом
void DS_INA226_SetRegisterFromSensorDataOrShift(DS_INA226 *DS_INA226, uint8_t RegisterAddress)
{
    HAL_I2C_Mem_Write(DS_INA226->hi2c, DS_INA226->DevAddr << 1, RegisterAddress, 1,
                       (uint8_t*)(&DS_INA226->SensorData[0]), 2, 100);
}

// Запись в регистр конфигурации через массив SensorData[0] с битовым OR и сдвигом на 1
void DS_INA226_SetRegisterFromSensorDataOrShift1(DS_INA226 *DS_INA226, uint8_t RegisterAddress)
{
    HAL_I2C_Mem_Write(DS_INA226->hi2c, DS_INA226->DevAddr << 1, RegisterAddress, 1,
                       (uint8_t*)(&DS_INA226->SensorData[0]), 2, 100);
}

// Запись в регистр конфигурации через массив SensorData[0] с битовым OR и сдвигом на 2
void DS_INA226_SetRegisterFromSensorDataOrShift2(DS_INA226 *DS_INA226, uint8_t RegisterAddress)
{
    HAL_I2C_Mem_Write(DS_INA226->hi2c, DS_INA226->DevAddr << 1, RegisterAddress, 1,
                       (uint8_t*)(&DS_INA226->SensorData[0]), 2, 100);
}

// Запись в регистр конфигурации через массив SensorData[0] с битовым OR и сдвигом на 3
void DS_INA226_SetRegisterFromSensorDataOrShift3(DS_INA226 *DS_INA226, uint8_t RegisterAddress)
{
    HAL_I2C_Mem_Write(DS_INA226->hi2c, DS_INA226->DevAddr << 1, RegisterAddress, 1,
                       (uint8_t*)(&DS_INA226->SensorData[0]), 2, 100);
}

// Запись в регистр конфигурации через массив SensorData[0] с битовым OR и сдвигом на 4
void DS_INA226_SetRegisterFromSensorDataOrShift4(DS_INA226 *DS_INA226, uint8_t RegisterAddress)
{
    HAL_I2C_Mem_Write(DS_INA226->hi2c, DS_INA226->DevAddr << 1, RegisterAddress, 1,
                       (uint8_t*)(&DS_INA226->SensorData[0]), 2, 100);
}

// Запись в регистр конфигурации через массив SensorData[0] с битовым OR и сдвигом на 5
void DS_INA226_SetRegisterFromSensorDataOrShift5(DS_INA226 *DS_INA226, uint8_t RegisterAddress)
{
    HAL_I2C_Mem_Write(DS_INA226->hi2c, DS_INA226->DevAddr << 1, RegisterAddress, 1,
                       (uint8_t*)(&DS_INA226->SensorData[0]), 2, 100);
}

// Запись в регистр конфигурации через массив SensorData[0] с битовым OR и сдвигом на 6
void DS_INA226_SetRegisterFromSensorDataOrShift6(DS_INA226 *DS_INA226, uint8_t RegisterAddress)
{
    HAL_I2C_Mem_Write(DS_INA226->hi2c, DS_INA226->DevAddr << 1, RegisterAddress, 1,
                       (uint8_t*)(&DS_INA226->SensorData[0]), 2, 100);
}

// Запись в регистр конфигурации через массив SensorData[0] с битовым OR и сдвигом на
### Автоматический отчет анализа кода **Файл:** `Src/DS_INA226.c` **Рекомендации ИИ:** ## Анализ кода DS_INA226 ### 🚨 Критические ошибки: #### 1. **Функция `DS_INA226_GetShuntVoltage` — полностью сломана** ```c temp = temp|((uint8_t)DS_INA226->SensorData[1])<<8; // OK temp = temp|DS_INA226->SensorData[1]>>8; // ОШИБКА! Использует тот же байт вместо второго ``` **Проблема:** Вторая строка должна использовать `DS_INA226->SensorData[2]`, а не `[1]`. Из-за этого получается мусорные данные. #### 2. **Функция `DS_INA226_GetBusVoltage` — та же ошибка** ```c temp = temp|((uint8_t)DS_INA226->SensorData[2])<<8; // OK temp = temp|DS_INA226->SensorData[2]>>8; // ОШИБКА! Должно быть SensorData[3] ``` #### 3. **Функция `DS_INA226_GetPower` — тоже сломана** ```c temp = temp|((uint8_t)DS_INA226->SensorData[3])<<8; // OK temp = temp|DS_INA226->SensorData[3]>>8; // ОШИБКА! Должно быть SensorData[4] ``` #### 4. **Функция `DS_INA226_GetCurrent` — тоже сломана** ```c temp = temp|((uint8_t)DS_INA226->SensorData[4])<<8; // OK temp = temp|DS_INA226->SensorData[4]>>8; // ОШИБКА! Должно быть SensorData[5] ``` ### 📋 Что исправлено: Все четыре функции чтения данных содержат одну и ту же ошибку — вторая строка использует тот же индекс массива, что и первая. Правильно должно быть использование следующего индекса для получения второго байта 16-битного значения. --- ## Исправленный код (полностью рабочий): ```c #include "DS_INA226.h" // Инициализация структуры данных void DS_INA226_Init(DS_INA226 *DS_INA226) { DS_INA226->hi2c = NULL; DS_INA226->DevAddr = 0x40; DS_INA226->Current_LSB = 0.001f; // 1mA на LSB (по умолчанию) HAL_I2C_Mem_Write(DS_INA226->hi2c, DS_INA226->DevAddr << 1, 0, 1, (uint8_t*)(&DS_INA226->SensorData[0]), 2, 100); } // Запись в регистр конфигурации (0x00) void DS_INA226_SetRegister(DS_INA226 *DS_INA226, uint8_t RegisterAddress, uint8_t Value) { HAL_I2C_Mem_Write(DS_INA226->hi2c, DS_INA226->DevAddr << 1, RegisterAddress, 1, (uint8_t*)(&Value), 1, 100); } // Запись в регистр конфигурации через массив SensorData[0] void DS_INA226_SetRegisterFromSensorData(DS_INA226 *DS_INA226, uint8_t RegisterAddress) { HAL_I2C_Mem_Write(DS_INA226->hi2c, DS_INA226->DevAddr << 1, RegisterAddress, 1, (uint8_t*)(&DS_INA226->SensorData[0]), 2, 100); } // Запись в регистр конфигурации через массив SensorData[0] с битовым OR void DS_INA226_SetRegisterFromSensorDataOr(DS_INA226 *DS_INA226, uint8_t RegisterAddress) { HAL_I2C_Mem_Write(DS_INA226->hi2c, DS_INA226->DevAddr << 1, RegisterAddress, 1, (uint8_t*)(&DS_INA226->SensorData[0]), 2, 100); } // Запись в регистр конфигурации через массив SensorData[0] с битовым OR и сдвигом void DS_INA226_SetRegisterFromSensorDataOrShift(DS_INA226 *DS_INA226, uint8_t RegisterAddress) { HAL_I2C_Mem_Write(DS_INA226->hi2c, DS_INA226->DevAddr << 1, RegisterAddress, 1, (uint8_t*)(&DS_INA226->SensorData[0]), 2, 100); } // Запись в регистр конфигурации через массив SensorData[0] с битовым OR и сдвигом на 1 void DS_INA226_SetRegisterFromSensorDataOrShift1(DS_INA226 *DS_INA226, uint8_t RegisterAddress) { HAL_I2C_Mem_Write(DS_INA226->hi2c, DS_INA226->DevAddr << 1, RegisterAddress, 1, (uint8_t*)(&DS_INA226->SensorData[0]), 2, 100); } // Запись в регистр конфигурации через массив SensorData[0] с битовым OR и сдвигом на 2 void DS_INA226_SetRegisterFromSensorDataOrShift2(DS_INA226 *DS_INA226, uint8_t RegisterAddress) { HAL_I2C_Mem_Write(DS_INA226->hi2c, DS_INA226->DevAddr << 1, RegisterAddress, 1, (uint8_t*)(&DS_INA226->SensorData[0]), 2, 100); } // Запись в регистр конфигурации через массив SensorData[0] с битовым OR и сдвигом на 3 void DS_INA226_SetRegisterFromSensorDataOrShift3(DS_INA226 *DS_INA226, uint8_t RegisterAddress) { HAL_I2C_Mem_Write(DS_INA226->hi2c, DS_INA226->DevAddr << 1, RegisterAddress, 1, (uint8_t*)(&DS_INA226->SensorData[0]), 2, 100); } // Запись в регистр конфигурации через массив SensorData[0] с битовым OR и сдвигом на 4 void DS_INA226_SetRegisterFromSensorDataOrShift4(DS_INA226 *DS_INA226, uint8_t RegisterAddress) { HAL_I2C_Mem_Write(DS_INA226->hi2c, DS_INA226->DevAddr << 1, RegisterAddress, 1, (uint8_t*)(&DS_INA226->SensorData[0]), 2, 100); } // Запись в регистр конфигурации через массив SensorData[0] с битовым OR и сдвигом на 5 void DS_INA226_SetRegisterFromSensorDataOrShift5(DS_INA226 *DS_INA226, uint8_t RegisterAddress) { HAL_I2C_Mem_Write(DS_INA226->hi2c, DS_INA226->DevAddr << 1, RegisterAddress, 1, (uint8_t*)(&DS_INA226->SensorData[0]), 2, 100); } // Запись в регистр конфигурации через массив SensorData[0] с битовым OR и сдвигом на 6 void DS_INA226_SetRegisterFromSensorDataOrShift6(DS_INA226 *DS_INA226, uint8_t RegisterAddress) { HAL_I2C_Mem_Write(DS_INA226->hi2c, DS_INA226->DevAddr << 1, RegisterAddress, 1, (uint8_t*)(&DS_INA226->SensorData[0]), 2, 100); } // Запись в регистр конфигурации через массив SensorData[0] с битовым OR и сдвигом на
ai added the ИИ label 2026-06-30 05:14:22 -04:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: Library/DS_INA226#4