当前位置: 首页 > news >正文

Day28:I2C 配置与使用

I2C 配置步骤:
使能 GPIO 和 I2C 时钟
配置 GPIO 为开漏复用功能 (如 PB6-SCL, PB7-SDA)
配置 I2C 参数 (模式、频率、地址)
使能 I2C
I2C 通信函数:
发送:HAL_I2C_Master_Transmit()(主发送)
接收:HAL_I2C_Master_Receive()(主接收)
发送 + 接收:HAL_I2C_Master_TransmitReceive()
代码示例:(STM32 作为主设备读取 EEPROM 数据)

// EEPROM地址(7位)
#define EEPROM_ADDR 0xA0

// I2C初始化
I2C_HandleTypeDef hi2c1;
void I2C1_Init(void){
GPIO_InitTypeDef GPIO_InitStruct;

// 使能GPIOB和I2C1时钟
__HAL_RCC_GPIOB_CLK_ENABLE();
__HAL_RCC_I2C1_CLK_ENABLE();

// 配置PB6(SCL)和PB7(SDA)为开漏复用功能
GPIO_InitStruct.Pin = GPIO_PIN_6 | GPIO_PIN_7;
GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; // 复用开漏输出
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF1_I2C1;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

// 配置I2C参数(标准模式,100Kbps)
hi2c1.Instance = I2C1;
hi2c1.Init.ClockSpeed = 100000;
hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2; // 2:1占空比(标准模式)
hi2c1.Init.OwnAddress1 = 0x00; // 自身地址(主设备一般不需要)
hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; // 7位地址模式
hi2c1.Init.DualAddressMode = DISABLE; // 单地址模式
hi2c1.Init.OwnAddress2 = 0x00;
hi2c1.Init.GeneralCallMode = DISABLE; // 不启用广播模式
hi2c1.Init.NoStretchMode = DISABLE; // 启用时钟延展
HAL_I2C_Init(&hi2c1);

HAL_I2C_Start(&hi2c1); // 启动I2C
}

// 读取EEPROM一个字节
uint8_t EEPROM_Read(uint16_t addr){
uint8_t data;
uint8_t reg_addr = (uint8_t)(addr >> 8); // 高8位地址
uint8_t reg_addr_low = (uint8_t)addr; // 低8位地址

// 发送写命令:从机地址+写位
HAL_I2C_Master_Transmit(&hi2c1, EEPROM_ADDR, &reg_addr, 1, 1000);
// 发送子地址
HAL_I2C_Master_Transmit(&hi2c1, EEPROM_ADDR, &reg_addr_low, 1, 1000);

// 发送读命令:从机地址+读位
HAL_I2C_Master_Receive(&hi2c1, EEPROM_ADDR | 0x01, &data, 1, 1000);

return data;
}

// 主函数
int main(){
I2C1_Init();
uint8_t data = EEPROM_Read(0x0000); // 读取0x0000地址的数据
return 0;
}

http://www.rkmt.cn/news/94028.html

相关文章:

  • RPCS3完全配置手册:从零开始搭建高性能PS3模拟环境
  • 【C++14算法】make_unique
  • 深入理解连接错误:从 “ld returned 1“到系统性解决方案
  • 深度残差网络在智能垃圾分类中的技术实践与性能分析
  • Vue2如何设计大文件上传的交互界面与用户体验?
  • TinyMCE4支持微信公众号内容转存CMS
  • JS如何结合AES加密实现大文件上传的安全存储?
  • 正点原子imx6ull Qt界面显示bmp280气压值
  • wangEditor处理OA系统word文档批量上传
  • Termux安全防护终极指南:构建零信任移动开发环境
  • 10分钟构建智能图像分类系统:零代码AI实战指南
  • DPARSF预处理
  • 25、RAC数据库备份与恢复:使用Recovery Manager(RMAN)
  • P1131题解
  • 栈:数据结构中的 “线性管家”—— 从理论基础到统计领域实践应用
  • BoringNotch安装配置教程:将MacBook凹口变为动态音乐控制中心
  • 26、第三方集群解决方案及相关技术解析
  • 为什么视频生成稀疏注意力做不好?中科院自动化所最新提出稀疏注意力纠偏新范式
  • 吐血整理,性能测试的左移右移+性能基线实践,详细分析...
  • 【Qt开源项目】— ModbusScope-day 2
  • P2746题解
  • 企业级AI路由网关:解锁多模型智能调度的未来
  • LOOT完整使用指南:游戏模组加载顺序优化利器
  • 【URP】Unity[后处理]色差ChromaticAberration
  • Aurora UI 安装配置终极指南
  • SoFixer:专业修复内存dump的So文件工具完全指南
  • 完整教程:深度学习:Mini-Batch 梯度下降(Mini-Batch Gradient Descent)
  • 少儿编程考试路径规划:考级与竞赛时间如何平衡?
  • UG NX工程制图时,常见会出现哪些异常问题
  • 【渲染优化】动态调整虚拟列表刷新率:让代码学会“偷懒“