电平转换芯片_6种电平转换的优缺点,你都Get到了吗?

部署运行你感兴趣的模型镜像

6507572ed898e08bb441fb55e295b6a1.png

作者:创易栈,排版:晓宇

微信公众号:芯片之家(ID:chiphome-dy)

作为一名电子设计的硬件工程师,电平转换是每个人都必须面对的的话题,主芯片引脚使用的1.2V、1.8V、3.3V等,连接外部接口芯片使用的1.8V、3.3V、5V等,由于电平不匹配就必须进行电平转换。每个工程师都有自己的 一套转换方案,今天我们将5种电平转换的方法进行汇总,并且总结各种的优劣势,避免设计过程踩坑。

一.  电平转换方法

5种电平转换方法分别是,下午我们会从速率、驱动能力、漏电流、成本、通道数五个维度评价。:

1) 晶体管电平转换方法;2) 专用电平转换芯片;3) 限流电阻电平转换方法;4) 电阻分压电平转换方法;5) 二极管电平转换方法;

1. 使用晶体管转换电平

如下图1,使用2个NPN三极管,将输入信号电平VL和转换为输出电平VH,使用2个三极管的目的是将输入和输出信号同相,如果可以接受反相,使用一个三极管也可以。

71a5a1a3f1637a6ab175ca05cd71a3bf.png图1;晶体管进行电平转换

优势:

1) 便宜:三极管容易常见并且容易采购,价格低廉(批量几分钱一个)。2) 驱动能力强:驱动能力取决于三极管,可以做到数十mA;

3) 漏电流低:In  和OUT两者之间的漏电流较小(uA级别),几乎可以忽略不计。

劣势:

1) 速度:两级三极管属于电流驱动型,加上电路和寄生电容,转换后的波形不是十分理想。一般只能用于100K以内的信号转换。2) 器件多:同相转换需要2个三极管以及配套的电阻,多路转换时占用空间较多。

2. 使用专用电平芯片转换电平

如下图2,使用专用的电平转换芯片,分别给输入和输出信号提供不同的电压,转换由芯片内部完成,例如MCP2551/3221等电平转换芯片。专用芯片是最可靠的电平转换方案,5个优点里面占据了4个,除了成本。

6eb14a929a58d87edf4cdf17b9f81be5.png图2;专用电平转换芯片

优势:

1) 驱动能力强:专用芯片的输出一般都使用了CMOS工艺,输出驱动10mA不在话下。2) 漏电流几乎为0:内部是一些列的放大、比较器,输入阻抗非常高,一般都达到数百K。漏电流基本都是nA级别的。3) 路数较多:专用芯片针对不同的应用,从2路到数十路都有,十分适合对面积要求高的场合。

4) 速率高:专用芯片由于集成度较高,工艺较高,,速率从数百K到数百M的频率都可以做。

劣势:

1) 成本:专用芯片集众多优势于一身,就是成本是最大的劣势,一个普通的数百K速率的4通道电平转换芯片,价格至少要1元人民币以上,如果使用三极管做,成本2毛钱都不到。

3. 使用电阻分压转换电平

如下图3,R2和R3构成分压,下图中Vgprs=3.3*5.6K/(1K+5.6K)=2.8V。GPRS模块的的TX由于在发送端,2.8V在右边的接收范围内,所以不需要分压,只需要增加一个电阻限流。

95c9457076b0b2ccf372c8ec4b04b179.png图3;电阻分压法电平转换优势:1) 便宜:便宜是最大的优点,2个电阻一分钱不到;

2) 容易实现:电阻采购容易,占用面积小。

劣势:

1) 速度:分压法为了降低功耗,使用K级别以上的电阻,加上电路和器件的分布和寄生电容,速率很难上去,一般只能应用于100K以内的频率。2) 驱动能力:由于使用了大阻值的电阻,驱动能力被严格控制,并不适合需要高驱动能力的场合,例如LED灯等3) 漏电:漏电是该方案最大的缺点,由于通过电阻直连,左右两端的电压会流动,从而互相影响。例如,RS232接口采用该方案,上电瞬间外设就给主芯片提供2.8V的电平,轻则影响时序导致主芯片无法启动,重则导致主芯片闩锁效应,烧毁芯片。

