十 ARM9(2440)的IIC-理论知识及程序实例

发布者:sky0001最新更新时间:2015-09-23 来源: eefocus关键字:ARM9  IIC 手机看文章 扫描二维码
随时随地手机看文章
概述

S3C2440A RISC 微处理器可以支持一个多主控IIC 总线串行接口。一条专用串行数据线(SDA)和一条专用
串行时钟线(SCL)传递连接到IIC 总线的总线主控和外设之间的信息。SDA 和SCL 线都为双向的。
多主控IIC 总线模式中,多个S3C2440A RISC 微处理器可以发送或接收串行数据来自或到从设备。主机
S3C2440A 可以通过IIC 总线启动和结束数据传输。S3C2440A 中的IIC 总线是使用标准总线仲裁步骤。
为了控制多主控IIC 总线操作,必须写入值到以下寄存器中:
– 多主控IIC 总线控制寄存器,IICCON
– 多主控IIC 总线控制/状态寄存器,IICSTAT
– 多主控IIC 总线Tx/Rx 数据移位寄存器,IICDS
– 多主控IIC 总线地址寄存器,IICADD
当释放了IIC 总线时,SDA 和SCL 线应该都保持为高电平。一个高到低SDA 的变化可以启动一个起始条件。
SCL 稳定保持在高电平时的一个低到高SDA 的变化可以启动一个停止条件。
起始和停止条件通常由主设备产生。第一个数据字节为7 位地址值,其在启动起始条件后放到总线上,可以确
定出主设备要选择的从设备。第8 位是决定传输方向(读或写)。
每个放到SDA 线上的字节都应该总共为8 位。字节可以在总线传输操作期间无限制的发送或接收。数据通常
从最高有效位(MSB)开始始发送,并且每个字节应该立即通过应答(ACK)位跟上。

 

 

I2C总线可构成多主和多从系统。在多主系统结构中,系统通过硬件或软件仲裁获得总线控制使用权。应用系统中I2C总线多采用主从结构,即总线上只有一个主控节点,总线上的其他设备都作为从设备。I2C总线上的设备寻址由器件地址接线决定,并且通过访问地址最低位来控制读/写方向。

目前,通用存储器芯片多为EEPROM,其常用的协议主要有两线串行连接协议(I2C)和

三线串行连接协议。带I2C总线接口的EEPROM有许多型号,其中AT24CXX系列使用十分普遍。产品包括AT24C01、AT24C02、AT24C04、AT24C08、AT24C16等。

AT24系列存储器芯片采用CMOS工艺制造,内置有升压电路,可在单电压供电条件下工作。其标准封装为8脚DIP封装形式。

各引脚的功能说明如下:

SCL:串行时钟。遵循ISO/IEC7816同步协议,漏极开路,需接上拉电阻。在该引脚的上升沿,系统将数据输人到每个EEPROM器件,在下降沿输出。

SDA:串行数据线。漏极开路,需接上拉电阻。双向串行数据线,漏极开路,可与其他开路器件“线或”。

A0、A1、A2:器件/页面寻址地址输人端。在AT24C01和AT24C02中,引脚被硬连接,其他AT24Cxx均可接寻址地址线。

WP:读/写保护。接低电平时可对整片空间进行读/写,高电平时不能读/写,受保护。

Vcc/GND:5V工作电压。

 

设备地址(DADDR)    AT24C04的器件地址是1010。

AT24CXX的数据操作格式

在I2C总线中,对AT24C04内部存储单元读/写,除了要给出器件的设备地址(DADDR)

外,还须指定读/写的页而地址(PADDR)。两者组成操作地址(OPADDR)如下:

                1010 A2 A1 A0-R/W  ,一般A2 A1 A0被硬连接,比如是接地,所以设备地址就是0xa0

 

下面是我摘自别人的文章中关于IIC的描述,写的很好

