# STM32_HAL_i2c_slave_test **Repository Path**: togod121/STM32_HAL_i2c_slave_test ## Basic Information - **Project Name**: STM32_HAL_i2c_slave_test - **Description**: STM32_HAL_i2c2做从机实验 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-11-24 - **Last Updated**: 2024-11-24 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 从机 ## 参考文档 [总结一下首次使用HAL库STM32f030硬件IIC从机中断收发_stm32 i2c 地址中断-CSDN博客](https://blog.csdn.net/stonenth/article/details/122452140) [STM32设置为I2C从机模式(HAL库版本)_stm32 i2c从机-CSDN博客](https://blog.csdn.net/ShenZhen_zixian/article/details/131395791) ## 基本设置 ### 设置地址 ![](attachment/ce367873db3eca7ed7c668eaa80f6c72.png) ### 设置中断 ![](attachment/bad3724a814b404fd8448a267a66db9e.png) ### 启动I2C接收中断 ``` HAL_I2C_EnableListen_IT(&hi2c1); ``` ## 基本测试完成 ```c //发送计数偏移 uint16_t TX_OFFSET=0; uint16_t RX_OFFSET=0; uint8_t rx_buff[256] = {0x00}; uint8_t tx_buff[260] = { 0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0xAA,0xBB,0xCC,0xDD,0xEE,0xFF, 0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0xAA,0xBB,0xCC,0xDD,0xEE,0xFF, 0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0xAA,0xBB,0xCC,0xDD,0xEE,0xFF, 0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0xAA,0xBB,0xCC,0xDD,0xEE,0xFF, 0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0xAA,0xBB,0xCC,0xDD,0xEE,0xFF, 0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0xAA,0xBB,0xCC,0xDD,0xEE,0xFF, 0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0xAA,0xBB,0xCC,0xDD,0xEE,0xFF, 0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0xAA,0xBB,0xCC,0xDD,0xEE,0xFF, 0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0xAA,0xBB,0xCC,0xDD,0xEE,0xFF, 0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0xAA,0xBB,0xCC,0xDD,0xEE,0xFF, 0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0xAA,0xBB,0xCC,0xDD,0xEE,0xFF, 0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0xAA,0xBB,0xCC,0xDD,0xEE,0xFF, 0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0xAA,0xBB,0xCC,0xDD,0xEE,0xFF, 0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0xAA,0xBB,0xCC,0xDD,0xEE,0xFF, 0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0xAA,0xBB,0xCC,0xDD,0xEE,0xFF, 0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0xAA,0xBB,0xCC,0xDD,0xEE,0xFF, }; #define I2C_SLAVE hi2c2 // I2C设备地址回调函数(地址匹配上以后会进入该函数) void HAL_I2C_AddrCallback(I2C_HandleTypeDef *hi2c, uint8_t TransferDirection, uint16_t AddrMatchCode) { __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_ADDR); if(TransferDirection == I2C_DIRECTION_RECEIVE) //需要发送 { //发送一个数据,后面的数据在发送完成中断里,一个一个的发 TX_OFFSET=rx_buff[0]; HAL_I2C_Slave_Seq_Transmit_IT(&I2C_SLAVE, (tx_buff + TX_OFFSET), 1, I2C_FIRST_FRAME); } else if(TransferDirection == I2C_DIRECTION_TRANSMIT)//需要接收 { TX_OFFSET=0; RX_OFFSET=0; //准备接收1个数据 //不管是接收还是发送,都会接受一个数据,地址 HAL_I2C_Slave_Seq_Receive_IT(&I2C_SLAVE, rx_buff+RX_OFFSET, 1, I2C_FIRST_FRAME); } } //监听中断回调,说明传输结束 // 侦听完成回调函数(完成一次完整的i2c通信以后会进入该函数) //连续多个数据时,全部数据结束后才出发这个中断, void HAL_I2C_ListenCpltCallback(I2C_HandleTypeDef *hi2c) { //完成后需要手动重启监听 HAL_I2C_EnableListen_IT(hi2c); // Restart } //发送完成中断 //HAL_I2C_Slave_Seq_Transmit_IT完成后进入这个中断 void HAL_I2C_SlaveTxCpltCallback(I2C_HandleTypeDef *hi2c) { //继续发送后面的数据 TX_OFFSET++; HAL_I2C_Slave_Seq_Transmit_IT(&I2C_SLAVE, (tx_buff + TX_OFFSET), 1, I2C_FIRST_FRAME); } // //接收完成中断 void HAL_I2C_SlaveRxCpltCallback(I2C_HandleTypeDef *hi2c) { RX_OFFSET++; //准备接收1个数据 HAL_I2C_Slave_Seq_Receive_IT(&I2C_SLAVE, rx_buff+RX_OFFSET, 1, I2C_FIRST_FRAME); } // //发生错误中断 void HAL_I2C_ErrorCallback(I2C_HandleTypeDef *hi2c) { } /* USER CODE END 0 */ /** * @brief The application entry point. * @retval int */ 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(); /* USER CODE BEGIN 2 */ HAL_I2C_EnableListen_IT(&hi2c1); /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin); HAL_Delay(500); /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */ } ``` ## 树莓派测试 测试通过:I2C2 PB10(SCL) PB11(SDA) ``` sudo i2cdetect -y -a 1 i2cdump -y -f 1 0x32 i2cget -y -f 1 0x32 0x38 i2cset -y -f 1 0x32 0x38 0x01 0x02 i i2cset -y -f 1 0x32 0x00 0x00 0x00 0xB4 0xAB i ``` ### 效果 ![](attachment/91d5e75deb6f79e40a9c7424c5497cc8.png) ![](attachment/b42b45a2bc2459fccf2297aac44568ce.png)