4. 使用电阻限流转换电平

有一些技高人胆大的工程师,有时候还会使用一个电阻限流的办法,实现两个不同电平之间的转换。具体的现实原理就是利用芯片的输入电流不超过某个值,例如74HC系列的芯片的输入电流值不能超过20mA,即可认为是安全的,如果是5V转3.3V,只要电阻>(5-3.3V)/20mA=85Ω,选择一个1K的电阻,则认为是安全的。因为芯片内部是可以等效一个负载电阻RL,与R1构成分压的关系。

ca3200df9f4f9811850d25d695d33e2c.png图4;电阻限流法电平转换优势:1) 便宜:便宜是最大的优点,只需要一个电阻就解决。

2) 容易实现:电阻采购容易,占用面积小。

劣势:

1) 使用电阻限流法需要具备很高超的技术(作者自认为无法驾驭),不仅需要十分熟悉芯片内部的构成,而且还要考虑限流后的电压范围,最关键的是,出问题了以后还容易和芯片厂家扯皮,使用这类方案的工程师,胆是大了,技不一定高。

5. 使用二极管钳位转换电平

有一些工程师还经常使用二极管钳位的方法进行电平转换,如下图左是3.3V转5V,当3.3V电平为高时,5V输出电压=3.3V+Vd=3.3+0.7≈4V,到达5V的高电平阈值,当3.3V电平输出为低时,5V电平输出电压约=Vd≈0.7V,在低电平阈值范围内。

如下图右是5V转3.3V,输入是高电平时,3.3Vout=3.3V+Vd≈4V,当5V电平输入为低电平时,3.3Vout=0V。

dd42606e33ba6f0645cce272c0193c53.png图5:3.3V转5V(左),5V转3.3V(右)优势:1) 漏电流小:由于二极管的漏电流非常小(uA级),可以单向防止电源倒灌,防止3.3V倒灌到5V。

2) 容易实现:二极管、电阻采购容易,占用面积小。

劣势:

1) 电平误差大:主要是二极管的正向压降较大,容易超出芯片的工作电压范围。2) 单向防倒灌:只能单向防止倒灌,不能双向防止倒灌。3) 速度和驱动能力不理想:由于电阻限流,驱动速度和能力均不理想,只能应用在100K以内的频率。4) 所需器件较多。

二. 使用DIALOG GREENPAK的芯片

DIALOG的GREENPAK芯片是一种可编程逻辑芯片,它功能强大,应用广泛,电平转换在GREENPAK中是非常简单的一种应用,任何双电压轨的GREENPAK芯片都 可以非常简单的实现电平转化。例如SLG46826V (https://www.dialog-semiconductor.com/SLG46826-datasheet)

通常在系统级设计中,需要组合来自两个不同电平的信号,例如模拟电压轨工作在 5V,而数字电压轨工作在 3.3V。许多 GreenPAK 通过使用双电压轨来解决这个问题,来自 不同电平的信号都可以输入到 GreenPAK,进行处理,然后 从任意电压轨输出。当使用双电压轨的器件来开始进行一个设计的时候,需要 下图所示的那样,分别输入 2 个电压轨的电压范 围, 两个电压轨的工作范围随不同器件而有所不同,但是 VDD 轨总是电压较高的轨。c3b2cc055d940b192983b744fffff668.pngfe5c0cb1c0cc55c596537af8a9370d7e.png

三. 总结

上述6种电平转换方法是比较常见的方法,电平转换主要考虑以下几个维度:

1) 电平匹配:这个最重要,转换后的电平需要在对方承受的范围之内。2) 漏电流:两者之间不但电平要匹配,漏电流还不能互相影响,这个是最常犯的错。作者就见过,有工程师使用二极管电平转换做RS485输出,结果外部设备的漏电流过来影响自己设备的开机,而且自己的设备启动时输出一堆乱码,影响对方正常工作。3) 驱动能力:电平转换以后还要考虑驱动能力,例如I2C电平转换后,挂载多个I2C设备就需要考虑驱动能力的问题。4) 速度:理论上,所有的电平转换都是有速度牺牲的,速度最优的方案是专用电平转换芯片,其次是三极管方案,最差的就是电阻分压方案。5) 成本:成本这个因素交给产品经理考虑吧。6) 路数:太复杂的转换方案不适合多路数的情况,会占据板卡太多的面积。例如4bit的SD卡信号1.8V转3.3V,就不适合使用三极管方案。7) GREENPAK的可编程逻辑芯片是近年慢慢进入中国的半导体市场,在各种各样的应用场景均可以找到它的应用,它是基于芯片平台的功能应用开发。

