TLC2543串行ADC芯片:从核心原理到51单片机驱动实战
1. 从芯片手册到项目实战:TLC2543深度解析与避坑指南
在嵌入式系统里,采集模拟信号是家常便饭。早年玩51单片机那会儿,并行ADC芯片是主流,但动辄十几二十个引脚,对本身就紧张的I/O资源简直是雪上加霜。后来遇到了TI的TLC2543,这款12位串行ADC,用4根线就能搞定最多11路模拟量采集,价格还亲民,在当时简直是“神器”。这么多年过去了,虽然现在MCU的片上ADC性能越来越好,但在一些对成本敏感、需要多路隔离采集或者MCU自带ADC不够用的场合,TLC2543依然有它的用武之地。今天,我就结合自己踩过的坑和项目经验,把这颗经典芯片从引脚功能、工作时序到驱动编写、实战要点,掰开揉碎了讲清楚,目标是让你看完就能用起来,少走弯路。
2. TLC2543核心特性与引脚功能全解
2.1 芯片定位与核心优势
TLC2543是一款采用开关电容逐次逼近技术的12位分辨率串行模数转换器。它的核心价值在于“串行”和“集成”。串行通信意味着只需要少数几根线(CS、CLK、DIN、DOUT)就能完成控制和数据传输,极大节省了微控制器的I/O口资源,这对于早期以8051为代表的、I/O口并不宽裕的单片机来说意义重大。集成度方面,它内部集成了一个11选1的模拟多路开关,可以直接连接11路单端模拟输入信号,省去了外部多路复用器,简化了系统设计。其66kbps的采样率和10μs的转换时间,对于多数工控、传感器数据采集等中低速应用场景已经完全够用。
2.2 引脚定义与电路连接要点
TLC2543采用20引脚DIP或SOIC封装,引脚排列清晰。理解每个引脚是正确使用它的第一步。
1. 电源与基准引脚 (VCC, GND, REF+, REF-)
- VCC (引脚20) :电源正极,典型工作电压为5V。这是数字和模拟部分的共同电源,务必保证干净、稳定。
- GND (引脚10) :电源地。 这是最关键的一环 。对于ADC,模拟地和数字地的处理直接影响转换精度。理想情况下,应在芯片附近将模拟地(AGND)和数字地(DGND)通过磁珠或0欧电阻单点连接,并且REF-引脚应直接连接到这个干净的模拟地点。在简单的单板系统中,至少也要保证电源去耦良好,地线走线尽可能粗短。
- REF+ (引脚1) :正基准电压输入。这决定了ADC输入电压的上限。例如,当REF+接5V,REF-接0V(GND)时,ADC的输入量程就是0-5V。基准电压的精度和稳定性直接决定了转换结果的精度。 强烈建议使用专用的基准电压芯片(如TL431、REF5025)为REF+供电,而不是直接取自MCU的5V电源 ,后者通常噪声较大。
- REF- (引脚11) :负基准电压输入。在单极性输入应用中,通常直接接地(GND)。在双极性输入应用中(例如测量-2.5V至+2.5V的信号),则需要接一个负电压或一个偏移电压。
2. 模拟输入引脚 (AIN0-AIN10)
- AIN0-AIN10 (引脚2-9, 13-15) :11路模拟信号输入通道。这些是芯片的高阻输入端。需要注意的是,虽然内部有多路开关,但切换通道后,内部采样电容需要时间建立电压。如果信号源内阻较大,或者切换频率很高,可能会引起建立不充分,导致读数误差。对于高内阻信号,建议在输入端增加一个电压跟随器(运放)进行缓冲。
3. 数字控制与数据引脚 (CS, I/O CLOCK, DATA INPUT, DATA OUTPUT, EOC)
- CS (引脚15) :片选信号,低电平有效。这是串行通信的“闸门”,CS拉低后,CLK和DATA才有效。一次完整的转换周期始于CS的下降沿,终于CS的上升沿。
- I/O CLOCK (引脚18) :串行时钟输入,由主机(MCU)产生。所有数据(控制字和转换结果)的移入移出都同步于该时钟的边沿。TLC2543支持最高4MHz的时钟频率。
- DATA INPUT (引脚17) :串行数据输入,用于向TLC2543写入8位控制字,以配置本次转换的通道、数据格式等。
- DATA OUTPUT (引脚16) :三态串行数据输出,用于读出上一次转换完成的数字结果。当CS为高时,此引脚为高阻态。
- EOC (引脚19) :转换结束指示信号。在转换期间为低电平,转换完成后变为高电平。这是一个非常有用的状态引脚,可以用于中断或查询方式,让MCU精确知道何时可以读取数据,避免盲目延时等待。 在早期的很多示例代码中,为了简化接线和编程,这个引脚被省略了,采用固定延时等待转换完成。这在时序要求不严的场合可以,但对于追求稳定和效率的系统,建议连接EOC引脚。
注意: 在绘制PCB时,模拟信号线(AINx, REF+, REF-)应远离数字信号线(CLK, DIN等),并尽可能用地线包围,以减少数字开关噪声对模拟信号的耦合。
3. 控制字格式与工作模式深度剖析
控制字是MCU与TLC2543对话的“语言”,仅仅8位,却包含了所有配置信息。理解每一位的含义,是灵活运用这颗芯片的关键。
3.1 控制字位定义详解
控制字从高位(D7)到低位(D0)依次通过DATA INPUT引脚送入。其格式如下表所示:
| 位 (MSB -> LSB) | 名称 | 功能描述与配置选项 |
|---|---|---|
| D7-D4 | 通道选择位 | 0000 ~ 1010 : 选择外部模拟输入通道AIN0 ~ AIN10。 1011 : 选择自测试电压1,值为 (REF+ + REF-)/2。 1100 : 选择自测试电压2,值为 REF-。 1101 : 选择自测试电压3,值为 REF+。 1110 : 软件断电模式(功耗降至25μA)。 1111 : 保留。 |
| D3-D2 | 数据长度位 | 01 : 输出数据长度为8位。 11 : 输出数据长度为16位。 其他 (00, 10) : 输出数据长度为12位(默认)。 |
| D1 | 数据顺序位 | 0 : 转换结果数据高位(MSB)在前输出。 1 : 转换结果数据低位(LSB)在前输出。 |
| D0 | 数据格式位 | 0 : 单极性(无符号二进制)输出。输入电压 V IN = REF- 时输出为 0, V IN = REF+ 时输出为满量程 (2 n -1)。 1 : 双极性(二进制补码)输出。输入电压 V IN = (REF+ + REF-)/2 时输出为 0。 |
实操心得1:自测试模式的价值 很多人会忽略1011~1101这三位自测试模式。它们非常有用:
- 硬件调试 :上电后,可以先读取这三个自测试通道的值。如果读到的 (REF+ + REF-)/2 值正确,说明基准电压和ADC核心工作基本正常;如果读REF+和REF-的值正确,说明基准输入通路没问题。这比用万用表一个个量快多了。
- 软件校准 :通过读取内部基准,可以在软件中进行简单的增益和偏移误差校准,提升系统精度。
实操心得2:数据长度与效率的权衡 数据长度位给了我们灵活性。如果你只需要8位精度,可以设置为8位输出模式,这样只需要8个时钟周期就能读完数据,整体传输时间缩短,在需要高速采样的场合有用。但要注意,即使设置为8位输出,内部ADC仍然是12位转换,只是高位被截断了。16位模式则会输出12位数据,并在前面或后面补0(取决于MSB/LSB顺序),方便与16位数据总线的MCU对齐。
3.2 单极性与双极性输出模式
这是容易混淆的一点。
- 单极性模式 (D0=0) :适用于输入信号在REF-到REF+之间变化的情况,比如0-5V。输出是普通的二进制数。假设REF+=5V,REF-=0V,12位分辨率,那么0V对应输出0x000,2.5V对应输出0x800(2048),5V对应输出0xFFF(4095)。计算实际电压的公式为:
电压 = (读取值 / 4095) * (REF+ - REF-)。 - 双极性模式 (D0=1) :适用于输入信号围绕某个中心点(通常是(REF+ + REF-)/2)上下波动的情况,比如-2.5V到+2.5V。输出是二进制补码形式。同样假设REF+=5V,REF-=0V,中心点2.5V对应输出0x000。输入0V(低于中心点)时,输出可能是0x800(-2048的补码表示);输入5V时,输出是0x7FF(+2047)。 这里有个关键点:在双极性模式下,芯片内部并没有真正的负电压测量能力,它只是对输出编码做了偏移。 你的输入信号实际范围必须仍在REF-到REF+之间。要测量真正的负电压,必须将REF-设置为负电压(如-2.5V),REF+设置为正电压(如+2.5V),这样中心点才是0V。
4. 工作时序的微观解读与驱动编写精髓
时序是串行器件通信的“宪法”,理解透了,写驱动就是按图索骥。我们以最常用的“MSB在前,12位数据长度,使用CS控制”的模式为例,结合时序图进行超详细解读。
4.1 一个完整转换周期的时钟级拆解
假设我们已经完成了一次转换,结果数据(假设为0xABC,二进制1010 1011 1100)正锁存在输出寄存器中。现在我们要启动一次对AIN5通道的新转换。
阶段一:启动与上次数据读取 (时钟1-12)
- 初始状态 :CS为高,CLK为低或高(保持稳定),DATA OUTPUT为高阻,EOC为高(表示上次转换已完成)。
- CS下降沿 (Start) :MCU将CS引脚拉低。 在CS下降沿之后,t SU (数据建立时间,至少1.425μs)内 ,MCU需要做两件事:
- 将本次要发送的控制字的最高位(MSB)放到DATA INPUT线上。例如,要读AIN5,控制字高4位是0101,MSB就是0。
- 准备读取DATA OUTPUT线上的数据。此时,DATA OUTPUT会立即退出高阻态,并输出 上一次转换结果 的最高位(A11,即0xABC的bit11,也就是1)。
- 第一个CLK上升沿 :在CS变低且数据稳定至少t SU 后,MCU产生第一个CLK上升沿。在这个上升沿,TLC2543采样DATA INPUT上的数据(0),并将其移入内部输入寄存器。同时,MCU可以在这个时钟上升沿或之后的下降沿去读取DATA OUTPUT上的数据(1),这是上次结果的最高位。
- 第一个CLK下降沿 :MCU拉低CLK。在下降沿,TLC2543将上一次转换结果的次高位(A10,即0xABC的bit10,值为0)送到DATA OUTPUT上。
- 重复过程 (时钟2-11) :MCU在随后的每个CLK上升沿,依次送出控制字的D6, D5, ... D0位。同时,在CLK下降沿,TLC2543依次送出上一次结果的A9, A8, ... A1位。MCU同步读取这些位,并组合成完整的12位数据(0xABC)。
- 关键的第4个CLK下降沿 :在前4个CLK周期,控制字的高4位(通道地址)已被送入。在这个下降沿,TLC2543内部的多路开关会根据这4位地址,切换到对应的模拟输入通道(这里是AIN5),并开始对该通道的电压进行采样,采样电容开始充电。
- 第12个CLK下降沿 :这是本次I/O传输的最后一个时钟。在这个下降沿,发生了几件重要事情:
- TLC2543送出上一次转换结果的最低位(A0)。
- 本次发送的8位控制字已全部载入。
- 模拟输入通道断开,采样保持阶段结束。
- EOC引脚被拉低 ,指示A/D转换核心开始工作。
- MCU此时应将CS拉高 。CS的上升沿并不是必须发生在第12个时钟下降沿,但通常在此后尽快拉高,以结束本次通信周期。
阶段二:转换与等待 (CS高电平期间) 8. 转换进行中 :CS为高,CLK停止。TLC2543利用内部时钟对采样保持的电压进行逐次逼近式转换。这段时间约为10μs(典型值,最大值见 datasheet)。此时EOC保持为低。 9. 转换完成 :约10μs后,转换完成,数字结果被锁存到输出寄存器中。 EOC引脚由低变高 ,这是一个明确的“数据就绪”信号。
阶段三:读取新数据 (下一个周期) 10. 启动新周期 :当MCU检测到EOC变高(或等待足够延时后),便可以开始一个新的通信周期。将CS拉低后,DATA OUTPUT上出现的就是 刚刚转换完成的、AIN5通道数据 的最高位。如此循环往复。
注意: 上电后的第一个转换周期,输出寄存器内容不确定,因此读出的数据是无效的,应在软件中丢弃第一次的读数。
4.2 基于时序的驱动编写策略
根据是否使用EOC引脚,驱动编写有两种策略:
策略一:查询EOC引脚(推荐) 这是最可靠的方式。流程如下:
- 拉低CS,发送控制字,接收旧数据(12个CLK)。
- 拉高CS,结束本次通信。
- 循环查询EOC引脚状态 ,等待其由低变高。
- EOC变高后,立即(或稍后)开始下一个周期,读取有效数据。 这种方式能精确同步MCU和ADC的节奏,避免因时钟频率偏差或温度导致的转换时间微小变化而误读数据。
策略二:固定延时法 这是很多简单示例代码采用的方法。流程如下:
- 拉低CS,发送控制字,接收旧数据(12个CLK)。
- 拉高CS,结束本次通信。
- MCU执行一个固定的软件延时(例如12-15μs) ,确保超过芯片最大转换时间。
- 延时结束后,开始下一个周期读取数据。 这种方法接线简单(省去EOC连线),代码也简单,但可靠性稍差。如果MCU因中断等原因导致延时被拉长,不影响结果,但如果系统时钟加快或转换时间因电压温度变化达到最大值,延时可能不够。 如果采用此法,建议延时值留出至少50%的余量。
5. 与51单片机的接口实战与代码实现
早期51单片机没有硬件SPI,需要用I/O口模拟,这恰恰是理解TLC2543时序的好机会。下面以STC89C52为例,使用查询EOC方式,给出一个经过实战检验的驱动代码。
5.1 硬件连接示意图
假设连接如下:
P1.0-> TLC2543CSP1.1-> TLC2543DATA INPUT (DIN)P1.2-> TLC2543DATA OUTPUT (DOUT)P1.3-> TLC2543I/O CLOCK (CLK)P1.4-> TLC2543EOC(作为输入)VREF+接 5.0V精密基准源VREF-接 GNDAIN0-AIN10接需要采集的传感器信号(可通过RC滤波)
5.2 软件驱动代码详解
#include <reg52.h>
#include <intrins.h> // 用于_nop_()延时函数
// 引脚定义
sbit TLC2543_CS = P1^0;
sbit TLC2543_DIN = P1^1;
sbit TLC2543_DOUT = P1^2;
sbit TLC2543_CLK = P1^3;
sbit TLC2543_EOC = P1^4; // 注意:P1.4需配置为输入模式,通常上电后即为准双向口,可读。
// 函数声明
unsigned int TLC2543_Read(unsigned char channel);
/**
* @brief 从TLC2543读取指定通道的AD转换值
* @param channel: 模拟通道号,0-10对应AIN0-AIN10
* @retval 12位AD转换结果,范围0-4095
* @note 使用MSB在前,12位数据,单极性输出模式。控制字格式:通道号(4位) + 0000(低4位)
*/
unsigned int TLC2543_Read(unsigned char channel)
{
unsigned char i;
unsigned char control_word = 0;
unsigned int adc_value = 0;
unsigned char low_byte = 0, high_byte = 0;
// 1. 组合控制字:高4位为通道号,低4位为0000 (12位,MSB在前,单极性)
control_word = channel << 4; // 通道号移到高4位,低4位为0
// 2. 确保起始状态:CS为高,CLK为低
TLC2543_CS = 1;
TLC2543_CLK = 0;
_nop_(); _nop_(); // 短暂延时,保证稳定
// 3. 启动本次转换周期:拉低CS
TLC2543_CS = 0;
_nop_(); _nop_(); // 等待t_SU时间,这里用几个NOP满足要求
// 4. 发送8位控制字,同时读取12位数据(上次转换的结果)
for(i=0; i<12; i++)
{
// 4.1 准备要发送的数据位 (先发送高位)
if(i < 8)
{
// 发送控制字的相应位
if(control_word & 0x80) // 检查最高位
TLC2543_DIN = 1;
else
TLC2543_DIN = 0;
control_word <<= 1; // 左移,准备下一次发送
}
else
{
// 控制字发送完毕后,DIN状态可以保持不变或置0,通常置0
TLC2543_DIN = 0;
}
// 4.2 产生时钟上升沿,TLC2543在上升沿采样DIN
TLC2543_CLK = 1;
_nop_(); // 保持高电平一段时间
// 4.3 在时钟高电平期间或下降沿前读取DOUT (读取的是上一次的结果)
// 这里选择在下降沿前读取,更稳定
if(TLC2543_DOUT)
{
adc_value |= 0x01; // 先设置最低位
}
// 注意:第一次循环读取的是最高位,但我们现在是按顺序从低到高组合,所以需要左移
// 更清晰的做法:先左移,再或操作
// 我们调整一下逻辑:
// 4.4 产生时钟下降沿,TLC2543在下降沿更新DOUT为下一位
TLC2543_CLK = 0;
_nop_(); // 保持低电平一段时间
// 正确的数据组装逻辑(在下降沿后,数据位已稳定):
// 除了最后一次循环,每次都需要左移
if(i < 11) // 前11次循环,需要左移为新来的位腾出空间
{
adc_value <<= 1;
if(TLC2543_DOUT)
adc_value |= 0x01;
}
else // 第12次循环(i=11),读取的是最低位,不需要再左移
{
if(TLC2543_DOUT)
adc_value |= 0x01;
}
}
// 5. 本次通信结束,拉高CS
TLC2543_CS = 1;
// 此时,控制字已送入,TLC2543开始对选定通道进行采样,并在内部开始转换。
// EOC引脚应已变低。
// 6. 等待转换完成(查询EOC引脚)
while(TLC2543_EOC == 0); // 等待EOC变低(如果此时还未低)?这里需要仔细斟酌。
// 实际上,在第12个CLK下降沿后,EOC才变低。所以这里直接等待变高即可。
// 但严谨起见,先等待变低(确保转换已启动),再等待变高。
// 由于EOC变低很快,可以省略等待低的步骤,直接等待高。
// while(TLC2543_EOC == 1); // 等待EOC变低(可选)
while(TLC2543_EOC == 0); // 等待EOC变高,转换完成
// 7. 函数返回的是本次通信周期读取的“上一次”的转换结果。
// 对于连续采样,这个返回值就是上一次通道的转换值。
// 要获得本次配置通道的值,需要再调用一次本函数。
return adc_value;
}
/**
* @brief 获取指定通道的AD转换值(封装一次,避免歧义)
* @param channel: 模拟通道号
* @retval 本次通道的12位AD值
*/
unsigned int Get_ADC_Value(unsigned char channel)
{
unsigned int dummy_value, actual_value;
// 第一次读取:启动对目标通道的转换,但返回的是无效或上一次的数据
dummy_value = TLC2543_Read(channel);
// 第二次读取:此时返回的才是第一次调用时启动的对`channel`通道的转换结果
actual_value = TLC2543_Read(channel);
return actual_value;
}
// 主函数示例
void main()
{
unsigned int adc_result;
float voltage;
// 初始化...(例如串口等)
while(1)
{
// 读取AIN5通道的电压
adc_result = Get_ADC_Value(5); // 读取通道5
// 将AD值转换为电压 (假设VREF+=5.0V, VREF-=0V)
voltage = (adc_result / 4095.0) * 5.0;
// 处理电压值,如显示、上传等
// ...
// 延时一段时间再进行下一次采集
Delay_ms(100);
}
}
代码关键点解析:
- 双次调用问题 :这是TLC2543串行工作模式的一个特点。
TLC2543_Read函数在一次调用中,完成了两件事:发送本次通道的控制字,并读取 上一次 转换的结果。因此,要得到某个通道的数据,通常需要连续调用两次该函数,第一次是“启动转换”,第二次才是“读取结果”。Get_ADC_Value函数对此进行了封装。 - EOC查询逻辑 :代码中在发送完控制字、拉高CS后,通过
while(TLC2543_EOC == 0);等待转换完成。这是一种 阻塞式查询 ,在转换期间MCU无法执行其他任务。在实时性要求高的系统中,可以将EOC连接到单片机的外部中断引脚,转换完成后触发中断,在中断服务程序中读取数据,这样效率更高。 - 数据组装顺序 :代码中采用了“先左移,再根据DOUT置位最低位”的方式在下降沿后组装数据。务必根据控制字中设置的MSB/LSB顺序来调整组装逻辑。本例是MSB在前,所以第一个读到的位是最高位,需要左移11次。
- 延时
_nop_():_nop_()产生很短的延时(约1个机器周期)。用于保证时钟高低电平的稳定时间满足TLC2543的时序要求(t_SU, t_HOLD等)。对于12MHz晶振的51单片机,一个_nop_()约1μs,足以满足要求。
6. 常见问题、故障排查与进阶技巧
即使理解了原理和时序,实际项目中还是会遇到各种问题。下面是我总结的一些常见坑点和解决思路。
6.1 读数不稳定或跳动大
这是最常见的问题。
- 原因1:电源和基准噪声 。这是首要怀疑对象。用示波器查看VCC和REF+引脚,是否有明显的毛刺或纹波。解决方法:加强电源滤波,在芯片的VCC和GND之间靠近引脚处并联一个10μF的钽电容和一个0.1μF的陶瓷电容。为REF+使用独立的基准电压芯片。
- 原因2:模拟输入信号噪声或阻抗过高 。传感器信号线过长或未屏蔽,引入了干扰。信号源内阻大,导致内部采样电容充电不充分。解决方法:在模拟输入引脚对地加一个小的滤波电容(如100pF-10nF),但注意电容太大会影响信号变化速度。对于高内阻信号,务必使用运放缓冲。
- 原因3:数字信号干扰 。CLK、CS等快速变化的数字线距离模拟输入线或基准线太近,通过寄生电容耦合了噪声。解决方法:优化PCB布局,严格区分模拟和数字区域,模拟地单点连接。
- 原因4:转换期间信号变化 。在TLC2543对某通道采样期间(第4到第12个CLK下降沿),如果该通道的模拟电压发生变化,会导致采样值不准确。确保在采样期间信号稳定。
- 原因5:软件读取时机不对 。如果采用固定延时法,且延时时间不足,可能在转换完成前就读取数据,导致读取的是未完成转换的随机值。增加延时,或改用EOC查询。
6.2 读数始终为0或满量程
- 读数始终为0 :检查模拟输入电压是否确实大于等于REF-?检查REF-是否接地良好?检查控制字的通道选择位是否正确?用万用表测量实际输入引脚电压。
- 读数始终为4095(满量程) :检查模拟输入电压是否超过REF+?检查REF+电压是否正常?可能是输入信号电压超过了基准电压上限。
6.3 多通道采样时的交叉干扰
当快速切换不同通道进行采样时,可能会发现通道间读数互相影响。这是因为内部多路开关切换后,采样电容上可能残留了上一个通道的电荷。
- 解决方法 :在切换通道后,增加一个“ dummy conversion”(虚转换)。即先对目标通道进行一次转换,但丢弃其结果,紧接着再进行一次转换并读取。这样第一次转换的过程可以让采样电容充分建立到新通道的电压上。在要求高的场合,可以降低通道切换速度。
6.4 与带硬件SPI的现代MCU连接
对于STM32、ESP32等带有硬件SPI的现代MCU,连接更加方便。通常将TLC2543的CLK接MCU的SCK,DIN接MOSI,DOUT接MISO,CS接任意GPIO。配置SPI为模式0(CPOL=0, CPHA=0)或模式1(CPOL=0, CPHA=1),需要根据“数据在哪个时钟边沿采样和输出”来匹配。查看TLC2543时序图,数据在CLK上升沿被采样(输入),在CLK下降沿更新(输出)。这通常对应SPI的Mode 0。驱动程序可以使用MCU的SPI收发函数,一次发送8位控制字(同时接收8位垃圾数据),再发送4位0(同时接收低4位数据),然后将接收到的12位数据组合起来。同样需要注意双次调用和EOC同步的问题。
6.5 提高采样率的技巧
TLC2543标称转换时间是10μs,加上12个时钟周期的数据传输时间(例如在4MHz CLK下是3μs),理论最高采样周期约为13μs,即采样率约76kSPS。但要达到这个极限:
- 使用最高的CLK频率(4MHz)。
- 使用EOC中断方式,避免查询或延时的额外开销。
- 优化代码,将CS拉高、启动转换、等待EOC、下次CS拉低之间的MCU操作时间压缩到最短。
- 如果不需要12位精度,可以设置数据长度为8位,这样数据传输只需要8个时钟,节省了4个时钟周期的时间。
最后,再分享一个调试小技巧:在编写好驱动后,不要急于接真实的传感器。先用一个可调电位器,一端接VREF+,一端接GND,中间抽头接到AIN0。通过程序读取AIN0的值,同时用万用表测量电位器抽头的实际电压。调整电位器,观察读取的AD值是否与计算出的电压值线性对应。这样可以快速验证你的硬件连接和软件驱动是否正确,把问题隔离在模拟部分之外。
更多推荐



所有评论(0)