STM32的I2C做从机
STM32的I2C做从机
在STM32中配置I2C从机(Slave)模式需遵循以下步骤和注意事项,以标准外设库(如HAL库)为例:
关键步骤
-
初始化I2C外设
I2C_HandleTypeDef hi2c1; void I2C1_Init(void) { hi2c1.Instance = I2C1; // 选择I2C实例 hi2c1.Init.ClockSpeed = 0; // 从机无需设置时钟速度(主机专用) hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2; // 占空比(若支持) hi2c1.Init.OwnAddress1 = 0x0A; // 从机自身地址(7位格式) hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; // 7位地址模式 hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; // 禁用双地址 hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; // 禁用广播呼叫 hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; // 时钟延展(按需启用) HAL_I2C_Init(&hi2c1); } -
启用I2C中断
- 在NVIC中配置I2C事件中断和错误中断:
HAL_NVIC_SetPriority(I2C1_EV_IRQn, 0, 0); HAL_NVIC_EnableIRQ(I2C1_EV_IRQn); HAL_NVIC_SetPriority(I2C1_ER_IRQn, 0, 0); HAL_NVIC_EnableIRQ(I2C1_ER_IRQn);
- 在NVIC中配置I2C事件中断和错误中断:
-
实现中断服务函数
- 在
I2Cx_EV_IRQHandler处理事件:void I2C1_EV_IRQHandler(void) { HAL_I2C_EV_IRQHandler(&hi2c1); // HAL库的事件处理 } - 在
I2Cx_ER_IRQHandler处理错误:void I2C1_ER_IRQHandler(void) { HAL_I2C_ER_IRQHandler(&hi2c1); // HAL库的错误处理 }
- 在
-
处理I2C回调函数
- 重写从机事件回调:
void HAL_I2C_AddrCallback(I2C_HandleTypeDef *hi2c, uint8_t TransferDirection, uint16_t AddrMatchCode) { if (TransferDirection == I2C_DIRECTION_TRANSMIT) { // 主机请求读取数据(从机需发送) } else if (TransferDirection == I2C_DIRECTION_RECEIVE) { // 主机请求写入数据(从机需接收) } } - 重写接收完成回调:
void HAL_I2C_SlaveRxCpltCallback(I2C_HandleTypeDef *hi2c) { // 主机写入数据完成,处理接收到的数据 } - 重写发送完成回调:
void HAL_I2C_SlaveTxCpltCallback(I2C_HandleTypeDef *hi2c) { // 主机读取数据完成,可更新发送缓冲区 }
- 重写从机事件回调:
-
准备数据发送/接收
- 启动从机接收(主机写入时):
uint8_t rxBuffer[10]; HAL_I2C_Slave_Receive_IT(&hi2c1, rxBuffer, sizeof(rxBuffer)); - 启动从机发送(主机读取时):
uint8_t txBuffer[] = "Hello"; HAL_I2C_Slave_Transmit_IT(&hi2c1, txBuffer, sizeof(txBuffer));
- 启动从机接收(主机写入时):
注意事项
-
时钟延展(Clock Stretching)
- 若从机需要更多时间处理数据,启用
I2C_NOSTRETCH_ENABLE(通过SCL低电平延展时钟)。
- 若从机需要更多时间处理数据,启用
-
地址匹配
- 确保I2C主机发送的地址与从机配置的
OwnAddress1一致(7位地址需左移1位后比较)。
- 确保I2C主机发送的地址与从机配置的
-
错误处理
- 在
HAL_I2C_ErrorCallback中处理超时、仲裁丢失等错误:void HAL_I2C_ErrorCallback(I2C_HandleTypeDef *hi2c) { uint32_t error = HAL_I2C_GetError(hi2c); // 处理错误(如重置I2C) }
- 在
-
多从机支持
- 如需响应多个地址,启用双地址模式并设置
OwnAddress2。
- 如需响应多个地址,启用双地址模式并设置
调试技巧
- 逻辑分析仪:使用示波器或逻辑分析仪监控SCL/SDA信号。
- 状态寄存器:检查
I2C->SR1和I2C->SR2寄存器状态。 - 超时处理:在
HAL_I2C_ErrorCallback中检测超时错误(HAL_I2C_ERROR_TIMEOUT)。
完整示例代码
// 初始化I2C
I2C1_Init();
// 启动初始接收(等待主机写入)
uint8_t rxData[10];
HAL_I2C_Slave_Receive_IT(&hi2c1, rxData, 10);
// 在回调函数中处理数据
void HAL_I2C_SlaveRxCpltCallback(I2C_HandleTypeDef *hi2c) {
// 处理接收到的数据(rxData数组)
// 重新启动接收以等待下次传输
HAL_I2C_Slave_Receive_IT(&hi2c1, rxData, 10);
}
? 提示:不同STM32系列可能存在差异,请参考对应型号的《参考手册》和《应用笔记》调整配置。使用CubeMX可自动生成初始化代码。
STM32F0 HAL库 I2C 从机配置
参考链接:http://blog.sina.com.cn/s/blog_95cc46f40102yika.htmlSTM32 I2C从
资料下载
佚名
2021-12-28 19:29:18
STM32F103硬件I2C Slave
MCU:STM32F103IDE:STM32CubeIDEHAL库硬件I2C当作Slave,模拟EEPROM行为测试工具:树莓派为
资料下载
goodmbby
2021-12-20 19:38:54
STM32学习之I2C协议(读写EEPROM)
关于STM32学习分享第七章 I2C协议(读写EEPROM)文章目录关于STM32学习分享前言二、代码1.
资料下载
佚名
2021-11-30 15:21:11
STM32 I2C硬件的结构
我们可以看见STM32的硬件I2C有两个和数据有关的寄存器“数据寄存器(Data register)”(DR)和“数据移位寄存器(Data shift register)”(DSR),我们的软件写入的是DR, DSR
2020-04-30 15:00:29
换一换
- 如何分清usb-c和type-c的区别
- 中国芯片现状怎样?芯片发展分析
- vga接口接线图及vga接口定义
- 芯片的工作原理是什么?
- 华为harmonyos是什么意思,看懂鸿蒙OS系统!
- 什么是蓝牙?它的主要作用是什么?
- ssd是什么意思
- 汽车电子包含哪些领域?
- TWS蓝牙耳机是什么意思?你真的了解吗
- 什么是单片机?有什么用?
- 升压电路图汇总解析
- plc的工作原理是什么?
- 再次免费公开一肖一吗
- 充电桩一般是如何收费的?有哪些收费标准?
- ADC是什么?高精度ADC是什么意思?
- dtmb信号覆盖城市查询
- EDA是什么?有什么作用?
- 中科院研发成功2nm光刻机
- 苹果手机哪几个支持无线充电的?
- type-c四根线接法图解
- 华为芯片为什么受制于美国?
- 怎样挑选路由器?
- 元宇宙概念股龙头一览
- 锂电池和铅酸电池哪个好?
- 如何进行编码器的正确接线?接线方法介绍
- 什么是场效应管?它的作用是什么?
- 虚短与虚断的概念介绍及区别
- 晶振的作用是什么?
- 大疆无人机的价格贵吗?大约在什么价位?
- amoled屏幕和oled区别
- 苹果nfc功能怎么复制门禁卡
- 单片机和嵌入式的区别是什么
- 复位电路的原理及作用
- BLDC电机技术分析
- dsp是什么意思?有什么作用?
- 苹果无线充电器怎么使用?
- iphone13promax电池容量是多少毫安
- 芯片的组成材料有什么
- 特斯拉充电桩充电是如何收费的?收费标准是什么?
- 直流电机驱动电路及原理图
- 传感器常见类型有哪些?
- 自举电路图
- 苹果笔记本macbookpro18款与19款区别
- 通讯隔离作用
- 新斯的指纹芯片供哪些客户
- 伺服电机是如何进行工作的?它的原理是什么?
- 无人机价钱多少?为什么说无人机烧钱?
- 以太网VPN技术概述
- 手机nfc功能打开好还是关闭好
- 十大公认音质好的无线蓝牙耳机