当前位置: 首页 > 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.jsqmd.com/news/83832/

相关文章:

  • 面向对象编程实验二
  • 深入解析:【图像处理】图片的前向映射与后向映射
  • 小V健身助手开发手记(四):打造专属健康空间——以 PersonContent构建统一风格的个人中心
  • RPCS3完全配置手册:从零开始搭建高性能PS3模拟环境
  • 快手带货公司哪家好,优秀企业推荐 - 速递信息
  • 上海快手代运营公司哪家好,十家优秀企业推荐 - 速递信息
  • 【C++14算法】make_unique
  • 终极指南:Artillery负载测试3分钟快速入门 [特殊字符]
  • Node.js BFF层实战:对接天远综合多头借贷/逾期/欺诈聚合接口
  • 深入理解连接错误:从 “ld returned 1“到系统性解决方案
  • 实用指南:逆向基础--汇编基础(CS与IP) (05)
  • 深度残差网络在智能垃圾分类中的技术实践与性能分析
  • Vue2如何设计大文件上传的交互界面与用户体验?
  • TinyMCE4支持微信公众号内容转存CMS
  • Android16 EDLA 认证测试CTS问题分析解决
  • 10个BlenderMCP像素化技巧:让你的3D模型瞬间变身复古游戏资产
  • JS如何结合AES加密实现大文件上传的安全存储?
  • 正点原子imx6ull Qt界面显示bmp280气压值
  • 20、集群节点与实例的添加和删除操作指南
  • wangEditor处理OA系统word文档批量上传
  • DPARSF预处理
  • 本地部署文档管理系统 Paperless-ngx 并实现外部访问
  • 在 Windows PowerShell 中实现类 Linux 的后台任务与作业控制
  • JavaScript如何实现大文件上传的断点续传与秒传?
  • Termux安全防护终极指南:构建零信任移动开发环境
  • 基础-函数:
  • 竖屏视频变横屏不损失画质的方法,新手1分钟改变画框
  • 如何快速掌握机械振动信号分析:完整实战指南
  • 本地部署交互式计算平台 JupyterLab 并实现外部访问( Linux 版本)
  • 23、适用于Linux环境的Oracle数据库基准测试工具:Hammerora与Swingbench