电源管理MCU调试
IIC温湿度传感器读取
STM32F1系列的IIC居然没有内部上拉电阻,导致IIC读取不到,因此外部焊接了两个上拉电阻
随后成功识别到0x00和0x44,0x00为广播信号,0x44为sht30的真实地址
附IIC扫描并通关串口打印的源代码:
/**
* @brief I2C 总线设备扫描函数 (无 printf 版本)
* @param hi2c I2C 句柄指针 (如 &hi2c1)
* @param huart UART 句柄指针,用于打印输出 (如 &huart1)
*/
void I2C_Scan_Secure(I2C_HandleTypeDef *hi2c, UART_HandleTypeDef *huart)
{
char msg[64]; // 临时缓冲区
HAL_StatusTypeDef result;
uint8_t i;
uint8_t devices_found = 0;
// 1. 打印表头
const char *header = "\r\n--- Starting I2C Scan ---\r\n 0 1 2 3 4 5 6 7 8 9 a b c d e f\r\n";
HAL_UART_Transmit(huart, (uint8_t*)header, strlen(header), 100);
for (i = 0; i < 128; i++)
{
// 2. 打印行首地址 (00:, 10:, 等)
if (i % 16 == 0)
{
sprintf(msg, "%02x: ", i);
HAL_UART_Transmit(huart, (uint8_t*)msg, strlen(msg), 100);
}
// 3. 尝试探测设备
// 注意:8位地址 = 7位地址 << 1
result = HAL_I2C_IsDeviceReady(hi2c, (uint16_t)(i << 1), 3, 5);
if (result == HAL_OK)
{
sprintf(msg, "%02X ", i); // 发现设备,打印 7 位十六进制地址
devices_found++;
}
else
{
strcpy(msg, "-- "); // 未发现设备
}
HAL_UART_Transmit(huart, (uint8_t*)msg, strlen(msg), 100);
// 4. 每行结束换行
if (i % 16 == 15)
{
HAL_UART_Transmit(huart, (uint8_t*)"\r\n", 2, 100);
}
}
// 5. 打印总结
if (devices_found == 0)
{
const char *none = "\r\nNo I2C devices found.\r\n";
HAL_UART_Transmit(huart, (uint8_t*)none, strlen(none), 100);
}
else
{
sprintf(msg, "\r\nScan complete. Found %d device(s).\r\n", devices_found);
HAL_UART_Transmit(huart, (uint8_t*)msg, strlen(msg), 100);
}
}




