ARM裸机开发-I2C-LM75

ARM裸机开发:LM75温度寄存器读取(IIC)、ADC、逻辑分析仪 (一)转换原理:各种物理模拟信号,通过对应传感器转换为模拟电压信号。ADC通过对模拟电压信号采样、量化(将采样值映射为离散数值)、编码(转换为二进制代码),最终输出数字量。(二)类型:IMX6ULLADC为逐次逼近型,精度和转换速率均为中性能(双积分型,flash型)2.转换速率:高速ADC(音频),低速ADC(温度)eg:测试电压(3.8V) 参考电压(5V)(二)使用地址将A0,A1,A2焊接在GND端,则地址为0x48。(五)温度寄存器为16位只读寄存器,先读高8位再读低8位。 阅读详情

一.背景

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°C) 
OS:中断引脚,可在传感器的寄存器里配置温度的阈值,当温度到达阈值可引发中断。

设备地址: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函数也不用考虑底层是哪个芯片厂商生产的,底层寄存器是怎么操作的,都由芯片厂商实现了。

BMC固件工程师实战指南:裸机环境下的IPMI与Redfish开发 BMC(基板管理控制器)是服务器带外管理的核心嵌入式系统,运行于资源严苛的裸机环境,不依赖Linux或Android等通用操作系统。其技术本质是基于ARM Cortex-A系列处理器,在无MMU、小内存(64–128MB)、窄Flash(4MB)约束下,实现IPMI v2.0协议栈、Redfish RESTful接口、传感器监控及Secure Boot等企业级功能。关键技术涵盖寄存器级硬件驱动开发、中断响应优化(≤5μs)、轻量HTTP服务构建、JSON内存敏感序列化,以及SPI Flash分区管理与OTA 阅读详情

相关推荐

嵌入式虚拟开发实战:QEMU/Renode打破硬件依赖

嵌入式开发常受硬件进度制约,代码与板卡难以同步联调。虚拟软件开发通过模拟CPU、外设与网络环境,将传统依赖实体硬件的开发模式转变为可在主机上运行的软件工程。其核心原理是利用指令集模拟与设备建模,构建与真实目标高度一致的虚拟目标板,从而支持编译、烧录、调试与测试的完整闭环。该技术不仅提升BSP开发、协议调试与单元测试效率,还能结合Docker实现交叉编译环境可复现,并接入CI/CD流水线完成自动化验证。在物联网多节点场景中,Renode的虚拟射频通道可仿真无线组网;QEMU则适用于Linux级系统的快速验证。

weixin_34126557的博客 576

嵌入式学习——ARM(9) IIC(LM75)&adc

很多外设的寄存器地址不是单字节(2字节、3字节等),对原有I2C接口做改造,增加reg_len表示寄存器地址字节长度,循环逐字节发送寄存器地址,从高位字节向低位字节发送。核心逻辑:从最高字节开始移位掩码取出每一字节,写入I2C数据寄存器,等待中断标志;出错直接跳转到stop流程结束传输。

koi77u的博客 196

嵌入式开发进阶:从单片机寄存器操作到Linux系统编程的核心跨越

嵌入式系统开发是连接硬件与软件的关键领域,其核心在于实现对物理设备的精准控制与高效管理。从基本原理上看,嵌入式开发涉及对计算机体系结构、外设通信协议(如SPI、I2C、UART)和实时性机制的深入理解。其技术价值在于能够在资源受限的环境中构建可靠、高效的专用计算系统,广泛应用于物联网、工业控制、消费电子和汽车电子等场景。在具体实践中,开发者需要掌握两种主要范式:在单片机(MCU)层面进行底层寄存器操作和中断管理,以及在嵌入式Linux层面进行系统调用、进程调度和驱动开发。本文聚焦于如何跨越这两种开发模式之间

weixin_30326741的博客 419

i.MX6ULL 裸机开发|I2C(2)

I2C 开发不只是看懂时序波形,更要关注工程上的各种边界场景:跨页写、NACK 应答时机、总线死锁、多字节地址兼容。驱动分层封装是嵌入式工程规范:底层 I2C 只负责总线收发;AT24C02、LM75 这类外设单独写应用驱动。同时要留意 Cortex-A7 的 FPU,裸机开发做浮点计算必须手动开启,否则程序直接崩溃。

weixin_48445537的博客 181

ARM64嵌入式平台Docker容器部署与QorIQ电源管理实战

