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

硬件I2C的使用_CH585evt_电量计

GPIOB_ModeCfg(GPIO_Pin_12 | GPIO_Pin_13, GPIO_ModeIN_PU);
I2C_Init(I2C_Mode_I2C, 100000, I2C_DutyCycle_16_9, I2C_Ack_Enable, I2C_AckAddr_7bit, MASTER_ADDR);  //初始化了 I2C 接口,设置了通信速率为 100kHz
  • 初始化SDA/SCL,配置为上拉输入模式,根据芯片手册,需要时会自动开漏输出
    1149ad9b-b78f-408c-ab91-800312fb34ea

  • I2C_Init:
    I2C_Mode:支持主模式/从模式
    I2C_ClockSpeed:最大400KHz
    I2C_DutyCycle:快速模式中时钟线的占空比
    I2C_Ack:使能ACK
    I2C_AckAddr:ACK 7位或10位地址
    I2C_OwnAddress1:本机地址

  • 以电量计为例使用硬件I2C读取寄存器数值过程

__HIGH_CODE
uint8_t KP691000_Read_Data(uint8_t slave_adress, uint8_t reg_adress, uint8_t *cb_data, uint16_t len)
{uint32_t temp_data =0;GPIOB_ModeCfg(GPIO_Pin_12 | GPIO_Pin_13, GPIO_ModeIN_PU);I2C_Init(I2C_Mode_I2C, 400000, I2C_DutyCycle_16_9, I2C_Ack_Enable, I2C_AckAddr_7bit, MASTER_ADDR);  //初始化了 I2C 接口,设置了通信速率为 400kHztimeout_count_1ms = 0;while(I2C_GetFlagStatus(I2C_FLAG_BUSY) != RESET)   //循环检查 I2C 总线是否忙碌,直到不再忙碌为止{if(timeout_count_1ms >I2C_TIMEOUT_MS) {I2C_GenerateSTOP(ENABLE);return FALSE;}}//发送寄存器地址I2C_GenerateSTART(ENABLE);   //生成起始信号,开始 I2C 通信
// first time send slave address to wake uptimeout_count_1ms = 0;while(!I2C_CheckEvent(I2C_EVENT_MASTER_MODE_SELECT))   //检查是否成功进入主模式。{if(timeout_count_1ms >I2C_TIMEOUT_MS){I2C_GenerateSTOP(ENABLE);return FALSE;}}I2C_Send7bitAddress(KP691000_SLAVE_ADDR_7BIT, I2C_Direction_Transmitter);   //发送从设备地址,指定为发送模式I2C_GenerateSTOP(ENABLE);DelayMs(1);// must delay
// second time send slave addressI2C_GenerateSTART(ENABLE);   //生成起始信号,开始 I2C 通信timeout_count_1ms = 0;while(!I2C_CheckEvent(I2C_EVENT_MASTER_MODE_SELECT))   //检查是否成功进入主模式。{if(timeout_count_1ms >I2C_TIMEOUT_MS){I2C_GenerateSTOP(ENABLE);return FALSE;}}I2C_Send7bitAddress(KP691000_SLAVE_ADDR_7BIT, I2C_Direction_Transmitter);   //发送从设备地址,指定为发送模式timeout_count_1ms = 0;while(!I2C_CheckEvent(I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED))  //检查是否成功进入主发送模式{if(timeout_count_1ms >I2C_TIMEOUT_MS){I2C_GenerateSTOP(ENABLE);return FALSE;}}
//send dataif(I2C_GetFlagStatus(I2C_FLAG_TXE) != RESET){I2C_SendData(reg_adress);}
//read dataI2C_GenerateSTART(ENABLE);timeout_count_1ms = 0;while (!I2C_CheckEvent(I2C_EVENT_MASTER_MODE_SELECT)){if(timeout_count_1ms >I2C_TIMEOUT_MS){I2C_GenerateSTOP(ENABLE);return FALSE;}}I2C_Send7bitAddress(KP691000_SLAVE_ADDR_7BIT, I2C_Direction_Receiver); //发送7位从机地址timeout_count_1ms = 0;while (!I2C_CheckEvent(I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)){if(timeout_count_1ms >I2C_TIMEOUT_MS){I2C_GenerateSTOP(ENABLE);return FALSE;}}
//receive datafor(uint8_t i = 0; i < len; i++){if(i == len - 1){I2C_AcknowledgeConfig(DISABLE);}timeout_count_1ms = 0;while (!I2C_GetFlagStatus(I2C_FLAG_RXNE)) {if (timeout_count_1ms > I2C_TIMEOUT_MS) {I2C_GenerateSTOP(ENABLE);I2C_AcknowledgeConfig(ENABLE);return FALSE;}}cb_data[i] = I2C_ReceiveData();}I2C_GenerateSTOP(ENABLE);I2C_AcknowledgeConfig(ENABLE);   // 恢复默认 ACK 状态return TRUE;
}
/*** @brief read 0x20 reg data* * @return uint8_t */
uint8_t Get_IntgData()
{uint8_t buf[20];if(KP691000_Read_Data(KP691000_SLAVE_ADDR_7BIT, 0x20, buf, 20)){uint16_t voltage  = (buf[1] << 8) | buf[0];         // mVint16_t  current  = (buf[3] << 8) | buf[2];         // mAint16_t  temp_ext = (buf[5] << 8) | buf[4];         // 0.1°Cint16_t  temp_int = (buf[7] << 8) | buf[6];         // 0.1°Cuint16_t rsoc     = (buf[9] << 8) | buf[8];         // 0.01%uint16_t soh      = (buf[11] << 8) | buf[10];       // %uint16_t cycles   = (buf[13] << 8) | buf[12];       // 次uint16_t coulomb  = (buf[15] << 8) | buf[14];       // mAhuint16_t time_empty = (buf[17] << 8) | buf[16];     // minuint16_t time_full  = (buf[19] << 8) | buf[18];     // minPRINT("voltage is %d mV\n current is %d mA\n ex_temp is %d\n in_temp is %d\n rsoc is %d\n soh is %d\n \
cycles is %d\n coulomb is %d mAh\n time_empty is %d\n time_full is %d\n",\voltage, current, temp_ext, temp_int, rsoc, soh, cycles, coulomb,time_empty, time_full);PRINT("---------------------------------------\n");return TRUE;}return FALSE;}
http://www.jsqmd.com/news/796501/

相关文章:

  • 甘肃鸿旺发资源回收:兰州新区正规的变压器回收怎么联系 - LYL仔仔
  • 2026宁夏防腐漆/防锈漆/水漆厂家:聚焦工业涂装选型与环保转型 - 深度智识库
  • 如何用3分钟完成B站字幕提取?这个工具让你告别手动记录时代
  • 【限时解密】Midjourney Acrylic Paint专属LORA微调包(仅开放48小时):内置37种真实丙烯品牌色卡+刮刀/干刷/湿叠技法参数集
  • 程序员裸辞转行网络安全,我只用了 90 天
  • 冷冻离心浓缩仪头部企业盘点:吉艾姆的自动化与耐酸技术 - 品牌推荐大师1
  • 2026年太原高考复读与全日制辅导机构深度横评:宏楼教育vs醍醐vs锐思vs新力惠中vs博远 - 企业名录优选推荐
  • 永辉超市购物卡:回收技巧大揭秘! - 团团收购物卡回收
  • Seraphine:5个步骤打造你的终极英雄联盟智能助手
  • 2026年江苏二手PCB设备买卖与整厂搬迁方案深度指南 - 年度推荐企业名录
  • 无纸记录仪怎么选?十大国产品牌触控与响应实测 - 仪表人叶工
  • 告别IO翻转!用STM32F407的SPI+DMA驱动WS2812彩灯,附CubeMX配置与避坑指南
  • ARMv9 MPAM内存监控器配置与优化实践
  • 2026轻集料混凝土优质厂家推荐指南 廊坊锦茂节能科技有限公司优选 轻集料混凝土 - 奔跑123
  • 成都千恩包装:青白江木托盘定制找哪家 - LYL仔仔
  • 2026年太原高考复读与全日制冲刺机构深度横评|宏楼教育官方联系指南 - 企业名录优选推荐
  • 从REDD数据集到负荷分解实战:NILMTK核心流程详解
  • 半导体博览会全汇总:国内+国际知名展会推荐,覆盖全球行业核心资源 - 品牌2026
  • 别再手动画齿轮了!用Blender这个隐藏插件,5分钟生成参数化齿轮模型
  • NuGet 包全能配方:类库、分析器、MSBuild 集成与 MinVer 版本管理
  • m4s-converter终极指南:3分钟解锁B站缓存视频,永久珍藏你的数字记忆 [特殊字符]
  • 20253906 2025-2026-2 《网络攻防实践》第9周作业
  • 2026年玻化微珠保温砂浆优质厂家推荐指南 廊坊锦茂节能科技有限公司优选 玻化微珠保温砂浆/无机保温砂浆/A级防火保温砂浆 - 奔跑123
  • 银座购物卡回收这三种渠道怎么选择? - 圆圆收
  • 天龙八部GM工具完整指南:快速掌握单机版游戏数据管理技巧
  • 2026广州百达翡丽现货TOP10!广州等地批发透明靠谱口碑佳 - 十大品牌榜
  • 江浙沪导热油系统集成服务 合规资质公司推荐 - 品牌2025
  • ArcGIS符号库一片空白?别慌,手把手教你修复DAO组件缺失问题(附dll文件)
  • MySQL 三层架构 + SQL 执行流程:
  • Void Editor:高性能可扩展代码编辑器的架构设计与实现