资讯详情

MCU--新塘N76E003--IIC

I2C 总线提供串行通信模式 MCU 与 EEPROM,LCD控制模块、温度传感器等。 I2C 用两条线 (数据线SDA 和时钟线 SCL) 将数据传输到设备间。 I2C 主机和从机之间的双向数据传输可用于多主机系统,支持无中央主机和多主机系统,主机和主机之间的总线仲载传输,同步时钟SCL允许设备间使用不同比特率的数据传输。支持主发、主收、从发、从收四种传输方式。 I2C 总线仅支持 7位地址。支持广播呼叫和标准速率传输 (100kbps) 和快速传输( 400k bps)

功能描述 对于双向传输操作,SDA 及SCL 引脚必须配置为泄漏模式,形成逻辑线和功能:当总线上有一个设备输出0时,总线 线为0电平,所有设备全输出1,总线为高电平,需通过外部上拉电阻拉高电平。N76E003, 在设置 I2CEN (I2CON.6)使能I2C必须在功能之前进行SCL,SDA逻辑1状态下的输出

I2C 空闲时,两条线都为高。这时任一设备都可以做为主机发个起始位 START 数据传输开始,停止位置 STOP 在出现之前,总线被认为很忙。主机产生串行时钟脉冲、起始位置和停止位置。如果总线没有START起始 信号,所有总线设备被认为没有找到地址,硬件自动匹配自己的地址或广播呼叫地址,(广播地址可以自由 GC (I2ADDR.0)使能或禁止.)。如果地址匹配,就会中断。 I2C总线上传输的每个字节包含8个数据位(MSB优先)和一个响应位,共9位。但是每次传输的字节数量并不清楚 定义(起始位 START 和停止位 STOP字节数之间) ,但每个字节都应该有一个响应位。主机产生8小时钟脉 冲,传输8位数据。第八个时钟SCL下沿后,由SDA脚输出数据后,SDA将输入模式转换为第9个时钟脉冲,读取第9个响应位。第9个时钟脉冲后,如果数据接收器未准备好接收下一个字节,则可以拉动时钟线以保持低,并悬挂传输。接收器释放时钟线SCL未来,传输将继续。

开始和停止条件 I2C 总线时序定义了开始START (S)和结束STOP (P)的条件。时钟SCL数据线为高时SDA从高电平到低电平的跳跃被认为是开始START标志。时钟SCL数据线为高时SDA从低电平到高电平的跳变被认为是结束STOP标志。起始和结束都是由主机产生的,起始和结束被认为是总线忙碌的状态。在成功判断结束条件后,主机释放总量 在线路上,所有设备都回到监控总线的起始状态,之前的呼叫从机也变成了未寻址从机。 I2C总线进入空闲状态,等待下一个开始START信号,开始下一次传输。 如果主机发出停止位STOP,传输停止了。然而,主机也可以重新启动,而不是发送停止位置START信号(Sr)继续与上一个地址通信,或更改地址继续通信。各种阅读/写作组合格式操作可能存在传输。

7位地址数据格式 起始位 START 之后, 第一个字节必须是7位地址SLA 第8位读写方向位( W)用于定义目标从机地址和从机器写入或读取数据。如果第八个是0,也就是说SLA W,表示主机从下一个字节到从机写数据;如果是1,即SLA R,就表

从字节开始,主机向从机读取数据。因此,一个典型的数据包含起始位置 START,SLA W/R,一个或多个字节数据,最后停止 STOP。当一个从机已经通过字节找到并阅读时SLA W/R,随后,8位数据随之前的设置传输。 I2C还有一种特殊的寻址方式,广播呼叫寻址。 在此模式下,发送的首字节数据为0。 主机希望将相同的数据传输给所有从机。此寻址方式启用。软件决定是否发送应答。如果某个从机发送响应,该从机收发后续数据,与标准从机接收相同。注意:地址0x默认用于广播呼叫,不能用于普通从机地址。理论上,共有7个地址I2C 总线,共可以连接127个设备,地址由1至127。

在数据传输过程中,时钟高电平时,SDA数据内容需要保持不变。SCL为低时,SDA可以改变内容。