容器化技术通过Linux内核的命名空间和控制组(Cgroup)机制,实现了轻量级的进程隔离与资源限制,为应用提供了环境一致、快速部署的解决方案。其技术价值在于显著提升了资源利用率和部署效率,尤其适用于边缘计算和嵌入式系统等资源受限场景。在ARM64架构的嵌入式平台(如NXP QorIQ Layerscape处理器)上部署Docker容器时,开发者需要关注系统内核配置、存储驱动选择以及网络设置等工程实践细节。同时,为了在嵌入式环境中实现性能与能效的平衡,必须深入理解并协同利用处理器底层的动态频率调节(DFS)

ozzzzzz的专栏 455

ARM开发板实例全链路:选型、交叉编译、SPI/DMA与实时调试

嵌入式系统开发中,ARM 架构以内核授权和丰富生态成为主流,Cortex-A 面向 Linux/Android,Cortex-M 面向裸机与 RTOS,Cortex-R 侧重硬实时。不同内核对应不同指令集、浮点约定与启动链路,因此交叉编译工具链前缀、编译选项、根文件系统必须匹配,否则程序无法上板运行。掌握从工具链选择、Makefile 组织、串口登录到 SPI/DMA 外设读取的链路,能显著降低开发板选型与调试成本。在机电控制、工业 HMI、边缘计算等场景,这种可复现的上板能力直接决定项目进度。围绕 ARM

weixin_34293911的博客 337

ARM 裸机开发 DAY9 学习笔记

①容量:2Kbit / 256Byte②设备地址:0x502.I2C 温度传感器 LM75①工作电压:2.7V‑5.5V②精度:±2 ~ ±3℃③量程:‑55℃ ~ 125℃④分辨率:9 位(0.5℃)⑤设备地址:0x48⑥存放温度寄存器:0x00⑦读数:2 字节温度,低 7 位舍弃3.开启 FPU:CP11。

m0_69464963的博客 92

别再乱提MR了!手把手教你配置GitLab的CI/CD与分支保护规则,让团队协作更丝滑

本文详细介绍了如何配置GitLab的CI/CD与分支保护规则,以优化团队协作流程。通过设置Protected Branches、MR流水线检查和自动化审批规则,有效防止不规范操作和合并冲突,提升开发效率与代码质量。特别强调MR(Merge Request)的正确使用,确保团队协作更丝滑。

weixin_28840591的博客 235

63、IMX6ULL ADC驱动开发

ADC(Analog-to-Digital Converter,模数转换器)是将转换为的核心模块,是数字系统(MCU/处理器)与物理世界模拟信号交互的桥梁。

weixin_46607526的博客 1087

SDN:使用Postman控制ODL查看和下发流表

所谓,其实可被视作是SDN对网络设备的数据转发功能的一种抽象。在传统网络设备中,交换机和路由器的数据转发需要依赖设备中保存的二层MAC地址转发表或者三层的IP地址路由表,SDN交换机中使用的流表也是如此,不过在它的表项中整合了网络中各个层次的网络配置信息,从而在进行数据转发时可以使用更丰富的规则。其流表中的每个表项结果如下图所示:OpenFlow1.3流表的每个表项由6部分组成:1、匹配域:匹配域即OpenFlow1.0流表中的包头域,用于对交换机接收到的数据包的包头内容进行匹配。Ehter Des。

lyhaoyuhangyuan的博客 2535

使用podman 容器化安装DIFY

本文阐述了使用podman容器化安装DIFY的过程

wengad的博客 1901

【ARM 裸机开发 (IMX6ULL-mini)】I2C协议详解

本文基于 IMX6ULL-mini 开发板,完成串口格式化函数移植与 I2C 驱动开发。先将 printf 映射至 UART1,通过修改 Makefile、补充空 raise 函数实现格式化输出。讲解 I2C 半双工串行总线原理、时序规范与设备寻址机制,介绍 AT24C02 EEPROM 特性。分析 IMX6ULL 的 I2C 相关寄存器,配置引脚复用及时钟分频,编写 I2C 读写驱动,重点实现重复起始信号与 dummy 假读,解决数据错位问题,完成主机与 EEPROM 的 I2C 通信。

2403_89702754的博客 536

【Tableau】解决订阅报表PDF中文显示为乱码(方框)问题

一、问题描述 在tableau server网页端报表中文字符能正常显示,但在订阅后发送到邮箱时,以图片格式呈现的内容中中文字符显示为方框。 网页端报表能正常显示中文字符: 邮件中的报表不能正常显示中文字符: 二、问题分析 网页端字符显示情况是由html编码决定的,而tableau生成图片时是通过所部署的服务器的字体文件显示字体。因此可能是由于Linux服务器缺失相关的字体文件导致网页端选择的中文字体在服务器上缺失对应的字体文件导致的。则考虑在服务器引入对应的字体文件。 三、问题解决 1、查看服务器现有

