HAL STM32F1硬件I2C扫描从设备地址

HAL STM32F1硬件I2C扫描从设备地址


  • ✨利用硬件I2C接口扫描从设备地址是否在线,可以有效的帮助检测从设备是否在线,以及诊断从设备是否工作正常,以及用在快速查找设备I2C地址上。
  • 🌿扫描ssd1306 I2C oled屏幕地址:(0x78 = 0x3c << 1)
    在这里插入图片描述
  • 🌿扫描挂载的MPU6050地址:
    在这里插入图片描述

⚡需要注意的是,扫描到的地址,需要左移一位才是从设备的真正I2C地址。

🛠STM32CubeMX工程配置

  • 🌿指定一个12C接口,具体参数如下:
    在这里插入图片描述
  • 🚩Hal库主要功能实现函数:HAL_I2C_IsDeviceReady

📝main函数代码

int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_I2C1_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */
	printf("Scanning I2C bus:\r\n");
	HAL_StatusTypeDef result;
 	uint8_t i;
 	for (i=1; i<128; i++)
 	{
 	  /*
 	   * the HAL wants a left aligned i2c address
 	   * &hi2c1 is the handle
 	   * (uint16_t)(i<<1) is the i2c address left aligned
 	   * retries 2
 	   * timeout 2
		i2c address:(0x78 = 0x3c << 1)
 	   */
 	  result = HAL_I2C_IsDeviceReady(&hi2c1, (uint16_t)(i<<1), 2, 2);
 	  if (result != HAL_OK) // HAL_ERROR or HAL_BUSY or HAL_TIMEOUT
 	  {
 		  printf("."); // No ACK received at that address
 	  }
 	  if (result == HAL_OK)
 	  {
 		  printf("0x%X", i); // Received an ACK at that address
 	  }
 	}
 	printf("\r\n");
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_5);
		HAL_Delay(500);		
		HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_5);
		
  }
  /* USER CODE END 3 */
}

📚工程源码

链接:https://pan.baidu.com/s/1ZsTskQ7EbXN0vHNeHYa-sQ 
提取码:vtgg
STM32F1系列单片机中的I2C通信作为一种常用的串行总线接口,通常需要编写驱动程序来实现从设备的功能。以下是使用Keil MDK或STM HAL库的基本步骤编写STM32F1软件I2C从机代码: 1. **包括头文件**: ```c #include "stm32f1xx_hal.h" #include "i2c.h" ``` 2. **初始化I2C模块**: ```c I2C_HandleTypeDef hi2c1; I2C_InitTypeDef i2cInitStructure; // 初始化I2C1 (这里假设使用的是I2C1) hi2c1.Instance = I2C1; hi2c1.Init.ClockSpeed = 100000; // 设置I2C速度,如100kHz hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2; // 根据需求设置低电平持续时间 hi2c1.Init.OwnAddress1 = 0x00; // 设定地址(若无特殊需求可以设为0) hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; // 7位寻址模式 hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; // 是否支持双地址模式 hi2c1.Init.OwnAddress2 = 0x00; // 若启用双地址,设定第二个地址 hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; // 普通呼叫模式 hi2c1.Init.NoStretchMode = ENABLE; // 非拉长模式 HAL_I2C_Init(&hi2c1); ``` 3. **注册中断处理函数**: ```c __weak void HAL_I2C_Master_AnalogCallback(I2C_HandleTypeDef *hi2c); void MyI2CAnalogCallback(I2C_HandleTypeDef *hi2c) { // 实现自己的中断处理函数,例如读取数据后的处理 } HAL_NVIC_SetVector(I2C1_IRQn, (uint32_t)&MyI2CAnalogCallback, 0); ``` 4. **主循环等待接收**: ```c while (1) { if (HAL_I2C_MasterReceive(&hi2c1, slave_address, buffer, num_bytes_to_read, timeout) == HAL_OK) { // 数据接收成功,处理接收到的数据 } else { // 接收失败,处理错误 } } ``` 5. **释放资源**: ```c HAL_I2C_DeInit(&hi2c1); ``` 注意,这只是一个基本框架,实际应用中可能还需要处理中断、错误检测以及异常情况等。此外,你需要替换`slave_address`为你想要连接的从设备地址,`buffer`和`num_bytes_to_read`是你用来存储接收数据的变量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值