s3c2440内部有一个IIC总线接口,因此为我们连接带有IIC通信模块的外围设备提供了便利。它具有四种操作模式:主设备发送模式、主设备接收模式、从设备发送模式和从设备接收模式。在这里我们只把s3c2440当做IIC总线的主设备来使用,因此只介绍前两种操作模式。在主设备发送模式下,它的工作流程为:首先配置IIC模式,然后把从设备地址写入接收发送数据移位寄存器IICDS中,再把0xF0写入控制状态寄存器IICSTAT中,这时等待从设备发送应答信号,如果想要继续发送数据,那么在接收到应答信号后,再把待发送的数据写入寄存器IICDS中,清除中断标志后,再次等待应答信号;如果不想再发送数据了,那么把0x90写入寄存器IICSTAT中,清除中断标志并等待停止条件后,即完成了一次主设备的发送。在主设备接收模式下,它的工作流程为:首先配置IIC模式,然后把从设备地址写入接收发送数据移位寄存器IICDS中,再把0xB0写入控制状态寄存器IICSTAT中,这时等待从设备发送应答信号,如果想要接收数据,那么在应答信号后,读取寄存器IICDS,清除中断标志;如果不想接收数据了,那么就向寄存器IICSTAT写入0x90,清除中断标志并等待停止条件后,即完成了一次主设备的接收。在完成上述两个模式时,主要用到了控制寄存器IICCON、控制状态寄存器IICSTAT和发送接收数据移位寄存器IICDS。由于我们只把s3c2440当做主设备来用,并且系统的IIC总线上只有这么一个主设备,因此用来设置从设备地址的地址寄存器IICADD,和用于仲裁总线的多主设备线路控制寄存器IICLC都无需配置。寄存器IICCON的第6位和低4位用于设置IIC的时钟频率,因为IIC的时钟线SCL都是由主设备提供的。s3c2440的IIC时钟源为PCLK,当系统的PCLK为50MHz,而从设备最高需要100kHz时,可以将IICCON的第6位置1,IICCON的低4位全为0即可。寄存器IICCON的第7位用于设置是否发出应答信号,第5位用于是否使能发送和接收中断,第4位用于中断的标志,当接收或发送数据后一定要对该位进行清零,以清除中断标志。寄存器IICSTAT的高2位用于设置是哪种操作模式,当向第5位写0或写1时,则表示结束IIC或开始IIC通讯,第4位用于是否使能接收/发送数据。

 

       由于通讯是双方的事情,在了解了主设备的操作模式后,还要清楚从设备的运行机制,两者要达到完美地结合,才能实现彼此的通讯。在这里,从设备是EEPROM——AT24C02A,要想让s3c2440能够正确地对AT24C02A读写,就必须让s3c2440的时序完全按照AT24C02A的时序。AT24C02A的写操作有两种模式:字节写和页写。字节写是先接收带有写命令的设备地址信息,如果符合就应答,再接收设备内存地址信息,发出应答后,再接收要写入的数据,这样就完成了字节写过程。页写与字节写的区别就是,页写可以一次写多个数据,而字节写只能一次写一个数据。但由于AT24C02A的一页才8个字节,所以页写也最多写8个数据,而且只能在该页内写,不会发生一次页写同时写两页的情况。AT24C02A的读操作有三种模式:当前地址读、随机读和序列读。当前地址读是只能读取当前地址内的数据,它的时序是先接收带有读命令的设备地址信息,如果符合就应答,然后发送当前地址内的数据,在没有接收从主设备发来的应答信号的情况下终止该次操作。随机读的时序是,连续接收带有写命令的设备地址信息和设备内存地址信息,然后主设备重新开启IIC通信,AT24C02A再次接收到带有读命令的设备地址信息,在发出应答信号以后,发送该内存地址的数据,在没有接收到任何应答信号的情况下结束该次通信。当前地址读和随机读一次都只能读取一个数据,而序列读一次可以读取若干个数据,它的时序就是在当前地址读或随机读发出数据后,接收到了应答信号,那么AT24C02A会把下一个内存地址中的数据送出,除非AT24C02A接收不到任何应答信号,否则它会一直把下一个内存地址中的数据送出。序列读没有一页8个字节的限制。

 

       在介绍完了s3c2440和AT24C02A的IIC通讯方式后,我们就可以写程序了。在这里,我们用UART来实现PC机对AT24C02A的读写。UART的通讯协议是,PC机先发送命令字节:0xC0表示要向AT24C02A写数据,0xC1表示要读取AT24C02A的数据,在命令字节后,紧跟着的是设备内存地址和写入或读取的字节数。如果是要写EEPROM数据,则在这三个字节后是要写入的数据内容。在UART通讯完毕后,s3c2440会根据命令的不同,写入或读取AT24C02A,如果是读取EEPROM,则s3c2440还会利用UART把读取到的数据上传到PC机。在这个程序中,我们只开启了UART的接收中断,而没有开启发送中断,即让s3c2440主动去完成发送任务。并且在与AT24C02A操作中,我们使用的是页写和序列读的模式,这样可以最大程度的完成一次读或写操作,而且我们所编写的页写和序列读子程度也同样可以实现字节写和随机读的模式。在这里我们限制一次读或写的数据量最多为8个字节。

