拆解探索MagSafe电源接口结构和指示灯变颜色原理

你有没有想过一个Mac的MagSafe接头里面有什么? 控制光线是什么? 在Mac如何知道它是什么样的充电器? 本文探讨的MagSafe连接器内,并回答这些问题。
  2006年由苹果公司推出的MagSafe接头十分方便,他靠磁力吸在Mac身上,插拔方便而且有人踢到电源线时会自动断开,而且不分反正。 连接器上的一个小LED灯改变颜色指示充电状态。
  下面的图片显示了新的MagSafe 2连接器,很苗条,阵脚这样的排列方法使它可以不用区分反正。 充电器和计算机通过适配器检测引脚连通(也称为充电控制引脚),本文将在下面详细解释。 两个接地引脚比别的引脚稍长,所以当你插上连接器他们会首先接触,这点跟USB相同。
<ignore_js_op>

MagSafe接头拆解
  我有一个MagSafe电源电缆发生故障导致燃烧的电源引脚,你可以看到下面的照片,我拆开看看里面究竟是什么。 下面的连接器是一个较旧的MagSafe,跟上边的Magsafe2相比还是有很大区别的。 还要注意,中间适配器引脚远远小于其他引脚,不像MagSafe2。
<ignore_js_op>

  卸下塑料外壳里边有一块软塑料,也许是聚乙烯,有助于弥??漫LED发出的光,并保护底下的电路。
<ignore_js_op>

  切割掉保护电路板的透明塑料涂层,该充电器电线焊接此板的背面上。 只有两根线,电源线和地线连接到充电器。适配器针脚与充电器本身有没有数据通信。
<ignore_js_op>

  拆卸连接器可以看到弹簧加载的“ 波戈销 “,可以形成物理连接到Mac。 塑料部件支撑着针脚,下图左侧的金属块并没有磁力,但可以被Mac的连接器的强力磁铁所吸引。
<ignore_js_op>

  你可以在下图中看到MagSafe连接器的内部电路板非常小,在中间有两个LED,桔黄色/红色和绿色,左边是一个微小的芯片DS2413 1-Wire双通道可寻址开关 。 该芯片有两个功能:控制开关上的状态LED(即“双通道开关”部分),另外它也记录提供充电器的规格和序列号的ID值。
<ignore_js_op>

  该芯片采用1-Wire协议 ,这是一个聪明的系统,可以通过一条线连接低速设备(加上接地)。 1-Wire系统很方便,在这里,Mac可以通过一个适配器检测引脚与MagSafe通信。
了解充电器的ID代码
  您可以在Mac上轻松找到充电器信息(打开“关于本机”,“更多信息”,“系统报告”,“电源”),里边的瓦数和序列号很好理解,但ID、Revision和Family是哪来的? 事实证明,这些都是用于芯片内部连接器1-Wire协议的一部分。
<ignore_js_op>

  1-Wire家族中的每一个芯片都有一个唯一的64位ID(如图可以看到为16进制,每4位可以表示一个数字)。 在1-Wire 标准中,64位ID由8位家族码识别1-Wire器件的类型,一个48位的唯一序列号,以及一个8位非加密的CRC校验用以验证ID是否正确。 这些公司(比如苹果)可以自定义ID号:顶端12位的序列号被用作一个客户ID,接下来的12位数据由客户指定的,而其余的24位为序列号。
  有了这些信息,现在Mac的AC充电器信息来源可依了,下面的图显示了如何用64位ID映射充电器的信息。 ID字段100表明苹果的客户ID,在12位客户的数据(十六进制3C是十进制的60,表明60瓦)的功率和修订,家庭代码BA是1-Wire家族代码为DS2413的芯片。 因此,AC充电器信息实际上是1-Wire芯片的底层信息。
<ignore_js_op>

  有些充电器信息可能是下图的样子,因为一些原因后来的充电器使用家族码为85,这并不代表这是一个85瓦的充电器。以MacSafe2为例,在客户ID中使用7A1表示45瓦,921表示60瓦,AA1表示85瓦。令人奇怪的是,这个85瓦充电器仍然包含60瓦的信息(16进制的3C)。
<ignore_js_op>

如何读ID号
  读取MagSafe接头ID号码很容易,使用Arduino板和一个2K上拉电阻,以及Paul Stoffregen的Arduino 1-Wire库和简单的Arduino程序。
<ignore_js_op>

  连接MagSafe连接器地线外和数据线内适配器感引脚可以让Arduino立即读取并显示的64位ID号,该充电器不需要接电。
<ignore_js_op>

  用来在液晶屏上显示序列号的电路看起来比较复杂,其实只需要利用一个简单的程序,就可以将64ID号码显示出来。
<ignore_js_op>

控制MagSafe状态指示灯
  Mac控制的MagSafe连接器灯光通过适配器引脚发送命令到DS2413 1-Wire开关IC控制两对LED的开启或关闭状态。 通过适配器针脚发送相应的命令到IC,一个Arduino可以随意控制LED。  
<ignore_js_op>

<ignore_js_op>

充电器的启动过程
  每次把 MagSafe 电源插到苹果电脑侧面的接口上时,会经过以下步骤:
  插到电脑上之前,MagSafe 只维持大约 100 µA 的极弱电流
  插头吸到苹果电脑上一瞬间,MagSafe 电源检测到上面说的那股极弱电流遇到了阻性负载,电阻值也吻合,于是开始全功率供电。苹果电脑检测到电源口有供电后,就通过接口中间那个触点读取 MagSafe 芯片里储存的身份信息,确认后就接受供电。
  苹果电脑通过接口中间那个触点发送信号给 MagSafe 电源里的芯片,控制插头上那颗 LED 灯改变颜色以显示供电状态:电池充电中(橙色)还是电池已充满只给主机供电(绿色)。