why_not_study的博客 2833

ARM---I2C协议时序详解以及IMX6ULL使用I2C协议与AT24C02,LM75A芯片通信详解与示例代码

I2C总线协议是广泛应用于传感器通信的同步串行半双工接口。本文详细介绍了I2C总线的基本原理、时序规范及其在IMX6ULL处理器上的实现方法。主要内容包括:1)I2C总线特点;2)关键时序;3)IMX6ULL的I2C控制器寄存器配置;4)以AT24C02 EEPROM和LM75A温度传感器为例,给出了完整的读写操作代码实现,包括初始化、单/多字节读写时序及温度数据采集处理。文中特别强调了硬件设计要点(上拉电阻、引脚复用配置)和软件实现细节(状态检测、时序控制)。

Dlrb1211的博客 219

DolphinScheduler任务状态异常排查:从僵尸任务到数据库修复全流程

本文详细介绍了DolphinScheduler中僵尸任务的识别、诊断与修复全流程,包括数据库层面的SQL操作指南、系统恢复验证方法以及预防措施。针对任务状态异常问题,提供了从基础排查到高级源码分析的完整解决方案,帮助运维人员有效管理系统资源和工作流调度。

weixin_27966471的博客 133

《Cesium 基础知识点》- 申请 Cesium Ion 密钥

一、访问 https://cesium.com/ion/signin/tokens 二、登录/注册 三、申请 四、使用 // 密钥 let defaultAccessToken = 'your token string'; // 设置 Cesium.Ion.defaultAccessToken = defaultAccessToken; // 初始化 let viewer = new Cesium.Viewer('cesiumContainer', {}); ...

前端技术 2571

IMX6ULL嵌入式开发深度解析:I2C优化与ADC应用全攻略

本文基于i.MX6ULL处理器,详细探讨了I2C总线通信优化与ADC模数转换应用方案。在I2C方面,提出多字节寄存器地址兼容处理方案,通过增强型传输结构体和通用传输函数提高代码复用性;针对LM75温度传感器,展示了精确的温度读取实现方法。在ADC方面,详细介绍了控制器配置、校准流程及光敏传感器数据采集实战,采用均值滤波算法提高数据稳定性。文章还提供了FPU启用优化、温度补偿等高级技巧,为构建稳定精确的嵌入式系统提供了完整的技术方案,特别适合物联网和智能硬件开发者参考。

YangXY66的博客 1118

三相五柱式消弧线圈自动测控装置设计与实现

本文设计了一种基于STM32的三相五柱式消弧线圈自动测控装置。该装置采用信号注入法检测系统对地电容电流,通过PID自适应算法调节消弧线圈电感值,实现单相接地故障时的快速补偿。硬件系统包含信号采集、注入、控制执行等模块,软件采用Goertzel算法提取特征频率信号,结合增量式PID实现精确控制。实验结果表明,装置电容检测误差小于2%,调谐响应时间小于50ms,满足配电网对消弧线圈自动调谐的技术要求。

AI的内部世界的博客 239

IMX6ULL裸机 | I2C外设、FPU浮点运算、ADC模数转换

I2C外设开发需牢记设备固定地址、寄存器地址和数据解析规则,AT24C02用于数据存储,LM75用于精准测温,是嵌入式基础外设组合。开启FPU(CP11协处理器)是嵌入式浮点运算优化的基础操作,可大幅提升小数运算、算法运算效率。ADC逐次逼近法基于二分逻辑迭代转换,分辨率直接决定采集精度,固定公式可实现数字值与模拟电压的精准换算。实际项目中ADC原始数据存在干扰误差,需根据信号特性选择均值、高低通、卡尔曼等滤波算法,优化数据稳定性与准确性。

weixin_57202813的博客 301

北京大学MuMo多模态肿瘤分类模型复现与迁移学习

本项目复现了北京大学MuMo多模态肿瘤分类模型,并针对特定医学影像数据集进行迁移学习。MuMo模型通过整合CT、MRI、PET等多模态医学影像数据,显著提升了肿瘤分类准确性。项目内容包括环境配置(Python 3.8+、PyTorch 1.9+)、数据预处理(DICOM/NIfTI格式处理、强度归一化)、多模态数据集类实现,以及训练验证测试集划分。关键特点是采用MONAI医学影像处理库,实现三维医学影像的标准化预处理流程,并支持多种模态数据的并行加载与联合训练,为后续模型复现和迁移学习奠定基础。

max500600的博客 1241

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

