描述:

I2C轮询方式从机读写数据
HAL_I2C_Slave_Transmit(*hi2c, *pData, Size, Timeout);

  • *hi2c: I2C设备号指针,这里用的是I2C1: &hi2c1
  • *pData: 数据指针
  • Size: 数据长度
  • Timeout: 超时时间

HAL_I2C_Slave_Receive(*hi2c, *pData, Size, Timeout);

  • *hi2c: I2C设备号指针,这里用的是I2C1: &hi2c1
  • *pData: 数据指针
  • Size: 数据长度
  • Timeout: 超时时间

示例:

根据使用的外设,关闭未使用外设的初始化

 /* Initialize all configured peripherals */
// MX_GPIO_Init();
 MX_I2C1_Init(); //初始化I2C1
// MX_USART2_UART_Init();
// MX_USB_DEVICE_Init();
// MX_ADC_Init();
// MX_TIM2_Init();
// MX_SPI1_Init();
// MX_WWDG_Init();
// MX_IWDG_Init();
// MX_RTC_Init();
// MX_USART1_UART_Init();

编辑主程序,判断是否收到数据,有则将数据存到data1中并发送data0中的数据。(以下仅作函数使用参考,由于具体设备使用需要进行初始化等配置操作,这里不详细介绍)

/* Infinite loop */
/* USER CODE BEGIN WHILE */
uint8_t data0[1] = {0x01,};
uint8_t data1[1] = {};
while (1)
{
 if(HAL_I2C_Slave_Receive(&hi2c1, data1, 1, 100) == HAL_OK) //判断是否接收到数据
 {
  HAL_I2C_Slave_Transmit(&hi2c1, data0, 1, 100); //发送数据data0
 }
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */

以上示例针对eefrog的STM32F042G模块,根据STM32cubeMX综合配置基础上设计,不保证在其它模块上有同样效果。