时间: 2024-10-30 00:11:56

拆解探索MagSafe电源接口结构和指示灯变颜色原理的相关文章

TYPESDK手游聚合SDK客户端设计思路与架构之二:安卓平台统一化接口结构及思路

在上一篇<TypeSDK聚合sdk设计基本原则>中我们提到了,设计聚合sdk需要设计开发平台部分的接口,以及设计发布平台的聚合这2个大模块.那么我们今天就先来讲讲发布平台之一:安卓平台的统一化接口结构和思路. 一.相关的需求 安卓平台的统一化接口,我们需要考虑到具体以下的几点: 1.对外需要有统一的接口,保证不同的渠道sdk 对同一个游戏来说,是调用相同的接口,传递相同的参数 2.对内需要有一套扩展性很好的框架,可以应对不同渠道的sdk差异性 二.设计的模块 那么针对这些考虑点,安卓平台的统一

[转]HTTP报文接口及客户端和服务器端交互原理

1. 协议 a. TCP/IP整体构架概述 TCP/IP协议并不完全符合OSI的七层参考模型.传统的开放式系统互连参考模型,是一种通信协议的7层抽象的参考模型,其中每一层执行某一特定任务.该模型的目的是使各种硬件在相同的层次上相互通信.这7层是:物理层.数据链路层.网路层.传输层.话路层.表示层和应用层.而TCP/IP通讯协议采用了4层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求.这4层分别为: i. 应用层:应用程序间沟通的层,如超文本传送协议(HTTP).简单电子邮件传输(

深入探索spring技术内幕(四): 剖析@Resource注解实现原理与注解注入

一.@Resource注解原理 @Resource可以标注在字段或属性的setter方法上 1.  如果指定了name属性, 那么就按name属性的名称装配; 2. 如果没有指定name属性, 那就按照默认的名称查找依赖对象; 3. 如果按默认名称查找不到依赖对象, 那么@Resource注解就会回退到按类型装配; ① 先写一个自己的@MyResource: import java.lang.annotation.Retention; import java.lang.annotation.Re

JAVA的List接口的remove重载方法调用原理

前言 说真的,平常看源码都是自己看完自己懂,很少有写出来的冲动. 但是在写算法的时候,经常用到java中各种集合,其中也比较常用到remove方法. remove有重载函数,分别传入参数是索引index或者数据Object(指定泛型后自动转换),如果指定泛型是其他数据类型还好,但是指定的是Integer或者是int的话,或者就有点懵了. 这曾经也困惑过我,所以我就唯有用实践解惑了. 测试类设计 测试类一 public class Text { public void remove(int ind

桥接模式:探索JDBC的接口

一.目录概要 二.问题探究 需求:假设要设计一个电脑商场管理系统的某个模块设计,电脑分为品牌和类型两个纬度,我们应该怎么解决? 按照初学者的思路,利用继承就能简单粗暴的实现,那我们来看下这种思路的设计类图. 从电脑纬度划分 package com.aaron.bridge; public interface Computer { public void sale(); } class Desktop implements Computer{ @Override public void sale(

SAP获取函数/接口结构

1 DATA: header_gd TYPE header_fb, 2 tables_gd TYPE rsfb_para WITH HEADER LINE, 3 import_gd TYPE rsfb_para WITH HEADER LINE, 4 export_gd TYPE rsfb_para WITH HEADER LINE, 5 change_gd TYPE rsfb_para WITH HEADER LINE, 6 pname_gd TYPE tfdir-pname. 7 8 hea

结构体的内存空间分配原理

关于内存对齐 一: 1.什么是内存对齐 假设我们同时声明两个变量: char a; short b; 用&(取地址符号)观察变量a, b的地址的话,我们会发现(以16位CPU为例): 如果a的地址是0x0000,那么b的地址将会是0x0002或者是0x0004. 那么就出现这样一个问题:0x0001这个地址没有被使用,那它干什么去了?答案就是它确实没被使用.因 为CPU每次都是从以2字节(16位CPU)或是4字节(32位CPU)的整数倍的内存地址中读进数据的.如果变量b的地址是0x0001的话,

【转】结构体的内存空间分配原理

关于内存对齐 一: 1.什么是内存对齐 假设我们同时声明两个变量: char a; short b; 用&(取地址符号)观察变量a, b的地址的话,我们会发现(以16位CPU为例): 如果a的地址是0x0000,那么b的地址将会是0x0002或者是0x0004. 那么就出现这样一个问题:0x0001这个地址没有被使用,那它干什么去了?答案就是它确实没被使用.因 为CPU每次都是从以2字节(16位CPU)或是4字节(32位CPU)的整数倍的内存地址中读进数据的.如果变量b的地址是0x0001的话,

java代理的学习,通过类实现接口来实现代理。proxy来创建动态类,和InvocationHandler接口的实现,和工作原理。

1.java自带的proxy类可以创建动态类,如果一个类实现了一个接口那么久可以为这个类创建代理. 2.代理:就是当用户要调用一个类的方法时,用户可以通过调用代理,代理通过接口调用原来的类的方法,代理在把方法给用户前可以添加一些方法,如错误日志,用户类的方法运行的时间来监听类方法的性能.当代理完成时候就是当代理调用方法时候,就会启动InvocationHandler里的invoke方法.用户并不知道用户要为哪个类带理,因此在框架中用配置文件来获取代理的类,用户需要用框架时候就修改配置文件即可.