新闻详情

新闻详情

首页 / 资讯中心 / 详情

ARM裸机开发-I2C-LM75

发布时间:2026/9/29 15:07:59来源:尧图网络
ARM裸机开发-I2C-LM75
一.背景LM75,温度传感器.工作电压2.7V-5.5V精度– 25°C to 100°C: ±2°C (Max)– 55°C to 125°C: ±3°C (Max)量程– 55°C to 125°C分辨率9位0.5°COS中断引脚可在传感器的寄存器里配置温度的阈值当温度到达阈值可引发中断。设备地址0x48低三位可通过焊接置0或1表示温度十六进制值乘以分辨率0.5负温度值用补码保存先转为原码再计算通过配置寄存器低三位的值选择不同寄存器本次配置000即读取温度。读取2字节温度舍弃低7位。float get_lm75_temp(void) { short temp; unsigned char s[2]; i2c_read(I2C1, 0x48, 0, s, 2); temp s[0] 8; temp | s[1]; temp 7; return temp * 0.5; }此外对read和write的传输寄存器地址代码进行改进由于寄存器地址可能不止一位AT24C02能存储256字节数据所以char刚好可以表示LMA75从P0-P7也为一字节长度这两都可用char表示但后续操作显示屏时char则不够所以用char类型定义寄存器地址会出现问题用unsigned short reg_address定义地址, int reg_len定义寄存器地址长度改进如下int i 0; for (i 0; i reg_len; i) { // 中断标记位清零 base-I2SR ~(1 IIF); // 发送寄存器地址 base-I2DR reg_address (reg_len - i - 1) * 8; // 等待从机ACK while ((base-I2SR (1 IIF)) 0); }二.底层最下面的硬件层即上篇及本篇使用的传感器AT24C02和LMA75等连接的上面I2C_adapter即SOC芯片内部的I2C控制器具体实现就是适配器驱动这一层最近对I2C的学习所实现的代码其实写的就是控制器这块的代码显然偏底层这部分代码通常为芯片厂商负责写比如使用imx6ull为NXP公司生产所以由他们负责写控制器底层代码而不同芯片厂商生产的芯片对应的寄存器自然不相同。再往上则可以由Linux系统进行调用这些封装好的代码可适配不同芯片屏蔽底层芯片直接面向已经被芯片厂商封装好的函数。图中核心层的i2c_transfer是灵魂函数。当设备驱动调用i2c_transfer时核心层会打包好i2c_msg包含设备地址、读写标志、数据长度然后去调用底层适配器驱动注册好的master_xfer函数指针。底层再根据这个指针去操作真正的 i.MX6ULL 寄存器。master_xfer每个芯片厂商都会写的不管使用哪个芯片想使用I2C都可调用master_xfer。以下为该函数的实现// I2C传输方向 enum I2C_Direction { I2C_Write 0, I2C_Read 1 }; // I2C信息 typedef struct { unsigned char dev_address; unsigned short reg_address; int reg_len; unsigned char *data; int len; enum I2C_Direction direction; }I2C_Msg; void master_xfer(I2C_Type *base, I2C_Msg *msg) //主机_发送/接收不管是哪个芯片厂商生产的在linux系统下都可以调用此函数 { if (msg-direction I2C_Write) { i2c_write(base, msg-dev_address, msg-reg_address, msg-reg_len, msg-data, msg-len); } else if (msg-direction I2C_Read) { i2c_read(base, msg-dev_address, msg-reg_address, msg-reg_len, msg-data, msg-len); } }调用该封装函数实现LM75传感器读取温度float get_lm75_temp(void) { short temp; unsigned char s[2]; I2C_Msg msg { .direction I2C_Read, .dev_address 0x48, .reg_address 0, .reg_len 1, .data s, .len 2 }; master_xfer(I2C1, msg); temp s[0] 8; temp | s[1]; temp 7; return temp * 0.5; }总结Linux社区不管每一款芯片在底层怎么操作自己的寄存器只是提供芯片厂商一个函数比如master_xfer告诉厂商你们负责实现你们自己芯片对应的这个函数而不同厂商则在master_xfer中实现如何操纵自己的寄存器实现好了之后由Linux封装到自己的函数接口i2c_transfer内部再把这个函数接口提供给用户层使用用户使用该i2c_transfer函数也不用考虑底层是哪个芯片厂商生产的底层寄存器是怎么操作的都由芯片厂商实现了。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

阿里云产品手册2025.pdf深度解读:从选型地图到成本看板的四步落地法 2026/9/29 16:13:37

阿里云产品手册2025.pdf深度解读:从选型地图到成本看板的四步落地法

简介:阿里云产品手册2025.pdf面向云计算从业者、企业架构师、开发者及技术选型人员,系统梳理阿里云全栈产品体系,帮助读者快速建立对云平台能力版图的整体认知,解决产品繁多、分类不清、选型困难等问题。资源为单个PDF文件&#x…

阅读更多 →
ARM汇编中BIC与CMP指令的硬件原理与实时优化 2026/9/29 16:13:37

ARM汇编中BIC与CMP指令的硬件原理与实时优化

1. 为什么BIC和CMP是ARM汇编里最常被低估的“组合拳” 在嵌入式开发、Linux内核裁剪、RTOS底层驱动优化,甚至Android HAL层性能调优的实际项目中,我见过太多人一上来就猛啃LDR/STR、跳转指令,却把BIC和CMP当成教科书里的“基础语法”草草略过…

阅读更多 →
高压DC-DC升压模块选型实战指南:从90V到900V的工程决策链 2026/9/29 16:13:37

高压DC-DC升压模块选型实战指南:从90V到900V的工程决策链

1. 为什么“升压模块选型”不是查参数表就能搞定的事?你手头有个传感器需要90V偏置电压,或者工业PLC的继电器驱动要200V直流,又或者某款新型光电编码器明确要求450V供电——这时候打开电商页面搜“DC-DC升压模块”,弹出上千个结果…

阅读更多 →
ARM汇编中BIC与CMP的协同原理与实战优化 2026/9/29 16:13:37

ARM汇编中BIC与CMP的协同原理与实战优化

1. 为什么BIC和CMP是ARM汇编里最常被低估的“组合拳” 在嵌入式开发、Linux内核驱动调试、RTOS底层优化这些真实场景里,我见过太多人把BIC和CMP当成教科书里的“基础指令”匆匆略过——直到某天在性能瓶颈分析中卡死三天,才发现问题出在一条没被重视的BI…

阅读更多 →
栈的三大经典应用:括号匹配、相邻消除与逆波兰表达式求值 2026/9/29 16:13:31

栈的三大经典应用:括号匹配、相邻消除与逆波兰表达式求值

刷算法题刷到代码随想录day11的栈与队列part2,也就是20.有效的括号、1047.删除字符串中的所有相邻重复项、150.逆波兰表达式求值这三道经典题时,我最大的感受是:栈终于开始干正事了。前面part1用栈实现队列、用队列实现栈,更多是结…

阅读更多 →
Linux服务器MySQL自动备份:crontab+mysqldump实战方案 2026/9/29 16:13:30

Linux服务器MySQL自动备份:crontab+mysqldump实战方案

很多人觉得备份是“有空再说”的事,直到某天误删了一张业务表、服务器磁盘突然报废,或者被同事一条 DROP DATABASE 直接清库,才追悔莫及。尤其是Linux服务器上的MySQL,很多人平时连ssh都懒得登,更别说天天盯着数据了…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