下面是用FL2440开发板的程序分析:


#include
#include "2440addr.h"
#include "def.h"
#include "IIC.h"

static U8 _iicData[IICBUFSIZE];
static volatile int _iicDataCount;//发送计数标志
static volatile int _iicStatus;//IIC状态标志
static volatile int _iicMode;//IIC模式标志
static int _iicPt;
extern void Uart_Printf(char *fmt,...);
extern void Uart_Init(int baud);
void Delay(int x);

//===================================================================
//       SMDK2440 IIC configuration
//  GPE15=IICSDA, GPE14=IICSCL
//  "Interrupt mode" for IIC block
//===================================================================

//******************[ Test_Iic ]**************************************
void Test_Iic(void)

 
    unsigned int i,j,save_E,save_PE;
    static U8 data[512];//256
    //Uart_Init(115200);

    Uart_Printf("nIIC Test(Interrupt) using AT24C02n");

    save_E   = rGPECON;
    save_PE  = rGPEUP;
    rGPEUP  |= 0xc000;                  //Pull-up disable
   
    rGPECON &=0xfffffff;
    rGPECON |= 0xa0000000;                //GPE15:IICSDA , GPE14:IICSCL

    pISR_IIC = (unsigned)IicInt;
    rINTMSK &= ~(BIT_IIC);

      //Enable ACK, Prescaler IICCLK=PCLK/16, Enable interrupt, Transmit clock value Tx clock=IICCLK/16
      // If PCLK 50.7MHz, IICCLK = 3.17MHz, Tx Clock = 0.198MHz
    rIICCON = (1<<7) | (0<<6) | (1<<5) | (0xf);
    rIICADD  = 0x10;                    //2440 slave address = [7:1] 实验中没有此语句时也没有影响,因为使用的是主机模式
    rIICSTAT = 0x10;                    //IIC bus data output enable(Rx/Tx)
 rIICLC = (1<<2)|(1);      // Filter enable, 15 clocks SDA output delay       added by junon
    rIICDS = 0xDD;
    Uart_Printf("Write test data into AT24C02n");

    for(i=0;i<256;i++)//256
        Wr24C080(0xa0,(U8)i,i);//向地址0--255写入数据0--255
          
    for(i=0;i<256;i++)//256
        data[i] = 0;//数组清零

    Uart_Printf("Read test data from AT24C02n");
   
    for(i=0;i<256;i++)
        Rd24C080(0xa0,(U8)i,&(data[i]));//将读取的数据存入data数组

        //Line changed 0 ~ f
    for(i=0;i<16;i++)//打印读取的数据  16
    {
        for(j=0;j<16;j++)
            Uart_Printf("%2x ",data[i*16+j]);
        Uart_Printf("n");
    }
    rINTMSK |= BIT_IIC;//屏蔽中断   
    rGPEUP  = save_PE;//恢复GPE口
    rGPECON = save_E;
    while(1);
}

[page]
//*************************[ Wr24C080 ]****************************
void Wr24C080(U32 slvAddr,U32 addr,U8 data)//首地址   内部地址   数据
{
    _iicMode      = WRDATA;//模式标志记为WRDAT
    _iicPt        = 0;//指针记为0
    _iicData[0]   = (U8)addr;//内部地址
    _iicData[1]   = data;// 要写的数据
    _iicDataCount = 2;
   
    rIICDS   = slvAddr;                 //0xa0设备地址
    rIICSTAT = 0xf0;                    //MasTx,Start 启动发送
      //Clearing the pending bit isn't needed because the pending bit has been cleared.
   
    while(_iicDataCount!=-1);//未发送完在此等待

    _iicMode = POLLACK;//发送完后下面等待应答信号ACK

    while(1)
    {
        rIICDS     = slvAddr;
        _iicStatus = 0x100;
        rIICSTAT   = 0xf0;              //MasTx,Start启动
        rIICCON    = 0xaf;              //Resumes IIC operation. 恢复IIC总线
          
        while(_iicStatus==0x100);//未接收到ACk在此等待
          
        if(!(_iicStatus&0x1))
            break;                      //When ACK is received    ACK收到后跳出循环
    }
    rIICSTAT = 0xd0;                    //Stop MasTx condition 停止信号
    rIICCON  = 0xaf;                    //Resumes IIC operation.
    Delay(1);                           //Wait until stop condtion is in effect.恢复
       //Write is completed.
}
       