推荐阅读

3b35b38a458f88d9faeccf763e8a826d.png  电子漫画系列,更新九张图片。

3b35b38a458f88d9faeccf763e8a826d.png 【最强干货】618个3D封装免费分享

3b35b38a458f88d9faeccf763e8a826d.png 【干货第二波】一大波3D封装免费分享

3b35b38a458f88d9faeccf763e8a826d.png  贴片电容国内外品牌

3b35b38a458f88d9faeccf763e8a826d.png  DC-DC电源芯片国内外品牌大汇总

3b35b38a458f88d9faeccf763e8a826d.png  几毛钱的32768晶振,这也能写出一篇干货?

3b35b38a458f88d9faeccf763e8a826d.png  车牌识别控制板原理图+PCB+3D齐全无私分享

3b35b38a458f88d9faeccf763e8a826d.png 【视觉盛宴】你没见过的电子元器件的另一面!

3b35b38a458f88d9faeccf763e8a826d.png  完全由C编写,高度可移植,超级牛逼的菜单架构!

3b35b38a458f88d9faeccf763e8a826d.png 【视频】老外教你三极管和MOS管的通电效应,我就不信还有不懂的!

40fbfe99fba36d1d20f79076bb1224d5.png

请戳右下角,给我一点在看!dc17adb7d3d14e51ef04350686e54c91.gifdc17adb7d3d14e51ef04350686e54c91.gifdc17adb7d3d14e51ef04350686e54c91.gif

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