裸机环境下I²C总线-设备分层抽象设计与实现

I²C总线是嵌入式系统中连接低速外设的核心通信协议,其本质是一种基于开漏结构、支持多主多从的同步串行总线。理解其起始/停止条件、地址帧格式、ACK/NACK响应机制及严格时序约束(如t_SU;STA、t_HD;DAT),是实现可靠通信的基础。在裸机开发中,传统GPIO模拟方式常导致硬件耦合度高、驱动复用困难、跨平台适配成本大等问题。本方案借鉴Linux内核I²C子系统的总线-设备分层模型,通过函数指针解耦、消息数组驱动、物理层操作集抽象等技术手段,构建零依赖、可移植、易扩展的I²C软件栈。适用于STM32、

weixin_35903223的博客 352

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

嵌入式学习四阶路径:C语言→ARM→Linux→项目实战

嵌入式开发不是通用编程的延伸,而是一套以硬件为中心的技术体系。其核心在于理解代码如何在物理芯片上执行:C语言是直接操作寄存器与内存的底层协议,ARM架构提供了内存管理(MMU)、异常处理和外设映射的真实运行环境,Linux则构建了标准化的硬件抽象与协作框架,最终通过项目实战完成从功能实现到工业交付的闭环。掌握这四个层次的递进关系,才能避开‘会写代码却调不通串口’‘能编译却无法启动内核’等典型陷阱。本文聚焦2024年真实产线技术栈,围绕C语言、ARM、Linux、项目实战四大热词,拆解从裸机驱动到嵌入式Lin

weixin_34081595的博客 1143

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

ARM-lcd屏幕点亮

本文基于IMX6ULL裸机环境,完成eLCDIF驱动4.7寸800×480 RGB LCD屏幕。通过配置IOMUX、像素时钟(PCLK)、行场同步时序及帧缓存地址,实现屏幕点亮。采用ARGB8888色彩格式,利用DMA直接传输像素数据,减轻CPU负担。封装打点、画线等底层函数,并结合LM75温度传感器实时显示温度值,验证了裸机环境下RGB LCD的完整驱动流程与应用能力。

2601_96618090的博客 186

Zynq R5双核温控与OpenAMP通信实战指南

异构多核处理器在现代嵌入式系统中广泛应用,其核心原理是通过非对称多处理(AMP)架构实现任务隔离与并行处理。OpenAMP框架作为标准化解决方案,基于共享内存和RPMsg协议建立核间通信机制,有效解决了多核资源竞争和数据同步问题。在工业控制、电机驱动等实时性要求高的场景中,这种技术能够将关键任务(如温度采集)与非实时任务(如数据上报)解耦,显著提升系统可靠性和响应速度。以Zynq-7000双核Cortex-R5为例,通过OpenAMP实现温控采集与通信任务的协同工作,既保证了实时性,又避免了资源冲突,为复杂

weixin_34054866的博客 327

PYNQ平台I2C总线原理与实战:从时序到Python驱动

I2C总线是一种仅需两根信号线即可挂载数十个设备的同步串行通信协议,其开漏输出与上拉电阻结构实现了多主多从的线与逻辑,而起始/停止条件、ACK/NACK应答机制则构成了可靠传输的协议基础。在嵌入式开发中,I2C凭借极简的物理层和灵活的寻址方式,广泛用于传感器、EEPROM和OLED等外设的连接。PYNQ作为Xilinx推出的Python on Zynq框架,将ARM处理器与FPGA集成,其PS端内置I2C硬核控制器,并通过Linux i2c-dev接口向用户态暴露设备节点。开发者可借助Python的I2C类

weixin_34357928的博客 286

TM4C入门到实战:基于Cortex-M4F的嵌入式开发与底层原理

微控制器是嵌入式系统的核心,而ARM Cortex-M系列凭借高性能与低功耗成为主流架构。Cortex-M4F内核在基础指令集上增加了硬件浮点单元和DSP指令,使PID控制、信号处理等计算任务不再依赖软件模拟,同时时钟树、外设门控、NVIC中断机制共同决定了系统的实时性与稳定性。理解这些原理,不仅有助于从寄存器层面掌握芯片工作方式,也能借助驱动库快速构建工程代码。在电子设计竞赛、工业控制、机器人等场景中,MCU选型和底层开发能力直接影响项目成败。TI TM4C系列微控制器以Cortex-M4F为核心,搭配完

weixin_30345577的博客 360
上一篇: ARM裸机开发-I2C-E2PROM
下一篇: ARM裸机开发-ADC
剑指offer.
博客等级 码龄3年 15粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值