应答ACK 每字节传输SCL第九脉冲用于传输响应位置 (ACK)。通过将SDA为了允许接收端(无论是主机还是从机)端(主机或从机)。主机产生响应时钟。在响应时钟高电平周期内,发送端设备需要放弃SDA的控制。ACK 低电平信号。在响应位时钟周期的高电平时,SDA保持低电平,表示接收端已成功接收到发送端的数据。在整个传输过程中,每个字节都需要回复响应位置。当从机接收无法回应时(NACK)从机地址时,从机将SDA线路保持高,使主机停止(STOP)或发送重复开始(START)信号。

如果从机接收到没有响应的从机地址,则将自己切换到未找到的从机模式,以便无法接收更多的数据字节。此时,从机器将SDA线拉高,此时主机应发送停止STOP信号或重复开始(repeated START)信号。

如果主机接收,主机控制接收字节的数量的数量。最后一个字节收发后,主机不发送响应信号,从机器端切换到未找到地址的从机模式并释放SDA以便主机直接发送停止位置STOP 或重开始位START。

仲裁 主机只能在总线空闲时启动传输。可能有多个设备同时启动开始位置START试着启动数据传输,然后总线就会出现 仲裁。在这种状态下,当SCL为高时,SDA仲裁信号显示在上面。在仲裁过程中,第一个启动主机对SDA线置1(高电 另一个主机发送0(低电平),发送后主机会对SDA由于线与,在线信号与自己发出的信号进行了比较 时钟的原因SCL高时,发送0的主机会成功,发送1的主机会失败。发送失败的主机立即切换到未被发现的主机 地址的从机状态,以确保仲裁胜利的主机能够找到地址。同时,数据线也被释放,回到地址检测状态,仲载失败 直到字节结束,主机仍然会发送时钟。 仲裁机制让每个主机发送数据时,都会同时比较总线上的数据是否与自己发送的一致。注:如果其它主机发送 0.发送1的主机在仲裁中失败,只有一个主机会持续到总线。如果两个主机同时向一个从机器发送数据,地面 第二个字节将继续仲裁。

I2C 总线的仲裁机制使得总线上的设备有多个主机,没有优先级。从机不参与仲裁。

I2C控制寄存器 I2C共有五个控制寄存器: I2CON, I2STAT, I2DAT, I2ADDR, 和 I2CLK. 这些寄存器用于提供协议控制、状态显示、数据传输、接收和时钟速度控制。配置灵活的应用程序I2CPX (I2CON.0)可以交换SDA,SCL引脚功能。

工作模式 I2C 协议定义了四种模式:主机发送、主机接收、从机接收和从机接收。还有一种特殊的广播呼叫模式,类似于从机接收模式。

主机发送模式 主机向从机发送多个字节,主机产生时钟,因此需要在I2CLK填写设定值。主机发送模式需要将STA (I2CON.5) 置1。此时,一旦检测到总线是空的,主机将发出起始位置START,若成功, SI(I2CON.3) 将被置1,状态码I2STAT置为08H。接下来,该是从机地址和写位(SLA W)写入 I2DAT ,然后清0位SI,总线上发出SLA W。 主机发出SLA W 接收从机应答位置ACK后, SI1、状态码I2STAT = 18H。数据将按用户定义格式发送。所有数据发送后,位 STO (I2CON.4)置1,并清除SI位以发出停止信号STOP,或者可以发送重复起始信号repeat START,而不发送STOP,直接开始新一轮数据传输。

主机接收模式 从机传输数据的主机接收模式。初始化设置与主机发送模式相同,主机发送起始位置后, I2DAT 应写入从机地址和读位 (SLA R)。接收从机应答位置ACK后 SI 被置1和状态码 I2STAT= 40H。 SI 如果清零后开始接收从机数据, AA 位 (I2CON.2) =1.主机收到数据后回应响应位置;如果 AA =收到数据后,主机没有回答NACK。然后主机可以停止或重新开始新一轮传输。

从机接收模式 从机接收模式下,从机接收主机发送的数据。I2ADDR 应写入从机地址,I2CLK内容无效,AA放置1以响应主机的地址搜索。初始化后,从机器进入空闲模式,等待写信号(SLA W)。如果主机仲裁失败,将直接进入从机接收模式。

当从机被写信号时SLA W找址后,需要清除0 SI从主机接收数据。如果在传输过程中AA=0.从机器将在下一个字节返回响应位置NACK,从机也将转换为未寻址从机,联系主机终止,不再接收数据I2DAT保持之以前收到的数据。

从机发送模式 从机发送模式,数据从机发送到主机。I2ADDR及I2CON值后,设备等待直到自己的地址被读取信号(SLA R)寻址。如果主机仲裁失败,也可以进入从机发送模式。

当从机被读取信号时SLA R寻址,需要将SI信号清0用于向主机发送数据。通常,主机在接收每个字节数据后会返回响应答:如果没有接收到响应位,则从机器将在下一次传输中发送全1数据。并将其转换为无地址从机器。如果在传输过程中AA清0 ,从机器将发送最后一个字节数据,并在接下来的传输中发送全1数据,并将自己变成无地址从机器。

各种状态码表示 I2STAT状态寄存器中有两种状态代码不属于25种状态:F8H 及 00H。 F8H 在以前的传输中没有有效的信息表示,SI标志位为0,无I2C 中断产生。 00H 在传输过程中标记总线错误。总线错误是指START 或 STOP在传输过程中出现错误的位置,例如在地址或数据的第二位或应答位。当总线发生错误,SI标志马上会被置1,工作中的节点设备马上切换到未被寻址从机模式,释放SDA 和SCL,并将I2STAT寄存器清0。要恢复总线状态,需要置位STO位并清除SI位,然后STO会由硬件清0,而不需要真正的STOP信号波形,释放总线恢复到正常空闲状态。 有一种特殊情况,当SDA线被强制拉低导致阻塞,START信号或重复起始(repeat START)信号无法成功产生时,从机将失去同步。解决方法是在SCL线上额外多送一个时钟脉冲。通过将STA位置1,总线上产生额外的时钟脉冲,由于SDA始终拉低,SDA线上不会产生START信号。一旦SDA线被释放,正常的START信号送出,状态寄存器上会显示08H,串行传输继续。相同的状况,如果需要发送重复开始 (repeated START)信号受阻,也可以采用上述方式。在上述方式完成传输后,状态寄存器显示10H,而不是显示08H。注:软件无法介入上述总线问题传输。

 

重要说明: 当总线上看到的STATUS 为总线错误(bus error)时, I2C为持续使能状态,由于对I2C模块来说错误并没有清除,无法直接用清除 SI 的方式来停止总线错误,故SI会保持在1。所以,如果程序中用SI来判定当下I2C状态并继续流程时,建议用下述方法来增加程序的稳定性。 解决方法: – 通过对总线送出Stop信号 – 如果送出Stop仍然无效,说明时序已被打乱,需要对I2C总线传输进行关闭再重新开始传输。

 

I2C 超时溢出

N76E003带一组14位超时计数器,用于防止I2C总线故障。一旦使能了超时定时器,计数器开始计数直至溢出,

即如果开启中断,I2TOF位会被硬件置1。当使能计数器,SI置1复位计数器, SI清0后重新开始计数。

若I2C总线出现故障,SI 位长时间不能清0,14位的超时定时器就会溢出,并进入中断。

 

 

I2C 中断 I2C的两个标志位:SI 和 I2TOF。这两个标志都会产生I2C事件中断请求。如果 EI2C (EIE.0) = 1且 EA = 1,当两个标志中的任意一个发生时, CPU 就会去执行中断代码。用户可以读取这两个标志位,来确定中断产生的原因。这两个标志需软件清0。 另外,当使用I2C超时寄存器功能时,必须打开I2C中断用来配合超时的时序,否则I2C超时计数标志不会产生置位。

/*---------------------------------------------------------------------------------------------------------*/
/*                                                                                                         */
/* Copyright(c) 2017 Nuvoton Technology Corp. All rights reserved.                                         */
/*                                                                                                         */
/*---------------------------------------------------------------------------------------------------------*/

//***********************************************************************************************************
//  Nuvoton Technoledge Corp. 
//  Website: http://www.nuvoton.com
//  E-Mail : MicroC-8bit@nuvoton.com
//  Date   : Jun/21/2017
//***********************************************************************************************************

//***********************************************************************************************************
//  File Function: N76E003 I2C demo code, Slave Address of 24LC64 = 0xA0
//
//   ____________           ______________ 
//  |            |   SDA    |             |
//  |            |<-------->|             |
//  |            |          |             |
//  |N76E003(M) |          |   24LC64(S) |
//  |            |   SCL    |             |
//  |            |--------->|             |
//  |____________|          |_____________|
//
//  Microchip I2C EEPROM 24xx64 (64K Bit) is used as the slave device.  
//  The page size are 32Byte. Total are 256 page.
//  If verification passes, Port3 will show 0x78. If there is any failure
//  occured during the progress, Port3 will show 0x00.
//***********************************************************************************************************

#include "N76E003.h"
#include "SFR_Macro.h"
#include "Function_define.h"
#include "Common.h"
#include "Delay.h"

#define SYS_CLK_EN              0
#define SYS_SEL                 2
#define SYS_DIV_EN              0                   //0: Fsys=Fosc, 1: Fsys = Fosc/(2*CKDIV)
#define SYS_DIV                 1
#define I2C_CLOCK               2

#define EEPROM_SLA              0xA0
#define EEPROM_WR               0
#define EEPROM_RD               1

#define LED                     P3
#define PAGE_SIZE               32
#define PAGE_NUMBER             4

#define ERROR_CODE              0x78
#define TEST_OK                 0x00

bit I2C_Reset_Flag;
//========================================================================================================
void Init_I2C(void)
{
        P13_OpenDrain_Mode;                    // Modify SCL pin to Open drain mode. don't forget the pull high resister in circuit
        P14_OpenDrain_Mode;                    // Modify SDA pin to Open drain mode. don't forget the pull high resister in circuit
    
    /* Set I2C clock rate */
    I2CLK = I2C_CLOCK; 

    /* Enable I2C */
    set_I2CEN;                                   
}
//========================================================================================================
void I2C_SI_Check(void)
{
        if (I2STAT == 0x00)
        {
                I2C_Reset_Flag = 1;
                set_STO;
                SI = 0;
                if(SI)
                {
                        clr_I2CEN;
                        set_I2CEN;
                        clr_SI;
                        clr_I2CEN;        
                }     
        }    
}

void One_Page_Read(UINT8 u8PageNumber,UINT8 u8DAT)
{
    UINT8  u8Count;
    UINT16 u16Address;

    u16Address = (UINT16)u8PageNumber*32;

    /* Step1 */
    set_STA;                                /* Send Start bit to I2C EEPROM */
    clr_SI;
    while (!SI);
    if (I2STAT != 0x08)                     /* 0x08:  A START condition has been transmitted*/
    {
        I2C_Reset_Flag = 1;
                printf("\nI2C 'Send STA' error");
                goto Read_Error_Stop;
    }

    /* Step2 */
    I2DAT = (EEPROM_SLA | EEPROM_WR);       /* Send (SLA+W) to EEPROM */
    clr_STA;                                /* Clear STA and Keep SI value in I2CON */    
    clr_SI;
    while (!SI);
    if (I2STAT != 0x18)                     /* 0x18: SLA+W has been transmitted; ACK has been received */              
    {
                I2C_Reset_Flag = 1;
        printf("\nI2C 'Send SLA+W' error");
                goto Read_Error_Stop;
    }

    /* Step3 */
    I2DAT = HIBYTE(u16Address);             /* Send I2C EEPROM's High Byte Address */
    clr_SI;
    while (!SI);
    if (I2STAT != 0x28)                     /* 0x28:  Data byte in S1DAT has been transmitted; ACK has been received */              
    {
                I2C_Reset_Flag = 1;
        printf("\nI2C 'Send I2C High Byte Address' error");
                goto Read_Error_Stop;
    }

    /* Step4 */
    I2DAT = LOBYTE(u16Address);             /* Send I2C EEPROM's Low Byte Address */
    clr_SI;
    while (!SI);
    if (I2STAT != 0x28)                     /* 0x28:  Data byte in S1DAT has been transmitted; ACK has been received */             
    {
                I2C_Reset_Flag = 1;
                printf("\nI2C 'Send I2C Low Byte Address' error");
                goto Read_Error_Stop;
    }

    /* Step5 */
    set_STA;                                /* Repeated START */
    clr_SI; 
    while (!SI);
    if (I2STAT != 0x10)                     /* 0x10: A repeated START condition has been transmitted */
    {
                I2C_Reset_Flag = 1;
        printf("\nI2C 'Send STA' error");
                goto Read_Error_Stop;
    }

    /* Step6 */
    clr_STA;                                /* Clear STA and Keep SI value in I2CON */
    I2DAT = (EEPROM_SLA | EEPROM_RD);       /* Send (SLA+R) to EEPROM */
    clr_SI;
    while (!SI);
    if (I2STAT != 0x40)                     /* 0x40:  SLA+R has been transmitted; ACK has been received */              
    {
                I2C_Reset_Flag = 1;
        printf("\nI2C 'Send SLA+R' error");
                goto Read_Error_Stop;
    }

    /* Step7 */                             /* Verify I2C EEPROM data */
    for (u8Count = 0; u8Count <PAGE_SIZE; u8Count++)
    {
        set_AA;                             /* Set Assert Acknowledge Control Bit */
        clr_SI;
        while (!SI);
        if (I2STAT != 0x50)                 /* 0x50:Data byte has been received; NOT ACK has been returned */              
        {
                        I2C_Reset_Flag = 1;
            printf("\nI2C 'No Ack' error");
                        goto Read_Error_Stop;
        }
       
        if (I2DAT != u8DAT)                 /* Send the Data to EEPROM */    
        {
                        I2C_Reset_Flag = 1;
                        printf("\nI2C 'Read data' error");
            goto Read_Error_Stop;
        }
        u8DAT = ~u8DAT; 
    }

    /* Step8 */
    clr_AA;                                 /* Send a NACK to disconnect 24xx64 */
    clr_SI;
    while (!SI);
    if (I2STAT != 0x58)                     /* 0x58:Data byte has been received; ACK has been returned */
    {
        I2C_Reset_Flag = 1;
        printf("\nI2C 'Ack' error");
        goto Read_Error_Stop;
    }
    
    /* Step9 */    
      clr_SI;
    set_STO;
        while (STO)                        /* Check STOP signal */
        {
            I2C_SI_Check();
            if (I2C_Reset_Flag)
                goto Read_Error_Stop;
        }
        
Read_Error_Stop: 
        if (I2C_Reset_Flag)
        {
                I2C_SI_Check();
              printf("\nI2C Read error, test stop");
                I2C_Reset_Flag = 0;
        }
}
//========================================================================================================
void One_Page_Write(UINT8 u8PageNumber,UINT8 u8DAT)
{
    UINT8  u8Count;
    UINT16 u16Address;

    u16Address = (UINT16)u8PageNumber*32;

    /* Step1 */
    set_STA;                                /* Send Start bit to I2C EEPROM */         
    clr_SI;
    while (!SI);
    if (I2STAT != 0x08)                     /* 0x08:  A START condition has been transmitted*/
    {
        I2C_Reset_Flag = 1;
        printf("\nI2C 'Send STA' error");
        goto Write_Error_Stop;
    }

    /* Step2 */
    clr_STA;                                /* Clear STA and Keep SI value in I2CON */
    I2DAT = EEPROM_SLA | EEPROM_WR;         /* Send (SLA+W) to EEPROM */
    clr_SI;
    while (!SI);
    if (I2STAT != 0x18)                     /* 0x18: SLA+W has been transmitted; ACK has been received */             
    {
        I2C_Reset_Flag = 1;
        printf("\nI2C 'Send SLA+W' error");
        goto Write_Error_Stop;
    }

    /* Step3 */
    I2DAT = HIBYTE(u16Address);             /* Send EEPROM's High Byte Address */
    clr_SI;
    while (!SI);
    if (I2STAT != 0x28)                     /* 0x28:  Data byte in S1DAT has been transmitted; ACK has been received */
    {
        I2C_Reset_Flag = 1;
        printf("\nI2C 'Send High byte address' error");
        goto Write_Error_Stop;
    }

    /* Step4 */
    I2DAT = LOBYTE(u16Address);             /* Send EEPROM's Low Byte Address */
    clr_SI;
    while (!SI);
    if (I2STAT != 0x28)                     /* 0x28:  Data byte in S1DAT has been transmitted; ACK has been received */
    {
        I2C_Reset_Flag = 1;
        printf("\nI2C 'Send Low byte address' error");
        goto Write_Error_Stop;
    }

    /* Step5 */
                                            /* Write data to I2C EEPROM */
    for (u8Count = 0; u8Count < PAGE_SIZE; u8Count++)
    {
        I2DAT = u8DAT;                      /* Send data to EEPROM */
        clr_SI;
        while (!SI);
        if (I2STAT != 0x28)                 /* 0x28:  Data byte in S1DAT has been transmitted; ACK has been received */
        {
            I2C_Reset_Flag = 1;
                        printf("\nI2C 'Write Data' error");
            goto Write_Error_Stop;
        }   
        u8DAT = ~u8DAT;        
    }
                                            //After STOP condition, a inner EEPROM timed-write-cycle 
                                            //will occure and EEPROM will not response to outside command
                                            /* 0x18: SLA+W has been transmitted; ACK has been received */
    /* Step6 */
    do
    {
              set_STO;                            /* Set I2C STOP Control Bit */
        clr_SI;
        while (STO)                        /* Check STOP signal */
                {
                    I2C_SI_Check();
                    if (I2C_Reset_Flag)
                        goto Write_Error_Stop;
                }
        
        set_STA;                            /* Check if no ACK is returned by EEPROM, it is under timed-write cycle */
        clr_SI;
        while (!SI);
        if (I2STAT != 0x08)                 /* 0x08:  A START condition has been transmitted*/
        {
            I2C_Reset_Flag = 1;
            printf("\nI2C 'Wait Ready' error");
            goto Write_Error_Stop;
        }

        clr_STA;                            /* Clear STA and Keep SI value in I2CON */
        I2DAT = (EEPROM_SLA | EEPROM_WR);   /* Send (SLA+W) to EEPROM */
        clr_SI;
        while (!SI);
    }while(I2STAT != 0x18);

    /* Step7 */
    set_STO;                                /* Set STOP Bit to I2C EEPROM */
    clr_SI;
        while (STO)                        /* Check STOP signal */
        {
            I2C_SI_Check();
            if (I2C_Reset_Flag)
                goto Write_Error_Stop;
        }
        
Write_Error_Stop: 
        if (I2C_Reset_Flag)
        {
                I2C_SI_Check();
                I2C_Reset_Flag    = 0;
                printf("\nI2C Write error, test stop");
        }
        
        
}
//========================================================================================================
void main(void)
{

    Set_All_GPIO_Quasi_Mode;
        InitialUART0_Timer3(115200);
  
    /* Initial I2C function */
    Init_I2C();                                 //initial I2C circuit
    
    /* page0 R/W */
    printf ("\n\n24LC64 Page0 Write (0x55,0xAA...)...");
    One_Page_Write(0,0x55);                     //page0, write 0x55,0xAA,........

    printf ("\n\n24LC64 Page0 Read...");
    One_Page_Read (0,0x55);                     //page0, read  0x55,0xAA,........

    /* page1 R/W */
    printf ("\n\n24LC64 Page1 Write (0x00,0xFF...)...");
    One_Page_Write(1,0x00);                     //page1, write 0x00,0xFF,........
    printf ("\n\n24LC64 Page1 Read...");
    One_Page_Read (1,0x00);                     //page1, read  0x00,0xFF,........

    /* page2 R/W */
    printf ("\n\n24LC64 Page2 Write (0xAA,0x55...)...");
    One_Page_Write(2,0xAA);                     //page2, write 0xAA,0x55,........
    printf ("\n\n24LC64 Page2 Read...");
    One_Page_Read (2,0xAA);                     //page2, read  0xAA,0x55,........

    /* page3 R/W */
    printf ("\n\n24LC64 Page3 Write (0xFF,0x00...)...");
    One_Page_Write(3,0xFF);                     //page3, write 0xFF,0x00,........
    printf ("\n\n24LC64 Page3 Read...");
    One_Page_Read (3,0xFF);                     //page3, read  0xFF,0x00,........

    /* page255 R/W */
    printf ("\n\n24LC64 Page255 Write (0x0F,0xF0...)...");
    One_Page_Write(255,0x0F);                   //page255, write 0x0F,0xF0,........
    printf ("\n\n24LC64 Page255 Read...");
    One_Page_Read (255,0x0F);                   //page255, read  0x0F,0xF0,........

    /* ==== Test Pass ==== */      
    printf ("\n\N76E003 <--> 24LC64, I2C Demo Code test pass...");

    while (1);
/* =================== */
}

 

标签: e003公母对接连接器zwb传感器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台