//**********************[ Rd24C080 ] ***********************************
void Rd24C080(U32 slvAddr,U32 addr,U8 *data)//首地址 内部地址 读取的数据存入的地址
{
    _iicMode      = SETRDADDR;//模式设为SETRDADDR
    _iicPt        = 0;
    _iicData[0]   = (U8)addr;//_iicData[0]存内部地址
    _iicDataCount = 1;//计数值

    rIICDS   = slvAddr;//首地址0xa0
    rIICSTAT = 0xf0;                    //MasTx,Start  启动
      //Clearing the pending bit isn't needed because the pending bit has been cleared.
    while(_iicDataCount!=-1);//未读取完成

    _iicMode      = RDDATA;//完成后进入读取数据模式
    _iicPt        = 0;
    _iicDataCount = 1;
   
    rIICDS        = slvAddr;
    rIICSTAT      = 0xb0;               //MasRx,Start设置为主接收模式
    rIICCON       = 0xaf;               //Resumes IIC operation.恢复IIC总线操作  
    while(_iicDataCount!=-1);//读取未完成

    *data = _iicData[1];//1
}


//-------------------------------------------------------------------------
void __irq IicInt(void)
{
    U32 iicSt,i;
   
    rSRCPND = BIT_IIC;          //Clear pending bit
    rINTPND = BIT_IIC;
    iicSt   = rIICSTAT;//控制状态寄存器
   
    if(iicSt & 0x8){}           //When bus arbitration is failed.总线仲裁失败执行空操作
    if(iicSt & 0x4){}           //When a slave address is matched with IICADD从地址匹配执行空操作
    if(iicSt & 0x2){}           //When a slave address is 0000000b
    if(iicSt & 0x1){}           //When ACK isn't received  未收到应答信号执行空操作

    switch(_iicMode)
    {
       case POLLACK:
           _iicStatus = iicSt;//控制状态寄存器的值赋给_iicStatus
           break;

       case RDDATA:
           if((_iicDataCount--)==0)
           {
               _iicData[_iicPt++] = rIICDS;
           
               rIICSTAT = 0x90;                 //Stop MasRx condition
               rIICCON  = 0xaf;                 //Resumes IIC operation.
               Delay(1);                        //Wait until stop condtion is in effect.
                                                //Too long time...
                                                //The pending bit will not be set after issuing stop condition.
               break;   
           }     
           _iicData[_iicPt++] = rIICDS;         //The last data has to be read with no ack.

           if((_iicDataCount)==0)
               rIICCON = 0x2f;                  //Resumes IIC operation with NOACK. 第一次不产生应答信号进行第二次读取并将第二次读取的
                                                 ///////////////数据存入数组中(第一次和第二次读取的数据实际一样)
           else
               rIICCON = 0xaf;                  //Resumes IIC operation with ACK
               break;

        case WRDATA:
            if((_iicDataCount--)==0)//首地址 ,内部地址和数据都发送完毕后
            {
                rIICSTAT = 0xd0;                //Stop MasTx condition 产生停止信号
                rIICCON  = 0xaf;                //Resumes IIC operation.恢复IIC总线
                Delay(1);                       //Wait until stop condtion is in effect.
                       //The pending bit will not be set after issuing stop condition.
                break;   
            }
            rIICDS = _iicData[_iicPt++];        //_iicData[0] has dummy.第一次中断后将内部地址addr的值存入IICDS  第二次存入要写入的数据
            for(i=0;i<10;i++);                  //for setup time until rising edge of IICSCL//延时
             
            rIICCON = 0xaf;                     //resumes IIC operation.恢复IIC总线
            break;

        case SETRDADDR:
//          Uart_Printf("[ S%d ]",_iicDataCount);
            if((_iicDataCount--)==0)
                break;//第二次中断跳出                          //IIC operation is stopped because of IICCON[4]   
            rIICDS = _iicData[_iicPt++];//第一次中断将内部地址addr存入移位寄存器
            for(i=0;i<10;i++);                  //For setup time until rising edge of IICSCL
            rIICCON = 0xaf;                     //Resumes IIC operation.
            break;

        default:
            break;     
    }
}
void Delay(int x) 
{
  int k, j;
  while(x)
  {
   for (k=0;k<=0xff;k++)
    for(j=0;j<=0xff;j++);
    
   x--;
  }
}

