Загрузка данных


#include "fsl_lpi2c.h"
#include "fsl_debug_console.h"

// Определите используемый модуль LPI2C в соответствии с пинаутом FRDM-IMX95
#define BOARD_LPI2C_MASTER_BASE     LPI2C1 
#define LPI2C_MASTER_CLOCK_FREQUENCY CLOCK_GetIpFreq(kCLOCK_Lpi2c1)

void LPI2C_Master_Init(void)
{
    lpi2c_master_config_t masterConfig;

    /* 1. Получение настроек по умолчанию (обычно 100 кГц, Standard Mode) */
    LPI2C_MasterGetDefaultConfig(&masterConfig);
    
    /* При необходимости можно изменить скорость: masterConfig.baudRate_Hz = 400000U; */

    /* 2. Инициализация мастера LPI2C */
    LPI2C_MasterInit(BOARD_LPI2C_MASTER_BASE, &masterConfig, LPI2C_MASTER_CLOCK_FREQUENCY);
}

void LPI2C_ScanBus(void)
{
    status_t status;
    uint8_t dummy_data = 0;
    
    PRINTF("\r\n--- Сканирование шины LPI2C ---\r\n");
    PRINTF("     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f\r\n");

    // Стандартный диапазон 7-бит адресов I2C: 0x03 - 0x77
    for (uint8_t address = 0; address < 128; address++)
    {
        if (address % 16 == 0)
        {
            PRINTF("%02x: ", address);
        }

        if (address < 0x03 || address > 0x77)
        {
            PRINTF("   ");
            continue;
        }

        /* 
         * Настройка фиктивной транзакции: 
         * Пытаемся прочитать 0 байт данных. Драйвер fsl_lpi2c выполнит:
         * START -> Адрес+R/W -> Проверка ACK/NAK -> STOP
         */
        lpi2c_master_transfer_t transfer;
        transfer.slaveAddress   = address;          // Текущий проверяемый адрес
        transfer.direction      = kLPI2C_Read;      // Режим чтения
        transfer.subaddress     = 0;
        transfer.subaddressSize = 0;
        transfer.data           = &dummy_data;      // Буфер под данные
        transfer.dataSize       = 0;                // 0 байт (нужен только факт ACK от адреса)
        transfer.flags          = kLPI2C_TransferDefaultFlag;

        // Выполняем блокирующий перевод (опрос шины)
        status = LPI2C_MasterTransferBlocking(BOARD_LPI2C_MASTER_BASE, &transfer);

        // Если устройство ответило, статус будет kStatus_Success
        if (status == kStatus_Success)
        {
            PRINTF("%02x ", address); // Устройство найдено!
        }
        else
        {
            PRINTF("-- "); // Устройство не ответило (NAK)
        }

        if ((address + 1) % 16 == 0)
        {
            PRINTF("\r\n");
        }
    }
    PRINTF("\r\n--- Сканирование завершено ---\r\n");
}