<think>好的,我现在需要分析用户提供的这段代码,并给出详细的解释。用户提供的代码是一个静态内联函数`gpio_get_value`,它调用了另一个函数`__gpio_get_value`。用户的问题是关于这段代码的含义。 首先,我应该先理解代码的结构和各个部分的作用。这段代码看起来是内核或嵌入式系统中用于获取GPIO(通用输入输出)引脚的值的函数。函数被声明为`static inline`,这意味着它可能在头文件中定义,以避免多次定义的错误,并且内联展开以提高性能。 接下来,我需要解释每个关键字的作用。`static`关键字限制了函数的作用域,使其仅在定义它的文件中可见,防止命名冲突。`inline`建议编译器尽可能将函数内联展开,减少函数调用的开销,尤其是在频繁调用的小函数中。 函数返回类型是`int`,参数是`unsigned int gpio`,表示传入的GPIO编号。函数体中直接调用了`__gpio_get_value(gpio)`,并返回其结果。这说明`__gpio_get_value`可能是底层实现的具体函数,可能在其他地方定义,比如在驱动或平台相关的代码中。 然后,我需要考虑这段代码的上下文。通常在内核或嵌入式系统中,GPIO操作会有不同的层次结构。可能有一个通用的接口,而具体的实现由底层函数完成。这里的`gpio_get_value`作为封装函数,提供了更高级的接口,而`__gpio_get_value`负责实际的硬件操作。 用户可能不太清楚为什么需要这样的封装,或者`static inline`的作用是什么。因此,在解释时需要涵盖这些点,并说明这种设计的好处,比如提高代码的可维护性和效率。 此外,用户可能对GPIO的基本概念不太熟悉,可能需要简要说明GPIO是什么,以及获取GPIO值的基本操作。但根据用户之前的问题和提供的代码,他们可能已经有一定的背景知识,所以可以适当简化这部分。 还需要注意代码中的潜在问题,例如是否检查了GPIO的有效性,或者是否处理了错误情况。但根据提供的代码,这里只是简单的转发,具体的错误处理可能在底层函数中完成。 最后,总结这段代码的作用:提供一个高效、封装良好的接口来获取指定GPIO引脚的值,同时保持底层实现的独立性,便于移植和维护。 在生成相关问题时,需要考虑用户可能的后续疑问,比如底层函数的实现、错误处理机制、内联函数的优缺点,以及GPIO操作的其他相关函数等。确保相关问题覆盖代码的不同方面,帮助用户深入理解。</think>这段代码是Linux内核或嵌入式系统中用于获取GPIO(通用输入/输出)引脚电平状态的**静态内联函数封装**。以下是详细解析: --- ### **1. 代码结构分析** ```c static inline int gpio_get_value(unsigned int gpio) { return __gpio_get_value(gpio); } ``` #### **关键字解析** - **`static`**:限制函数的作用域为当前文件,避免与其他文件的同名函数冲突。 - **`inline`**:建议编译器将函数体直接内联到调用处,减少函数调用开销(适用于短小频繁调用的函数)。 - **`int`**:返回值类型,表示GPIO的电平状态(通常`0`为低电平,`非0`为高电平)。 - **`unsigned int gpio`**:参数为GPIO编号(如`GPIOA_3`)。 #### **函数作用** - **功能**:通过调用底层函数`__gpio_get_value`,返回指定GPIO引脚的当前电平值。 - **封装目的**:向上层提供统一接口,隐藏底层实现细节(如硬件寄存器操作)。 --- ### **2. 底层函数 `__gpio_get_value`** - **可能的实现位置**:平台相关代码(如`arch/arm/mach-xxx/gpio.c`)或GPIO控制器驱动中。 - **典型实现逻辑**: ```c int __gpio_get_value(unsigned int gpio) { void __iomem *reg = gpio_to_reg(gpio); // 获取对应寄存器地址 return (readl(reg) >> gpio_to_bit(gpio)) & 1; // 读取特定位的值 } ``` - **关键操作**: - **寄存器映射**:将GPIO编号转换为对应的硬件寄存器地址。 - **位操作**:通过移位和掩码提取目标GPIO的电平状态。 --- ### **3. 使用场景** - **示例**: ```c int value = gpio_get_value(GPIOA_3); // 读取GPIOA的第3引脚电平 if (value) { printk("GPIOA_3 is HIGH\n"); } else { printk("GPIOA_3 is LOW\n"); } ``` - **常见用途**: - 检测按键状态。 - 读取传感器信号。 - 调试GPIO输出是否生效。 --- ### **4. 注意事项** 1. **GPIO有效性检查**: - 调用前需确保`gpio`编号合法(如通过`gpio_is_valid(gpio)`验证)。 2. **上下文限制**: - 不能在中断上下文或原子操作中调用可能睡眠的函数(但此处为纯寄存器读取,通常允许)。 3. **同步问题**: - 多线程访问时需加锁,防止竞态条件(若底层实现涉及共享资源)。 --- ### **5. 与旧版GPIO接口的区别** - **旧版直接操作寄存器**: ```c // 直接读写寄存器(不推荐,缺乏封装性) #define GPIOA_INREG 0x100 int value = (__raw_readl(GPIOA_INREG) >> 3) & 1; ``` - **新式封装优势**: - **可移植性**:通过`gpio_to_reg`抽象硬件差异。 - **可维护性**:统一接口便于修改底层实现(如更换芯片)。 --- ### **6. 扩展知识** - **GPIO子系统架构**: - 用户空间(`/sys/class/gpio`) ↔ 内核空间(`gpiolib`) ↔ 驱动层(`__gpio_get_value`)。 - **性能优化**: - `inline`减少函数调用开销,适合高频操作(如PWM波形生成)。 - **错误处理**: - 若`__gpio_get_value`返回错误码(如`-EINVAL`),需上层检查。 --- ### **总结** 该函数通过静态内联封装,提供了高效、简洁的GPIO电平读取接口,是Linux内核中GPIO子系统分层设计的典型体现。其底层实现依赖平台代码,但上层开发者仅需关注GPIO编号和返回值即可。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值