关键字:ARM9  IIC 引用地址:十 ARM9(2440)的IIC-理论知识及程序实例

上一篇:STM32通用定时器(TIM2-5)PWM输出
下一篇:十一 ARM9(2440)的网卡接口扩展

推荐阅读最新更新时间:2024-03-16 14:33

S3C2440开发板的学习使用(一)----串口的安装
一、串口连接 1、板上有USB转UART芯片PL2303HX,可以通过MINI USB口,使用一根USB转MINI USB线连接到笔记本上。 2、Windows下安装USB转串口驱动程序PL2303_Prolific_DriverInstaller_v1.5.0.exe。 3、下载串口工具软件SecureCRT,设置波特率和COM口,即可通过串口读写。 UART简介:http://blog.csdn.net/GQ1900/article/details/51885259 UART和RS232、RS485的关系:http://blog.csdn.net/chun_1959/article/details/4505
[单片机]
S3C<font color='red'>2440</font>开发板的学习使用(一)----串口的安装
SPI , IIC, IIS, UART, 232,485 总结
IIC 有两根线, SCL , SDA, 主从设备都可用将控制线拉底。 数据线也要传片选地址。 是半双工总线,结构简单,总线上可以同时挂多个设备。 SPI是四根线,时钟,收,发,片选。有统一时钟控制,收发同时进行。速度可达 Mbps。 通过片选管脚选择设备,占用较多I/O,或需要外围锁存器或译码器选择从设备。 最常用的时钟设置基于时钟极性(CPOL)和时钟相位(CPHA)两个参数, cpol 定义时钟空闲电平, cpha决定在时钟前沿采样还是后沿采样。 IIS 是用与数字音频的总线 DATA, 用于串行数字音频数据。 LRCK, 左右声道开关 SCLK, 时钟,采样频率*采样位数*2,两个声道所以要乘2
[单片机]
IIC总线在LonWorks神经元芯片FT3150中的应用
  目前比较常用的串行总线有:IIC(Inter Integrated Circuit)总线、SPI(Serial Periphcral Interface)总线和Micro-wIRe总线等。其中,IIC总线是Philips公司于80年代推出的一种二线制总线,它通过一根串行数据线(SDA))和一根时钟线(SCL)在互连的器件间传输信息。这对具有有限个I/O引脚的神经元芯片来说,节约了I/O引脚开销,方便了系统进一步扩展。 LonWorks神经元芯片FT3150   LonWorks总线为用户提供了一个针对实际工程应用的神经元芯片--Neuron芯片。Neuron芯片高度集成,所需外部器件较少。它包含3个处理七层LonTalk协
