精华内容
下载资源
问答
  • 新建个文件名:ch372_usb.c内容如下:#include "stm32f4xx_hal.h"#include "user_delay.h"#include "CH375INC.H"//宏定义RD,WR,A0的关键电平#define Ch372_RD_HHAL_GPIO_WritePin (GPIOC,GPIO_PIN_10,GPIO_...

    上面的延时函数我就不解释了,都看得懂。

    下面是关键的文件了。

    新建个文件名:ch372_usb.c

    内容如下:

    #include "stm32f4xx_hal.h"

    #include "user_delay.h"

    #include "CH375INC.H"

    //宏定义RD,WR,A0的关键电平

    #define Ch372_RD_HHAL_GPIO_WritePin (GPIOC,GPIO_PIN_10,GPIO_PIN_SET )

    #define Ch372_RD_LHAL_GPIO_WritePin (GPIOC,GPIO_PIN_10,GPIO_PIN_RESET )

    #define Ch372_WR_HHAL_GPIO_WritePin (GPIOC,GPIO_PIN_9,GPIO_PIN_SET )

    #define Ch372_WR_LHAL_GPIO_WritePin (GPIOC,GPIO_PIN_9,GPIO_PIN_RESET )

    #define Ch372_A0_HHAL_GPIO_WritePin (GPIOC,GPIO_PIN_11,GPIO_PIN_SET )

    #define Ch372_A0_LHAL_GPIO_WritePin (GPIOC,GPIO_PIN_11,GPIO_PIN_RESET )

    #define Ch372_Led_HHAL_GPIO_WritePin (GPIOF,GPIO_PIN_6,GPIO_PIN_SET )

    #define Ch372_Led_LHAL_GPIO_WritePin (GPIOF,GPIO_PIN_6,GPIO_PIN_RESET )

    //GPIO口全部拉高

    void Gpio_All_H(void)

    {

    //ODR是32位数据,data是8位,保证不修改到其他引脚,只修改后8位

    GPIOC->ODR = (GPIOC->ODR &0xff00) | 0xff;

    }

    //GPIO口连续写入

    void Gpio_write_pins(uint8_t data)

    {

    //ODR是32位数据,data是8位,保证不修改到其他引脚,只修改后8位

    GPIOC->ODR = (GPIOC->ODR &0xff00) | data;

    }

    //GPIO口连续读出

    uint8_t Gpio_read_pins(void)

    {

    uint8_t data;

    data = GPIOC->IDR & 0xFF;

    return data;

    }

    //CH372写命令

    void CH372_WRCMD(uint8_t cmd)

    {

    delay_us(5);

    Gpio_write_pins(cmd);

    Ch372_A0_H;

    Ch372_RD_H;

    Ch372_WR_L;

    Ch372_WR_H;

    Ch372_A0_L;

    Gpio_All_H();

    delay_us(5);

    }

    //CH372写数据

    void CH372_WRdata(uint8_t data)

    {

    Gpio_write_pins(data);

    Ch372_A0_L;

    Ch372_WR_L;

    delay_us(2);

    Ch372_WR_H;

    Gpio_All_H();

    }

    //CH372读数据

    uint8_t CH372_RDdata(void)

    {

    uint8_t temp;

    Gpio_All_H();

    Ch372_A0_L;

    Ch372_RD_L;

    //delay_us(2);

    temp = Gpio_read_pins();

    Ch372_RD_H;

    Gpio_All_H();

    return temp;

    }

    //外部IO中断处理回调函数

    void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)

    {

    uint8_t i,temp,length;

    uint8_t buf;

    //发送获取372的中断类型(状态)命令,并取消中断信号

    CH372_WRCMD(CMD_GET_STATUS);

    //读取中断类型(状态)值

    temp = CH372_RDdata();

    //判断中断类型(状态)

    switch(temp)

    {

    //如果是0x02,则是端点2的OUT事务(接收到数据,OUT成功),OUT是相对于主机端计算机来说的

    case USB_INT_EP2_OUT :

    //发送读取USB缓冲区数据命令,并释放缓冲区

    CH372_WRCMD(CMD_RD_USB_DATA);

    //先读取数据长度

    length = CH372_RDdata();

    //根据数据长度读取所有值

    for(i=0;i

    {

    buf = CH372_RDdata();

    }

    //-------------------------------------------------

    //以下为向主机端计算机发送接收到的数据

    //发送向端点2的发送缓冲区写数据命令

    CH372_WRCMD(CMD_WR_USB_DATA7);

    //先写入数据的长度

    CH372_WRdata(length);

    //根据长度依次发送要发送的数据

    for(i=0;i

    CH372_WRdata(~buf);

    //----------------------------------------------------

    break;

    //如果是0x0A,则是端点2的IN事务(发送完数据,IN成功),IN是相对于主机端计算机来说的

    case USB_INT_EP2_IN :

    //发送释放缓冲区命令

    CH372_WRCMD(CMD_UNLOCK_USB);

    break;

    default :

    CH372_WRCMD(CMD_UNLOCK_USB);

    break;

    }//End switch(temp)

    }

    这里解释的很详细了,至于为毛读写函数那样写,参看CH372的使用文档。。。。。

    展开全文
  • 0 引言  USB 通用串行总线(英文:Universal Serial Bus,简称...USB是在1994年底由英特尔、康柏、IBM、Microsoft等多家公司联合提出的,自1996年推出后,已成功替代串口和并口,并成为当今个人电脑和大量智能设备的
  • 模拟鼠标或者键盘,必须使用外部固件模式,内置固件只负责信息数据的传输,所以不得不选择并口控制或者SPI的方式,接下来就是了解基本的USB协议的尝试,懂得USB设备与PC机进行信息握手的过程,懂得什么是SETUP,什么...

    开始打算做一个关于USB设备共享的机器,多台电脑共享一个鼠标键盘;

    模拟鼠标或者键盘,必须使用外部固件模式,内置固件只负责信息数据的传输,所以不得不选择并口控制或者SPI的方式,接下来就是了解基本的USB协议的尝试,懂得USB设备与PC机进行信息握手的过程,懂得什么是SETUP,什么是设备描述符,什么是配置描述符,


    以下是部分关于CH372模拟HID鼠标的程序:使用STM32


    static void CH376_DATA_DIR_IN( );


    BOOLEAN  CH375ACT;
    BOOLEAN CH375FLAGERR; //错误清0
    BOOLEAN CH375CONFLAG;




    BOOLEAN IsBusying;


    unsigned char buf[64];
    typedef union _REQUEST_PACK{
    unsigned char  buffer[8];
    struct{
    unsigned char bmReuestType;     //标准请求字
    unsigned char bRequest;   //请求代码
    unsigned int     wValue; //特性选择高
    unsigned int     wIndx; //索引
    unsigned int     wLength; //数据长度
    }r;
    } mREQUEST_PACKET, *mpREQUEST_PACKET;
    //设备的描述符包含设备描述符、配置描述符、字符描述符;识别描述符的类型就是根据它的第二个字节值来识别;
    //一般情况下设备描述符不需要用户去配置,因为可以直接用软件从现有的设备中读取;同种设备的描述符都相同;如优盘描述符都一样
    /*以下是设备描述符,(为什么是这些数值,可查阅USB协议书籍)*/
    unsigned char DevDes[]={
    0x12, //描述符长度,长度1个字节,值18
        0x01, //描述符类型,长度1个字节,值:1-设备描述符,2-配置描述符,3-字符串描述符,4-接口描述符,5-端点描述符
        0x10, //USB规范版本信息,长度2个字节,BCD码:USB1.1-0110、USB2.0-0200
        0x01,
        0x00, //类别码,长度1个字节,数值0X01~0XFE为USB定义的类,如打印机等;00-USB设备的各个接口属于不同的类,由接口描述符提供类的值;02-通信类;03-HID类;09-集线器类;
                   //DC-用于诊断用途的设备类;e0-无线通信设备类;XFF是由厂商定义的设备的类别;
        0x00,            //子类别码,长度1个字节,类别码为0,则也必须为0;USB协会指定;0xff-厂商自定义
    0x00,            //协议代码,长度1个字节,USB协会指定;0-不使用任何设备类协议,类别码为0时,必须为0;0xff-厂商自定义
        0x08, //端点0的最大信息包大小,长度1字节,低速设备-8,全速设备-8/16/32/64,高速设备-64
        0x87, //厂商ID,VID长度2字节,USB协会分配给不同的厂商,操作系统会根据VID和PID加载驱动
        0x88,
        0x11, //产品ID,PID长度2字节,厂商定义,操作系统加载设备驱动与其有关
        0x00,
        0x00, //设备版本信息,长度2字节,厂商定义,操作系统加载驱动与其有关
        0x01,
        0x01, //描述厂商的字符串描述符的索引值,长度1字节,0-没有厂商字符串;主机获取设备描述符时将其放入WVALUE中,以选择不同的字符串;具体字符串内容在字符串描述符中定义
        0x02,            //描述产品的字符串描述符的索引值,长度1字节,0-没有产品字符串;第一次插入USB设备时,在系统桌面右下角弹出的提示信息就是产品字符串
        0x03,            //描述设备的序列号的字符串描述符的索引值,长度1字节,0-没有序列号描述符
        0x01, //设备支持的配置的数目,长度1字节,一个设备可能有多种配置,每种配置有一个配置描述符,主机通过发送设备配置来选择某一配置
    };
    //配置描述符;包括配置描述符、接口描述符、端点描述符,HID设备还包括HID描述符;
    unsigned char   ConDes[]={
    //配置描述符
    0x09, //描述符大小
        0x02, //描述符类型02-配置描述符
        0x22, //此配置传回所有数据大小,包括配置描述符、接口描述符、类描述符、端点描述符
        0x00, //
        0x01, //接口数
        0x01, //配置值
        0x00, //描述改配置的字符串的索引,0-没有配置描述字符串
        0x80, //设备属性D7保留位 1,D6:0-总线供电 D5:1-支持远程唤醒 D4-D0:保留位 0000
        0x40, //设备需要的电流,单位为2ma
    //接口描述符
        0x09, //描述符大小
        0x04, //描述符类型04-接口描述符
        0x00, //接口编号
        0x00, //接口备用编号
        0x01, //支持的端点数 0-没有非零端点 使用默认控制端点
        0x03, //类别码
        0x01, //子类别码 0-无引导的HID设备 1-有引导的HID设备
        0x02, //协议码子类别码为0时必须也为0 子类别吗为1时 1-键盘 2-鼠标
        0x00, //描述该接口的字符串的索引,0-没有
    //HID描述符
    0x09,    //描述符长度
    0x21,    //描述符类型 0x21-HID
    0x10,    //HID协议版本
    0x01,
    0x21,    //国家码,美式键盘33
    0x01,    //下级描述符数量,至少为1,下级描述符即报告描述符或物理描述符
    0x22,    //下级描述符类型,0x22-报告描述符 0x23-物理描述符
    0x34,    //下级描述符长度,2字节,
    0x00,
    //端点描述符
        0x07,    //描述符长度
        0x05,    //描述符类型 5-端点描述符
        0x81,    //端点地址,D7-传输方向 1-IN 0-OUT,D3-D0:端点号,D6-D4:保留值
        0x03,    //端点类型;D1-D0:0-控制传输 1-等时传输 2-批量传输 3-中断传输;非等时传输D7-D2保留值 0,等时传输D7-D6保留,D5-D4用途 0-数据端点 1反馈端点 2-暗含反馈的数据端点 D3-D2同步类型0 无同步1-异步 2适配 3 同步
        0x10,    //最大数据包长度
        0x00,    //
        0x0a,    //查询间隔
    };
    //字符串描述符,报表描述符;
    //作键盘设备时,报表描述符描述了数据格式;如键盘,则必须发送8个字节的数据;其中第3个字节是要在
    //各种文本里显示的数据(如WORD文挡);其余字节全为0;
    unsigned char Hid_des[]={
    0x05, 0x01, //全局项目,表示用途页为桌面设备
    0x09, 0x02,  //局部项目,表示用途为鼠标
    0xa1, 0x01,  //开集合,主项目,应用集合
        0x09, 0x01,  //局部项目,指针设备
        0xa1, 0x00,  //开集合,主项目,物理集合
            0x05, 0x09, //全局项目,用途为按键
            0x19, 0x01, //局部项目,用途最小值为1,鼠标左键
            0x29, 0x03, //局部项目,用途最大值为3,鼠标中键
            0x15, 0x00, //全局项目,返回数据的逻辑值的最小值为0
            0x25, 0x01, //全局项目,返回数据的逻辑值的最大值为1
            
    0x95, 0x03, //全局项目,返回值的数据域数量有3个
            0x75, 0x01, //全局项目,返回值每个数据域长度1位
            0x81, 0x02, //主项目,说明有3个长度为1的数据域做输入,属性为DATA VAR ABS,ADAT表示数据可变动,VAR表示这些数据域是独立的变量,即每个数据域表示一个意思,ABS表示他们是绝对值。长度由前述的两个全局项目定义,
            
    0x95, 0x01, //全局项目,数据域数量有1个
            0x75, 0x05, //全局项目,数据域长度为5位
            0x81, 0x03, //主项目,说明有一个长度为5位的数据域做输入,属性为CNST VAR ABS,CNST表示常量,目的是补齐8位,因为前面只有3位
            
    0x05, 0x01, //全局项目,用途是通用桌面
            0x09, 0x30, //局部项目,用途X轴
            0x09, 0x31, //局部项目,用途Y轴
            0x09, 0x38, //局部项目,用途为滚轮,即中键

            0x15, 0x81, //全局项目,返回值的逻辑值的最大和最小值分别为-127和127;
            0x25, 0x7f,
           
    0x75, 0x08, //全局项目,每个数据域的长度为8位
            0x95, 0x03, //全局项目,数据域的个数为3个
            0x81, 0x06, //全局项目,说明前述的3个数据域为输入,属性为DATA VAR REL,DATA、VAR前面已经讲过,REL表示这些值是相对值,即鼠标移动时,发送的只是变化量
        0xc0, //关闭集合
    0xc0 //关闭集合
             };
     
    unsigned char LangDes[]={0x04,0x03,0x09,0x04}; //语言描述符
    unsigned char SerDes[] ={0x16,0x03,0xDD,0x84,0xD7,0x65,0x4C,0x5D,0x65,0x51,0x0F,0x5F,0x48,0x00,0x49,0x00,
    0x44,0x00,0x20,0x9F,0x07,0x68};


    unsigned char  Chan[]={0x16,0x03,0x32,0x00,0x30,0x00,0x30,0x00,0x31,0x00,0x2d,0x00,0x30,0x00,0x37,0x00,0x2d,0x00,0x30,0x00,0x31,0x00};
    unsigned char  Chang[] ={0x14,0x03,'L',0,'E',0,'N',0,'C',0,'H',0,'I',0,'M',0,'C',0,'U',0};


    unsigned char mVarSetupRequest; // ;USB请求码
    unsigned char mVarSetupLength; // ;后续数据长度
    unsigned char * VarSetupDescr;// ;描述符偏移地址
    unsigned char buf1[8];
    unsigned char VarUsbAddress ; //
    unsigned  char  Report_ID=0X01;




    unsigned char  UPDATA_FLAG;
    mREQUEST_PACKET  request;                                                    


    void sys_DATA_IoInit(void)
    {
        GPIO_InitTypeDef GPIO_InitStructure;


        GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);


        GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_Out_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;


        GPIO_InitStructure.GPIO_Pin = WR_PIN ;
        GPIO_Init(WR_PORT, &GPIO_InitStructure);


        GPIO_InitStructure.GPIO_Pin = A0_PIN ;
        GPIO_Init(A0_PORT, &GPIO_InitStructure);


        GPIO_InitStructure.GPIO_Pin = RD_PIN ;
        GPIO_Init(RD_PORT, &GPIO_InitStructure);


        GPIO_InitStructure.GPIO_Pin = CS_PIN ;
        GPIO_Init(CS_PORT, &GPIO_InitStructure);
        
        GPIO_InitStructure.GPIO_Pin =   CH376_INT1_PIN;
    GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_IN_FLOATING;
    GPIO_Init(CH376_INT1_PORT , &GPIO_InitStructure);
        
         GPIO_SetBits(CS_PORT,CS_PIN);           // CH376_CS = 1;
         GPIO_SetBits(WR_PORT,WR_PIN);           // CH376_WR = 1;
         GPIO_SetBits(RD_PORT,RD_PIN);           // CH376_RD = 1;
         GPIO_ResetBits(A0_PORT,A0_PIN);         // CH376_A0 = 0;
         CH376_DATA_DIR_IN();


    }


    /***********************************************************************************
    ****函数名称:不准确的延时20US的函数
    ****函数作用:
    ****函数描述:
    ************************************************************************************/
    static void delay20us(void)
    {
    // unsigned char i;
    // for(i=0;i<20;i++);
    }
    /***********************************************************************************
    ****函数名称:不准确的延时1mS的函数
    ****函数作用:
    ****函数描述:
    ************************************************************************************/
    static void delay1ms(void)
    {
    // unsigned char m,n;
    // for(m=0;m<200;m++)
    // for(n=0;n<50;n++);
    }
    /***********************************************************************************
    ****函数名称:不准确的延时50mS的函数
    ****函数作用:
    ****函数描述:
    ************************************************************************************/
    static void delay50ms(void)
    {
    // unsigned char m,n;
    // for(m=0;m<200;m++)
    // for(n=0;n<250;n++);
    }


    static void CH376_DATA_DIR_IN( )


    {
        GPIO_InitTypeDef GPIO_InitStructure;


        GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);


        GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_IPU;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;


        GPIO_InitStructure.GPIO_Pin =   D0_PIN|D1_PIN|D2_PIN|D3_PIN|D4_PIN|D5_PIN|D6_PIN|D7_PIN;  //OE0:PA7 OE1:PA15  OE2:PA8
        GPIO_Init(D0_PORT, &GPIO_InitStructure);
        
    }




    static void CH376_DATA_DIR_OUT( )


    {
        
        GPIO_InitTypeDef GPIO_InitStructure;
        
        GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);


        GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_Out_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;


        GPIO_InitStructure.GPIO_Pin =   D0_PIN| D1_PIN|D2_PIN|D3_PIN|D4_PIN|D5_PIN|D6_PIN|D7_PIN;  //OE0:PA7 OE1:PA15  OE2:PA8
        GPIO_Init(D0_PORT, &GPIO_InitStructure);


    }




    static uint8_t  CH376_DATA_DAT_IN(void)
    {
        u16 cmd1;  uint8_t cmd;  
        cmd1=GPIO_ReadInputData(D0_PORT);    
        cmd=(GPIO_ReadInputData(D0_PORT)&0xff00)>>8;    
    delay50ms();
        return(cmd);
        
        
        
    }


    static void  CH376_DATA_DAT_OUT(u16 cmd)
    {


        u16 Temp;   
        Temp=GPIO_ReadOutputData(D0_PORT);  
    delay50ms();    
        GPIO_Write(D0_PORT,(Temp&0x00ff)|(((u16)cmd)<<8));


          
    }


    /*******************************************************************************
    * Function Name  : CH376_WR_CMD_PORT  串口发送命令前需要发送57 ab同步码
    * Description    : 写CH376命令子函数
    * Input          : - cmd: 8位命令码
    * Output         : None
    * Return         : None
    * Attention : None
    *******************************************************************************/


    void CH376_WR_CMD_PORT( u16  cmd )
    {


        delay20us();
        CH376_DATA_DIR_OUT( );


        CH376_DATA_DAT_OUT(cmd);


        GPIO_SetBits(A0_PORT,A0_PIN);         // CH376_A0 = 1;
         GPIO_SetBits(RD_PORT,RD_PIN);           // CH376_RD =1;


        GPIO_ResetBits(CS_PORT,CS_PIN);           // CH376_CS = 0;


        GPIO_ResetBits(WR_PORT,WR_PIN);           // CH376_WR = 0;






        GPIO_ResetBits(CS_PORT,CS_PIN);           // CH376_CS = 0;
        delay50ms();


        GPIO_SetBits(WR_PORT,WR_PIN);           // CH376_WR =1;




        GPIO_SetBits(CS_PORT,CS_PIN);           // CH376_CS = 1;




        GPIO_ResetBits(A0_PORT,A0_PIN);         // CH376_A0 = 0;








        CH376_DATA_DAT_OUT(0xffff);
    }




    /*******************************************************************************
    * Function Name  : CH376_WR_DAT_PORT
    * Description    : 写CH376数据子函数
    * Input          : - dat: 8位数据
    * Output         : None
    * Return         : None
    * Attention : None
    *******************************************************************************/
    void CH376_WR_DAT_PORT( u16 dat )
    {
        CH376_DATA_DIR_OUT( );  /* 设置并口方向为输出 */
    delay20us();
        CH376_DATA_DAT_OUT( dat );  /* 向CH376的并口输出数据 */




        GPIO_ResetBits(A0_PORT,A0_PIN);            // CH376_A0 = 0;


        GPIO_ResetBits(CS_PORT,CS_PIN);           // CH376_CS = 0;


        GPIO_ResetBits(WR_PORT,WR_PIN);           // CH376_WR = 0;


    delay20us();
        GPIO_ResetBits(CS_PORT,CS_PIN);           // CH376_CS = 0;
    delay20us();
        GPIO_SetBits(WR_PORT,WR_PIN);           // CH376_WR =1;




        GPIO_SetBits(CS_PORT,CS_PIN);           // CH376_CS = 1;




        CH376_DATA_DAT_OUT(0xffff);  /* 禁止数据输出 */
        


    }


    /*******************************************************************************
    * Function Name  : CH376_RD_DAT_PORT
    * Description    : 读CH376数据子函数
    * Input          : None
    * Output         : None
    * Return         : 8位数据
    * Attention : 等待读到数据
    *******************************************************************************/
    uint8_t CH376_RD_DAT_PORT( void )
    {
        
        
        uint8_t mData;
        // mDelay0_5uS( );  /* 确保读写周期大于0.6uS */
        
         CH376_DATA_DIR_OUT( );  /* 设置并口方向为输出 */
        CH376_DATA_DAT_OUT(0xffff);  /* 禁止数据输出 */
        GPIO_ResetBits(A0_PORT,A0_PIN);            // CH376_A0 = 0;
        
        CH376_DATA_DIR_IN( );  /* 设置并口方向为输入 */
        CH376_DATA_DAT_OUT(0x0000);  /* 禁止数据输出 */


        GPIO_ResetBits(CS_PORT,CS_PIN);           // CH376_CS = 0;


        GPIO_ResetBits(RD_PORT,RD_PIN);           // CH376_WR = 0;


        GPIO_ResetBits(CS_PORT,CS_PIN);           // CH376_CS = 0;
    delay50ms();
    delay20us();
        mData = CH376_DATA_DAT_IN( );  /* 从CH376的并口输入数据 */


        GPIO_SetBits(RD_PORT,RD_PIN);           // CH376_RD =1;
    delay50ms();
        GPIO_SetBits(CS_PORT,CS_PIN);           // CH376_CS = 1;
             CH376_DATA_DIR_OUT( );  /* 设置并口方向为输出 */
        CH376_DATA_DAT_OUT(0xffff);  /* 禁止数据输出 */


        return( mData );
        
        
    }








    void device_376(void)
    {
        
        sys_DATA_IoInit();
        sysReset();
            CH376_WR_CMD_PORT( CMD_SET_USB_MODE );
    CH376_WR_DAT_PORT( 0);  
        delay50ms();
        CH376_WR_CMD_PORT( CMD_SET_USB_MODE );
    CH376_WR_DAT_PORT( 1);   /* 设置为使用内置固件的USB设备方式 */
    for ( ;; ) {   /* 等待操作成功,通常需要等待10uS-20uS */
    if ( CH376_RD_DAT_PORT( )==CMD_RET_SUCCESS ) break;
    }




    }




    void IO_cfg()            //GPIO初始化
    {
       GPIO_InitTypeDef GPIO_InitStructure; //定义结构体变量




       GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;     //选择引脚2 3 5 作为中断信号输入端
       GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;                   //选择输入模式为浮空输入
       GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                       //输出频率最大50MHz
       GPIO_Init(GPIOA,&GPIO_InitStructure);                                   //设置PA.2 /PA.3 /PA.5
    }




    void EXTIX_Init(void)
    {


        
        
           NVIC_InitTypeDef NVIC_InitStructure;     //定义结构体变量


       NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);    //选择中断分组2,3个中断源,需2bit进行优先级设置
                                                          //高两位用于设置抢占式 优先级;
         //低两位用于设置响应式 优先级
       
       NVIC_InitStructure.NVIC_IRQChannel = EXTI_Line0;     //选择中断通道2
       NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //抢占式中断优先级设置为0
       NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;         //响应式中断优先级设置为0
       NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;            //使能中断


       NVIC_Init(&NVIC_InitStructure);


       




    }




    void EXTI_cfg()      //将相应的IO口与中断线路进行连接
    {
       EXTI_InitTypeDef EXTI_InitStructure;      //定义结构体变量


       EXTI_ClearITPendingBit(EXTI_Line0);      //清空中断标志   PA.2 中断口




       GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);  //选择中断管脚PA.2 PA.3 PA.5




       EXTI_InitStructure.EXTI_Line = EXTI_Line0;  //选择中断线路2 3 5
       EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;                   //设置为中断请求,非事件请求
       EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;    //设置中断触发方式为上下降沿触发
       EXTI_InitStructure.EXTI_LineCmd = ENABLE;                         //外部中断使能


       EXTI_Init(&EXTI_InitStructure);
    }




    void ioInterruptSet(void)
    {
    NVIC_InitTypeDef NVIC_InitStructure;
    GPIO_InitTypeDef GPIO_InitStructure;
    EXTI_InitTypeDef EXTI_InitStructure;

    EXTI_ClearITPendingBit(EXTI_Line0);


      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; 
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;  
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;         
      GPIO_Init(GPIOA,&GPIO_InitStructure);               


      GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);  // 
    EXTI_InitStructure.EXTI_Line = EXTI_Line0;                   //选择中断线路0
      EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;          //设置为中断请求,非事件请求
      EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;      //下降沿触发
      EXTI_InitStructure.EXTI_LineCmd = ENABLE;                    //外部中断使能
      EXTI_Init(&EXTI_InitStructure);      

      NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);           //选择中断分组2
      NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;          //选择中断通道2
      NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占式中断优先级设置为0
      NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;        //响应式中断优先级设置为0
      NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;           //使能中断
      NVIC_Init(&NVIC_InitStructure);
    }




    ///***********************************************************************************
    //****函数名称:端点1数据上传函数
    //****函数作用:
    //****函数描述:
    //************************************************************************************/
    //void ch372ep1up()
    //{
    // unsigned char i;
    // CH375_WRCMD(CMD_WR_USB_DATA5);
    // CH375_WRDAT(0x04);
    // for(i=0;i<4;i++)
    // CH375_WRDAT(MouseData[i]);
    // IsBusying=1;
    //
    //}
    /***********************************************************************************
    ****函数名称:端点0数据上传函数
    ****函数作用:
    ****函数描述:
    ************************************************************************************/
    void mCh375Ep0Up()
    {
    unsigned char i,len;
    if(mVarSetupLength)
    { //长度不为0传输具体长度的数据
    if(mVarSetupLength<=8)
    {
    len=mVarSetupLength;
    mVarSetupLength=0;
            } //长度小于8则长输要求的长度
    else
    {
    len=8;
    mVarSetupLength-=8;
    }                         //长度大于8则传输8个,切总长度减8
       CH376_WR_CMD_PORT(CMD_WR_USB_DATA3); //发出写端点0的命令
            CH376_WR_DAT_PORT(len); //写入长度
        for(i=0;i!=len;i++)
    {
    CH376_WR_DAT_PORT(request.buffer[i]);               //循环写入数据
    }


        }
    else
    {
    CH376_WR_CMD_PORT(CMD_WR_USB_DATA3); //发出写端点0的命令
    CH376_WR_DAT_PORT(0);                   //上传0长度数据,这是一个状态阶段


    }

    }
    /***********************************************************************************
    ****函数名称:描述符复制函数
    ****函数作用:
    ****函数描述:
    ************************************************************************************/
    void mCh375DesUp()
    {
    unsigned char k;        
    for (k=0; k!=8; k++ ) 
    {
             request.buffer[k]=*VarSetupDescr;   //依次复制8个描述符,
             VarSetupDescr++;
        }
    }




    /***********************************************************************************
    ****函数名称:外部中断0的响应函数
    ****函数作用:通过判断375的终端类型值进行相应的处理
    ****函数描述:
    ************************************************************************************/
    void EXTI0_IRQHandler(void)
    {
    unsigned char i,temp,length,len;
    unsigned char c1;
       // ;//SendStr("......进入中断......\r\n");
    //unsigned char   *pBuf;
    //unsigned char   mBuf[64];
        EXTI_ClearITPendingBit(EXTI_Line0);  //清空中断标志位,防止持续进入中断
    CH376_WR_CMD_PORT(CMD_GET_STATUS);  /* 向CH375芯片发送获取中断状态的命令;CMD_GET_STATUS为命令码,数值大小在CH375INC.H 头文件中*/
    temp =CH376_RD_DAT_PORT();   /* 读取中断状态 */


    switch(temp)                                  //判断中断类型(状态),具体区分请见375头文件中的定义
    {
       case USB_INT_EP0_SETUP:
    ;//SendStr("......接收到SETUP......\r\n");
    CH376_WR_CMD_PORT(CMD_RD_USB_DATA);
    length=CH376_RD_DAT_PORT();
    for(i=0;i<length;i++)
    {
    request.buffer[i]=CH376_RD_DAT_PORT();
    //SendHex(request.buffer[i]);
    ;//SendStr("\r\n");
    }
    if(length==8)//如果长度是8
    {
    mVarSetupLength=request.buffer[6]&0x7f;//控制传输的数据长度最长是128字节
    if(request.r.bmReuestType&0x40)//6-5=10厂商请求
    ;//SendStr("......厂商请求......\r\n");
    if(request.r.bmReuestType&0x20)//6-5=01类请求
    ;//SendStr("......类请求......\r\n");
    if(!(request.r.bmReuestType&0x60))//6-5=00标准请求,一共11中标准请求
    {
    mVarSetupRequest=request.r.bRequest;//将标准请求保存
       switch(request.r.bRequest)//判断标准请求
       {
       case DEF_USB_GET_CONFIG://获取配置
        ;//SendStr("......获取配置......\r\n");
       break;
       case DEF_USB_GET_DESCR://获取描述符
       ;//SendStr("......获取描述符......\r\n");
       switch(request.buffer[3])//判断描述符的类型
       {
       case 1://设备描述符
       ;//SendStr("......请求设备描述符......\r\n");
       VarSetupDescr=DevDes;
       break;
       case 2://配置描述符
       ;//SendStr("......请求配置描述符......\r\n");
    VarSetupDescr=ConDes;
       break;
       case 3://字数串描述符
        ;//SendStr("......请求字符串描述符......\r\n");
    //VarSetupDescr=
    if(request.buffer[4]==0)
    {
    ;//SendStr("......请求语言描述符......\r\n");
    VarSetupDescr=LangDes;
    mVarSetupLength=4;
               }
    if(request.buffer[2]==1)
    {
    ;//SendStr("......请求厂商字符串......\r\n");
    VarSetupDescr=Chang;
    mVarSetupLength=0x14;
    }
    if (request.buffer[2]==2)
    {
    ;//SendStr("......请求产品字符串......\r\n");
    VarSetupDescr=SerDes;
    mVarSetupLength=0x16;
    }
    if(request.buffer[2]==3)
    {
    ;//SendStr("......请求产品序列号......\r\n");
    VarSetupDescr=Chan;
    mVarSetupLength=0x16;
    }
       break;
       case 4://接口描述符
        ;//SendStr("......请求接口描述符......\r\n");
        break;
       case 5://端点描述符
        ;//SendStr("......请求端点描述符......\r\n");
        break;
    case 0x22://获取HID报告描述符
    ;//SendStr("......请求HID......\r\n");
    VarSetupDescr=Hid_des;
    mVarSetupLength=0x34;
    break;
    default://没有定义
       ;//SendStr("......不支持的描述符请求......\r\n");
       break;
        }
       mCh375DesUp();
       break;
        case DEF_USB_GET_INTERF://获取接口
       ;//SendStr("......获取接口......\r\n");
       break;
        case DEF_USB_GET_STATUS://获取状态
        ;//SendStr("......获取状态......\r\n");
        break;
       case DEF_USB_SYNC_FRAME://同步帧
       ;//SendStr("......同步帧......\r\n");
       break;
    case DEF_USB_CLR_FEATURE://清除特性
    ;//SendStr("......清除特性......\r\n");
    break;
    case DEF_USB_SET_ADDRESS://设置地址
    ;//SendStr("......设置地址......\r\n");
    VarUsbAddress=request.buffer[2];
    break;
    case DEF_USB_SET_CONFIG://设置配置
    ;//SendStr("......设置配置......\r\n");
    break;
    case DEF_USB_SET_DESCR://设置描述
    ;//SendStr("......设置描述......\r\n");
    CH375CONFLAG=0;
    if(request.buffer[2]!=0)
    {
    CH375CONFLAG=1;
    }
    break;
    case DEF_USB_SET_FEATURE://设置特性
    ;//SendStr("......设置特性......\r\n");
    break;
    case DEF_USB_SET_INTERF://设置接口
    ;//SendStr("......设置接口......\r\n");
    break;
       default :
       ;//SendStr("......不支持的标准请求......\r\n");
       CH376_WR_CMD_PORT (CMD_UNLOCK_USB); //释放缓冲区
       break;
       }
    }

    }
    mCh375Ep0Up();
    break;
    case USB_INT_EP0_OUT:
    CH376_WR_CMD_PORT(CMD_RD_USB_DATA); //发出读数据命令
    if(length=CH376_RD_DAT_PORT())
    { //长度为0跳出
    for(len=0;len!=length;len++)
    c1=CH376_RD_DAT_PORT(); //取出下传数据
    }
    break;
    case USB_INT_EP0_IN:
    ;//SendStr("......端点0IN......\r\n");
    if(mVarSetupRequest==DEF_USB_GET_DESCR)
    {
    mCh375DesUp();
    mCh375Ep0Up();
    ;//SendStr("......描述符上传成功......\r\n");
    }
    else 
    if(mVarSetupRequest==DEF_USB_SET_ADDRESS)
       { //设置地址
       CH376_WR_CMD_PORT(CMD_SET_USB_ADDR);
       CH376_WR_DAT_PORT(VarUsbAddress); //设置USB地址,设置下次事务的USB地址
       }
    CH376_WR_CMD_PORT(CMD_UNLOCK_USB); //释放缓冲区
    break;
    case USB_INT_EP1_OUT:
    ;//SendStr("......端点1OUT......\r\n");
    break;
    case USB_INT_EP1_IN:
    ;//SendStr("......端点1IN......\r\n");
    CH376_WR_CMD_PORT(CMD_UNLOCK_USB);
    IsBusying=0;
    break;
    case USB_INT_EP2_OUT:
    ;//SendStr("......端点2OUT......\r\n");
    break;
    case USB_INT_EP2_IN:
    ;//SendStr("......端点2IN......\r\n");
    break;
    case USB_INT_USB_SUSPEND:
    ;//SendStr("......USB挂起......\r\n");
    break;
    default:
    ;//SendStr("......总线复位......\r\n");
    if((temp&0x03)==0x03)
    { //总线复位
    CH375FLAGERR=0;             //错误清0
    CH375CONFLAG=0;         //配置清0
    mVarSetupLength=0;
    }
    CH376_WR_CMD_PORT (CMD_UNLOCK_USB); //释放缓冲区
    break;
    break;

    }
    }

    展开全文
  • 并口的数据采集

    千次阅读 2011-01-19 14:38:00
     计算机与外围设备的连接,有多种接口方式:串行、USB、SCSI、并行等,每一种接口方式都有其优点和缺点  计算机与外围设备的连接,有多种接口方式:串行、USB、SCSI、并行等,每一种接口方式都有其优点...

     计算机与外围设备的连接,有多种接口方式:串行、USB、SCSI、并行等,每一种接口方式都有其优点和缺点

      计算机与外围设备的连接,有多种接口方式:串行、USB、SCSI、并行等,每一种接口方式都有其优点和缺点,由于串行和USB接口的抗干扰能力较强,传输距离远,所以在数据通信的时候,多采用以上两种方式。但有些应用场合,如CCD、视频数据采集卡,其要求的传输距离近,这时候采用并行接口,而且这样的运用随着人们对数据处理速度要求的提高会越来越多。

      另外,当计算机用于模拟信号检测时,需要配置A/D转换接口电路,商品化的数据采集卡价格比较贵,而自己开发一套传统的数据采集卡需要很多知识的储备,尤其涉及到了低层驱动程序的开发,难度比较大。

      并行接口的脚位定义

      1、物理接口描述

      计算机并口适配器或数据采集卡基本上都采用多模式方式控制芯片,并口适配器的工作方式可以在CMOS中设置。并口工作模式有:标准并行接口(SPP)、简单双向接口(PS/2)、增强型并行接口(EPP1.9)、扩展功能接口(ECP)等。

      物理接口采用了IEEE1284标准描述的Dsub25针内孔式连接器。管脚信号随工作模式不同也有所不同,下面就默认工作都是SPP模式说明一下(见表1)。

      其中S对应状态寄存器,C对应控制寄存器,它们对应的地址分别为基址(378H)+1、基址(378H)+2。

      

      表1:并行端口SPP模式下物理连线及输出方向简介

      2、相关寄存器描述

      图1是打印机适配器的控制寄存器,它只用了其中的低5位。

      

      图1:控制寄存器

     

      图2是打印机适配器的状态寄存器,它只用了其中的高5位。

      

      图2:状态寄存器

     

      其中每位与引脚对应关系如表1所示。

      电路原理

      1、AD7820引脚及功能

      AD7820是AD公司的一种与微处理器兼容的高速8位模数转换器(ADC)芯片采用单+5V供电,无需外接时钟,内部有取样保持电路,转换时间达到1.36 μs。引脚如图3所示:

      引脚功能介绍:

    Vin模拟信号输入;

      

      图3:AD7820引脚图

     

      DBO-DB7三态数据输出;

      /RDY写控制/输出准备好;

      MODE模式选择,内部通过一个50μA电流源拉低,MODE=0时激活读模式,MODE=1时激活写一读模式;

      读控制,低电平时访问数据;

      中断输出控制位,低电平时表示AD转换结束;

      GND电源地;

      VREF(一)参考电压负端(一),零码输入模拟电压,范围是:GND≤VREF(一) ≤VREF(十);

      VREF(+)参考电压正端(十),满量程输入模拟电压,范围是:VREF(一) ≤VREF(十) ≤VDD;

      片选输人,进行读或写操作时,必须为低电平;

      溢出标志位;

      NC空管脚;

      VDD电源+5V。

      2、电路实现

      

      图4:A/D转换接口电路

     

    A/D转换接口电路原理如图4所示,AD7820工作在读模式下,只要 产生一个负脉冲就开始数据转换。 所需的控制信号由打印机控制口的C1位输出线引脚14脚产生,向 引脚输出一个负脉冲,A/D转换开始,在1.36 μs之后转换结束,数据锁存在片内三态输出数据锁存器中,引脚输出一个低电平。 引脚与打印机状态口的S7位对应的插座11脚连接,通过查询状态口的S7位即可知道转换是否结束。

      图4中74LS157为四2选1数据选择器,用于将结果分两次传给打印机状态口的S3~S6位,也就是与打印机的引脚15、13、12、10相连的控制信号由打印机控制口的C2位16脚控制。计算机通过二次从打印机状态口获得数据。

      软件实现

      PC机配置上述A/D转换接口电路之后,就可以对模拟电信号的检测了,模拟电信号的输入范围为0~4.98V。配上传感器之后,就可用于非电学模拟量的检测。

      下面给出一段小程序采用VC++语言编写的。VC++中对端口的输入/输出,可以通过端口I/O函数一in p、一ou tp来实现,函数包含在conio. h库中。

      ……………..-outp(0x37a,3) ; //清理端口-outp(0x37a,0) ; //启动a/d转换Do{datainput=-inp(0x379)&0x80} ;While(datainput!=0x80) ; //等待转换结束Data=-inp(0x379); //输入低四位数据Data=Data&0x78 ;Data1=Data>>3;-outp(0x37a,0x4); //控制16脚为高电平Data=-inp(0x379) ; //输入高四位Data=Data&0x78 ;-outp(0x37a,3) ; //使A/D停止转换Data=Data<<1;Data=Data|Data1 //8位2进制合并………… //进一步数据处理

      结束语

      本系统可应用在一些实时性要求不是很高的系统中,它抛弃庞大的单片微型计算机系统,也不占用微机扩展槽,体积小,耗费少,且突破了传统微机数据采集的固定模式,使数据采集装置与微机的接口更加灵活、方便。

    展开全文
  • 基于ARM7处理器LPC2119的USB-CAN转换器设计,叙述一种使用ARM7处理器实现USB接口与CAN总线的方案,通过其可以在PC实现对CAN总线上设备的监控。...同时,分析了固件编程及使用通用I/O模拟并口读写时序方法。
  • USB摄像头 介绍

    2011-03-09 16:25:23
    摄像头分为数字摄像头和模拟摄像头两大类。数字摄像头可以将视频采集设备产生的...数字摄像头可以直接捕捉影像,然后通过串、并口或者USB接口传到计算机里。现在电脑市场上的摄像头基本以数字摄像头为主,而数字摄...

           

            摄像头分为数字摄像头和模拟摄像头两大类。数字摄像头可以将视频采集设备产生的模拟视频信号转换成数字信号,进而将其储存在计算机里。模拟摄像头捕捉到的视频信号必须经过特定的视频捕捉卡将模拟信号转换成数字模式,并加以压缩后才可以转换到计算机上运用。数字摄像头可以直接捕捉影像,然后通过串、并口或者USB接口传到计算机里。现在电脑市场上的摄像头基本以数字摄像头为主,而数字摄像头中又以使用新型数据传输接口的USB数字摄像头为主,目前市场上可见的大部分都是这种产品。除此之外还有一种与视频采集卡配合使用的产品,但目前还不是主流。由于个人电脑的迅速普及,模拟摄像头的整体成本较高等原因,USB接口的传输速度远远高于串口、并口的速度,因此现在市场热点主要是USB接口的数字摄像头。以下主要是指USB接口的数字摄像头。

     从摄像头的工作原理就可以列出摄像头的主要结构和组件:
      1、 镜头(LENS)
      透镜结构,由几片透镜组成,有塑胶透镜(plastic)或玻璃透镜(glass)。
      2、 图像传感器(SENSOR)
      可以分为两类:
      CCD(charge couple device) :电荷耦合器件
      CMOS(complementary metal oxide semiconductor):互补金属氧化物半导体

    摄像头

           3、 数字信号处理芯片(DSP)
      DSP生产厂商较多,市面上较为流行的有: VIMICRO(中星微)301P/L、SONIX(松瀚)102/120/128、ST(罗技LOGITECH的DSP提供商)、SUNPLUS(SUN+重点发展单芯片的CIF和VGA,但图像质量一般)、PIXART(原相)PAC207单芯片CIF、SQ(倚强)SQ930C等。
      4、电源
      摄像头内部需要两种工作电压:3.3V和2.5V,最新工艺芯片有用到1.8V.
     
     
    工作原理
      摄像头的工作原理大致为:景物通过镜头(LENS)生成的光学图像投射到图像传感器表面上,然后转为电信号,经过A/D(模数转换)转换后变为数字图像信号,再送到数字信号处理芯片(DSP)中加工处理,再通过USB接口传输到电脑中处理,通过显示器就可以看到图像了。
     
    技术指标
    1、图像解析度/分辨率(Resolution)
           ●SXGA(1280x1024)又称130万像素
      ●XGA(1024x768)又称80万像素
      ●SVGA(800x600)又称50万像素
      ●VGA(640x480)又称30万像素(35万是指648X488)
      ●CIF(352x288)又称10万像素
      ●SIF/QVGA(320x240)
      ●QCIF(176x144)
      ●QSIF/QQVGA(160x120)
    2、图像格式(imageFormat/Colorspace)
      RGB24,420是目前最常用的两种图像格式。
      ●RGB24:表示R、G、B三种颜色各8bit,最多可表现256级浓淡,从而可以再现256*256*256种颜色。
      ●I420:YUV格式之一。
      ●其它格式有:RGB565,RGB444,YUV4:2:2等。
    3、自动白平衡调整(AWB)
      定义:要求在不同色温环境下,照白色的物体,屏幕中的图像应也是白色的。色温表示光谱成份,光的颜色。色温低表示长波光成分多。当色温改变时,光源中三基色(红、绿、蓝)的比例会发生变化,需要调节三基色的比例来达到彩色的平衡,这就是白平衡调节的实际。
    4、图像压缩方式
      JPEG:(jointphotographicexpertgroup)静态图像压缩方式。一种有损图像的压缩方式。压缩比越大,图像质量也就越差。当图像精度要求不高存储空间有限时,可以选择这种格式。目前大部分数码相机都使用JPEG格式。
    5、彩色深度(色彩位数)
      反映对色彩的识别能力和成像的色彩表现能力,实际就是A/D转换器的量化精度,是指将信号分成多少个等级。常用色彩位数(bit)表示。彩色深度越高,获得的影像色彩就越艳丽动人。现在市场上的摄像头均已达到24位,有的甚至是32位
    6、图像噪音
      指的是图像中的杂点干扰。表现为图像中有固定的彩色杂点。
    7、视角
      与人的眼睛成像是相成原理,简单说就是成像范围。
    8、输出/输入接口
      串行接口(RS232/422):传输速率慢,为115kbit/s
      并行接口(PP):速率可以达到1Mbit/s
      红外接口(IrDA):速率也是115kbit/s,一般笔记本电脑有此接口
      通用串行总线USB:即插即用的接口标准,支持热插拔USB1.1速率可达12Mbit/s,USB2.0可达480Mbit/s
      IEEE1394(火线)接口(亦称ilink):其传输速率可达100M~400Mbit/s
    展开全文
  • 数字摄像头可以直接捕捉影像,然后通过串、并口或者USB接口传到计算机里。现在电脑市场上的摄像头基本以数字摄像头为主,而数字摄像头中又以使用新型数据传输接口的USB数字摄像头为主,目前市场上可见的大部分都是...
  • FMS 模拟飞行软件

    2012-09-23 10:18:26
    在FMS软件的手册中附有连接多种无线电遥控器的接口电路图,可以连接到电脑的串口,也可以连接到电脑的并口(打印机口)。国外的爱好者甚至自己制作了只用一个电阻和一个三极管的接口,并公布了电路图。还有人做了...
  • PC的并口一般只有一个,加上并口带电插拔容易损坏,当存在多个基于并口的JTAGT调试器系统时,实现使用过程中会很不方便,因此设计实现一种速度快、性能稳定、价格低廉、易于实现的ARM调试工具是十分必要的。...
  • 摘要:对Flash编程是许多嵌入式系统开发中必要的一环,传统的开发工具通常支持的是并口或串口,而随着计算机接口的单一化,即插即用的USB接口得到了广泛的应用。本文介绍了JTAG接口标准用于Flash编程的方法,并实现USB...
  • 数字摄像头可以直接捕捉影像产生数字信号,然后通过串、并口或者USB接口传输到计算机里。数码摄像头的一般结构如图1 所示。 图1 数码摄像头的结构  相比于模拟摄像头,数码摄像头具有很大优势:CMOS图像传感器....
  • Linux下基于XScale的USB摄像头图像采集

    千次阅读 2009-05-30 14:52:00
    数字摄像头可以直接捕捉影像产生数字信号,然后通过串、并口或者USB接口传输到计算机里。数码摄像头的一般结构如图1 所示。图1 数码摄像头的结构 相比于模拟摄像头,数码摄像头具有很大优势:CMOS图像传感器直
  • PC的并口一般只有一个,加上并口带电插拔容易损坏,当存在多个基于并口的JTAGT调试器系统时,实现使用过程中会很不方便,因此设计实现一种速度快、性能稳定、价格低廉、易于实现的ARM调试工具是十分必要的。...
  • 一、引言  对于学校教学实验以及某些特定需求来说,目前...目前已经有计算机并口通信的数据采集器,但是USB的应用日趋广泛和深入,如果将USB功能融合在里面则可以实现更高的数据传输率、更方便的使用方式,更为优
  • 读写器即 射频标签读写设备是射频识别系统的两个重要组成部分(标签与读写器)之一。射频标签读写设备根据具体实现功能的特点也有一些...读写器从接口上来看主要有:并口读写器、串口读写器材、USB读写器、PCMICA卡读写
  • 由于个人电脑的迅速普及,模拟摄像头的整体成本较高,而且不能满足BSV液晶拼接屏接口等原因,USB接口的传输速度远远高于串口、并口的速度,因此市场USB接口的数字摄像头。模拟摄像头可和视频采集卡或者USB视频采集卡...
  • vmware简介

    2010-12-06 21:54:48
    VMWare模拟出来的硬件包括:主板、内存、硬盘(IDE和SCSI)、DVD/CD-ROM、软驱、网卡、声卡、串口、并口USB口。VMWare没有模拟出显卡。VMWare为每一种Guest OS提供一个叫做vmware-tools的软件包,来增强Guest OS的...
  • 摄像头硬件组成模块

    2020-05-22 06:50:41
    数字摄像头可以直接捕捉影像,然后通过串、并口或者USB接口传到计算机里。电脑市场上的摄像头基本以数字摄像头为主,而数字摄像头中又以使用新型数据传输接口的USB数字摄像头为主,市场上可见的大部分都是这种产品。...
  • 基本硬件知识(一)

    2012-06-01 09:18:00
    云台:安装,固定摄像机...可以直接捕捉影像,然后通过串,并口或者 USB接口传到计算机里。  模拟摄像头捕捉的视频信号必须通过特定的视频捕捉卡将模拟信号转换成数字模式并加以压缩才能传到计算机上。 转载于...
  • 摄像头的分类

    千次阅读 2008-02-28 09:51:00
    摄像头分为数字摄像头和模拟摄像头两大类。...数字摄像头可以直接捕捉影像,然后通过串、并口或者 USB接口传到计算机里。现在电脑市场上的摄像头基本以数字摄像头为主,而数字摄像头中又以使用新型数据传输接口的
  • 虚拟软件VMware

    2019-09-20 18:26:49
    一、什么是虚拟软件: 虚拟原件是一个可以使你在一台机器上同时运行二个或更... 这个环境和真实的计算机一样,都有芯片组、CPU、内存、显卡、声卡、网卡、软驱、硬盘、光驱、串口、并口USB控制器等 二、常用的...
  • 这个环境和真实的计算机一样,都有芯片组、CPU、内存、显卡、声卡、网卡、软驱、硬盘、光驱、串口、并口USB控制器等 常用的虚拟原件: 1.VMware workstation 2.VirtualBoxOracle公司收购Sun公司 VMware...
  • VMware workstation安装

    2019-12-20 10:47:23
    这个环境和真实的计算机一样,都有芯片组、CPU、内存、显卡、声卡、网卡、软驱、硬盘、光驱、串口、并口USB控制器等 常用的虚拟原件:1.VMware workstation 2.VirtualBox 步骤 1.双击VMware-workst...
  • 01-虚拟软件vmware安装

    2018-01-22 10:07:00
    这个环境和真实的计算机一样,都有芯片组、CPU、内存、显卡、声卡、网卡、软驱、硬盘、光驱、串口、并口USB控制器等 常用的虚拟原件: 1.VMware workstation 2.VirtualBox VMware workstat...
  • VMware安装

    2018-05-03 15:44:45
    这个环境和真实的计算机一样,都有芯片组、CPU、内存、显卡、声卡、网卡、软驱、硬盘、光驱、串口、并口USB控制器等   常用的虚拟原件: 1.VMware workstation 2.VirtualBox   VMware workstation安装:
  • 虚拟软件vmware安装

    2017-11-07 13:03:00
    这个环境和真实的计算机一样,都有芯片组、CPU、内存、显卡、声卡、网卡、软驱、硬盘、光驱、串口、并口USB控制器等 常用的虚拟原件: 1.VMware workstation 2.VirtualBox VMware worksta...
  • Linux-01安装VMware

    2017-07-09 20:56:41
    这个环境和真实的计算机一样,都有芯片组、CPU、内存、显卡、声卡、网卡、软驱、硬盘、光驱、串口、并口USB控制器等。常用的虚拟软件: 1.VMware workstation 2.VirtualBox 3…VMware workstation安装: 使用

空空如也

空空如也

1 2 3 4
收藏数 71
精华内容 28
关键字:

usb模拟并口