#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");
}