[嵌入式]
s3c2440液晶屏驱动 (非内核自带) linux-4.1.24
对于,不想逐一检查内核自带驱动,想自己编写驱动。 1,make menuconfig 去掉 编译到内核,改为 M 编译为 模块(因为要用到里面的3个.ko 驱动) Device Drivers --- Graphics support --- Support for frame buffer devices --- M S3C2410 LCD framebuffer support 2,make uImage && make modules 生成新内核 和 模块文件 烧写新内核或使用 nfs bootm 使用编译为 M 模块的内核启动。 复制 3个 ko 文件到 文件系统,这里用的是 NFS 网络文件
[单片机]
S3C2440触摸屏控制总结
触摸屏控制原理,其实与ADC读取一个滑动变阻器中间触点电压的原理一样。只不过,读取触摸屏的X、Y方向上的电压需要两次,而且需要设置其工作模式以实现一个ADC读取两个通道的电压。 S3C2440的ADC控制是很简单的,与普通单片机控制ADC的方法没有多大区别。大概的操作步骤都是如下所示。 (1)设置控制寄存器ADCCON (2)启动ADC转换 (3)等待转换结束 (4)读取转换结果 但是,S3C2440的触摸屏控制有什么工作模式,如等待中断模式,分离的x/y轴坐标转换模式,自动(连续)x/y轴坐标转换模式,普通转换模式。通过官方芯片资料理解这些模式,似乎还是一头雾水。经过测试,我对这些模式有了初步的认识。 (一) ADC&TC模式分
[单片机]
开发板与主机ping不通的解决方案(mini2440
方案:组建一个由windows、linux和开发板组成的局域网 1.准备工作 虚拟机使用桥接方式 用根网线将开发板和主机直接连接起来(不经过交换机) 关闭linux的防火墙: 关闭selinux: 关闭windows防火墙 断掉外网(无线) 2.ip设置 将linux的ip地址设置为静态ip:192.169.1.100 网关:192.169.1.1 设置子网掩码码为:255.255.255.0 执行下面命令更改文件内容和下面相同即可 设置静态ip详细步骤:http://jingyan.baidu.com/article/455a99508be7cda167277865.html 设置开发板的ip
[单片机]
开发板与主机ping不通的解决方案(mini<font color='red'>2440</font>)
基于mini2440按键控制电子相册(裸机代码)
#define GLOBAL_CLK 1 #include def.h #include option.h #include 2440addr.h #include profile.h #define LCD_WIDTH 320 //屏幕宽度 #define LCD_HEIGHT 240 //屏幕高度 #define CLKVAL 4 //时钟信号 //垂直同步信号的脉宽、后肩和前肩 #define VSPW (2-1) #define VBPD (11-1) #define VFPD (5-1) //水平同步信号的脉宽、后肩和前肩 #define HSPW (2-1) #define HBPD (69-1)
[单片机]
基于S3C2440和嵌入式Linux的扩展串口设计
  现场总线等技术的广泛使用,串口通讯在各种场合的应用越来越广泛。在集中控制系统中,需要在多个串口间进行通信,而在一般计算机上,只有1~3个串口,为了实现对多点的控制,需要对串口进行扩展。   ARM芯片是目前在嵌入式系统中应用比较广泛的一种芯片,由于可以运行操作系统,以及拥有包括LCD、串口通讯、网络通讯、存储芯片等大量外围接口芯片的支持,使得ARM广泛应用于检测、通讯、控制等领域。   本文以ARM 920T核的S3C24449芯片作为微控制器,在TQ2440开发板进行串口扩展,利用开发板上的系统总线接口和通用输入输出接口分别与扩展串口相连,达到同时与多台串口设备并行通信的目标。   1 硬件介绍   1.1
[电源管理]
基于S3C<font color='red'>2440</font>和嵌入式Linux的扩展串口设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • ARM裸机篇--按键中断
    先看看GPOI的输入实验:按键电路图:GPF1管教的功能:EINT1要使用GPF1作为EINT1的功能时,只要将GPFCON的3:2位配置成10就可以了!GPF1先配 ...
  • 网上下的--ARM入门笔记
    简单的介绍打今天起菜鸟的ARM笔记算是开张了,也算给我的这些笔记找个存的地方。为什么要发布出来?也许是大家感兴趣的,其实这些笔记之所 ...
  • 学习ARM开发(23)
    三个任务准备与运行结果下来看看创建任务和任运的栈空间怎么样的,以及运行输出。Made in china by UCSDN(caijunsheng)Lichee 1 0 0 ...
  • 学习ARM开发(22)
    关闭中断与打开中断中断是一种高效的对话机制,但有时并不想程序运行的过程中中断运行,比如正在打印东西,但程序突然中断了,又让另外一个 ...
  • 学习ARM开发(21)
    先要声明任务指针,因为后面需要使用。 任务指针 volatile TASK_TCB* volatile g_pCurrentTask = NULL;volatile TASK_TCB* vol ...
  • 学习ARM开发(20)
  • 学习ARM开发(19)
  • 学习ARM开发(14)
  • 学习ARM开发(15)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved