(MTK平台mt8168)通过i2c调试外接MCU管理外接电源项目

news/2025/1/7 21:01:30/

        这个项目是我几年前在mtk方案公司调试的一个比较具有综合性的项目,涉及到知识点有很多,我个人认为算是一个很经典的一个项目,当然这个是对技术人员而讲。我大概总结一下,涉及到i2c,kernel中的timer_list,示波器和逻辑分析仪的使用,还有i2c硬件上的原理,如果host断采用3.3v那么slave端也都是需要3.3v,同样host(CPU)端采用1.8v的话,那么slave(MCU)端也都是需要1.8v,还有android的知识点selinux权限,jave层往kernel层的设备节点是如何写入数据?等等。所以我个人认为这个是很综合性的项目,经过努力和当时的同事(王工)大佬指导,也都是调试成功完成客户需求,最后量产。废话不说,直接开整。

项目名: F716 快充
客户需求:
        客户提供快充小板需要和我们主板 F716 板型实现通讯,将小板的电量(0~100),充电
状态(0 无充电,1 正在充电, 2 充满电)实现和我们主板通讯,将这些信息反馈给系统
端使用,另外还由系统主板端控制小板上两个 usb 通道对外部充电功能。
硬件设计:


1. 所需要的用到的 pin 脚


 

 2. 实物图


 

 3. F716 NFC 硬件部分原理图

 
 

 备注一下 NFC 使用到的是 SCL2 时钟和 SDA2,第二组 i2c 总线


 


 

4. 客户小板的硬件原理


C


aaaa

备注: 调试i2c从设备还是有不少小技巧的,譬如担心同组i2c设备干扰,可以先让硬件暂时移除,譬如恰恰什么Gsensor,lsensor也都是接到这组i2c总线上,那么即可先让硬件干掉先,能正常调通后再焊接回去。

客户提供的信息
从机地器件址:0x75   //设备地址,这个非常重要,通信的关键点
读写电量地址:0x01
电量值:0~100
读取充电状态地址:0x02
充电状态值:0 无充电,1 正在充电, 2 充满电
控制输出部分 1:开关命令 0XA0(关闭) 0XA1(打开)
控制输出部分 2:开关命令 0XB0(关闭) 0XB1(打开)

软件实现原理:
1. 读取 i2c 从设备信息,然后将电量和充电状态反馈给系统。
2. 控制 usb 充电部分,则是通过往新建的节点信息写入值来控制
软件部分:
1. 先保证 i2c 能够通讯成功
示波器抓起的 i2c 波形:不太精确

顺便说一下 i2c 的相关知识:
7-bit 地址格式和读写位
一个 7-bit 的地址是从最高位(MSB) 开始发送的,这个地址后面会紧跟 1-bit(R/W)的操
作符,1 表示读操作,0 表示写操作。 接下来的一个 bit 是 NACK/ACK,当这个帧中前面 8 bit
发送完后,接收端的设备获得 SDA 控制权,此时接收设备应该在第 9 个时钟脉冲之前回复
一个 ACK(将 SDA 拉低)以表示接收正常
,如果接收设备没有将 SDA 拉低,则说明接收设
备可能没有收到数据(如寻址的设备不存在或设备忙)或无法解析收到的消息,如果是这样,
则由 master 来决定如何处理(stop 或 repeated start condition)。

字节格式
SDA 数据线上的每个字节必须是 8 位,每次传输的字节数量没有限制。每个字节后必须跟一
个响应位(ACK)。首先传输的数据是最高位(MSB),SDA 上的数据必须在 SCL 高电平周期
时保持稳定,数据的高低电平翻转变化发生在 SCL 低电平时期。 响应 ACK(Acknowledge)
每个字节传输必须带响应位,相关的响应时钟也由主机产生,在响应的时钟脉冲期间(第 9
个时钟周期),发送端释放 SDA 线,接收端把 SDA 拉低。以上图传输 101010101 为例,SCL
第 9 位时钟高电平信号期间,SDA 拉低其代表了有 ACK 响应位。当在 SCL 第 9 位时钟高电平
信号期间,SDA 仍然保持高电平,这种情况定义为 NACK 非响应位。


问题 1:


http://www.ppmy.cn/news/1561370.html

相关文章

ESP32物联网无线方案,智能穿戴设备联网通信,产品无线交互应用

在物联网的世界里,每一个设备都不再是孤立的个体,它们通过无线连接芯片相互连接,形成一个庞大的智能网络。这些芯片是实现万物互联的基础,它们使得设备能够相互沟通,共享数据,从而创造出无限的可能性。 这…

【51单片机零基础-chapter5:模块化编程】

模块化编程 将以往main中泛型的代码,放在与main平级的c文件中,在h中引用. 简化main函数 将原来main中的delay抽出 然后将delay放入单独c文件,并单独开一个delay头文件,里面放置函数的声明,相当于收纳delay的c文件里面写的函数的接口. 注意,单个c文件所有用到的变量需要在该文…

RedisTemplate执行lua脚本及Lua 脚本语言详解

使用RedisTemplate执行lua脚本 在开发中,我们经常需要与Redis数据库进行交互,而Redis是一个基于内存的高性能键值存储数据库,它支持多种数据结构,并提供了丰富的命令接口。在某些情况下,我们可能需要执行一些复杂的逻…

形象地理解UE4中的数据结构 TLinkedListBase

大家都熟知链表,但不一定能快速看懂UE4中的数据结构。 TLinkedListBase表示“链接”中的一个结点,有三个成员: 一、ElementType Element; 表示具体的业务,例如int链条中的一个整数。 二、NextLink 表示 “下一个Node”&#…

【Blackbox Exporter】prober.Handler源码详细分析

http.HandleFunc(path.Join(*routePrefix, "/probe"), func(w http.ResponseWriter, r *http.Request) {sc.Lock()conf : sc.Csc.Unlock()prober.Handler(w, r, conf, logger, rh, *timeoutOffset, nil, moduleUnknownCounter, allowedLevel)})我们了解到blackbox_ex…

使用mysql报Communications link failure异常解决

背景 线上使用polarDB,基于mysql(5.7),架构为springbootmybatisplusdurid连接池,部分业务场景涉及大表更新和查询操作,在查询慢sql且超过一定时间时就会报出"Communications link failure"异常,主要体现在界…

基于人脸识别和 MySQL 的考勤管理系统实现

在现代企业和机构中,考勤管理系统是日常运营中不可或缺的一部分。传统的考勤方式(如打卡、指纹识别等)有时会因为各种原因导致管理效率低下或员工作弊。然而,随着人脸识别技术的飞速发展,基于人脸识别的考勤管理系统正…

docker学习记录:部署es+kibana

先了解下,基本的知识。 Elasticsearch(ES)是什么?有什么作用? 定义: • Elasticsearch是一个基于 Lucene 构建的开源、分布式、RESTful 风格的搜索和分析引擎。它能够快速地存储、搜索和分析大量数据。 作用: • 全文搜…