精华内容
下载资源
问答
  • USB

    2015-10-08 14:35:50
    整理自网络  USB主机在检测到USB设备插入以后,就会对USB设备进行枚举了。枚举就是从设备中读到一些信息,...他要保证数据的正确性,在设备的枚举过程中都是使用控制传输的。控制传输分为三个阶段1,建立阶段;2,

    整理自网络

        USB主机在检测到USB设备插入以后,就会对USB设备进行枚举了。枚举就是从设备中读到一些信息,知道设备是什么样的设备,如何进行通信,这样主机就可以根据这些信息加载合适的驱动程序。

         首先说说USB的一种传输方式----控制传输。这种传输方式在USB中非常重要。他要保证数据的正确性,在设备的枚举过程中都是使用控制传输的。控制传输分为三个阶段1,建立阶段;2,数据阶段;3,确认阶段。建立(setup)阶段是由USB主机发起的,它是一个setup包,里面包含一些数据请求的命令以及一些数据。如果建立阶段是输入请求,那么数据阶段就要输入数据;如果建立阶段是输出请求,那么数据阶段就要输出数据。如果在数据阶段,即使不需要传递数据,也要发送一个0长度的数据包。数据阶段过后就是确认阶段。确认阶段刚好和数据阶段相反,如果是输入请求,则他是一个输出数据包,如果是输出请求,则他是一个输入数据包。确认阶段是用来确认数据的正确传输。

    *************************************************************

          一个完整的控制传输包括三个过程:1.建立连接    2.数据过程(可选)         3.状态过程

       数据过程的可选型是指设置过程需要指定数据长度,如果指定为0,则没有数据过程。状态过程跟在数据过程之后,状态过程恰好和数据过程的数据传输方向相反,因为此阶段主要是用来确认之前两阶段的所有数据都已经正确传输了。

        建立连接的过程都是有Host发起,它开始于一个Setup令牌包,后面紧跟一个DATA0包。如果是控制输入传输,数据过程则为输入数据,若是控制输出传输,则数据过程是输出数据。

           好了,下面就结合我的这个实例来看看枚举的详细过程:

           当USB主机检测到有USB设备插入之后,会发生下面的事情:

           1.使用默认地址0读取设备描述符。(这一步的主要主用就是确认确实是USB设备插入以及获得0端点的缓存大小)

           USB主机向USB设备,发送第一个Setup包,内容是80 06 00 01 00 00 08 00,其中最后的0008表示得到设备描述符DEVICE_DCESCRIPTOR的前8个字节,因为这个包的主要目的是要获得USB Device中端点0的最大包的大小(第8个字节),所以只需要8个字节就可以了。USB Device返回的设备标识符为12 01 10 01 00 00 00 40。

           2.地址分配(配置一个临时的端点来获得更多的信息,0端点的缓存太小,存不下需要的设备信息)

           接下来USB主机向USB设备发送第二个Setup包,内容是一个含有制定地址的数据包:00 05 02 00 00 00 00 00,02表示主机为设备分配的地址为0x02,,在以后的通信里设备就只对0x02地址的信息做出应答。这一个次的作用是为USB设备分配地址(相当于SD卡中的RCA)。如果USB Device接收并接受了此地址设置包,会返回一个长度为0的数据包。Host接收到长度为0的状态包之后就会返回一个ACK给Device,Device再接收到这个ACK之后,就可以启用新地址了。这样Device就得到了一个唯一的设备地址,作为主机通信的唯一表示。

          3.获取设备描述符集合

      发送第三个Setup包,内容是80 06 00 02 00 00 09 00,这次是为了获取配置描述符集合的大小,此位位于读回数据的第三个字节。U盘返回的数据为09 02 20 00 01 01 00 80 32,即描述符集合总大小为0x20。设备在接受该命令后吗,会返回设备的描述符集合,主机就会知道了设备的输入输出地址等信息。

          这时候我们就可以知道该设备是什么类型的设备,支持什么样的操作了。

    上述这两个过程也有的程序就是直接读取0xff个字符大小,当然同样可以达到读回设备描述符集合的目的。

    至此,我们已经得到了所需要的设备信息,之后就可以对设备进行配置了。

         4配置地址

      主机得到了各种配置描述符之后.就会对设备进行配置,向设备发送第五个Setup包,数据为00 09 01 00 00 00 00 00,USB Device返回一个长度为0的数据包,表明数据正确接收。

    至此,USB的枚举过程就完成了。设备进入工作状态。

    展开全文
  • 电脑主机前置USB接口与后置USB接口在本质上没有什么区别,都是由主板提供的USB接口,都可以进行数据传输与供电。一般情况下,USB设备接在前置USB接口和后置USB接口都可以正常使用。  与主板的连接方式不同,前置...

    移动硬盘使用说明书第一页往往都写着:不能插在台式电脑前置的USB插口上,只能插在台式电脑后置的USB插口,否则移动硬盘将损毁。很多人都疑惑为什么不能将移动硬盘插在电脑前置USB接口,下面我就为大家进行解答。

    电脑后置USB接口与前置USB接口有的区别

    电脑主机前置USB接口与后置USB接口在本质上没有什么区别,都是由主板提供的USB接口,都可以进行数据的传输与供电。一般情况下,USB设备接在前置USB接口和后置USB接口都可以正常使用。 

    与主板的连接方式不同,前置USB接口时通过导线连接到主板上的,而后置USB接口一般都是直接集成在主板上的。

    兼容性不同,后置USB接口直接在芯片集成了一部分功能,兼容性较强,大多数的USB接口设备都支持。

    电压不稳定

    由于台式机前置USB接口是通过导线与主板进行连接的,导线一般长40—50厘米,USB接口的规范是额定电压5V,额定电流为500毫安,导线是具有电阻的,导线越长电阻越大。再加上导线的质量层次不齐,前置USB接口的电流往往达不到额定电流。导线越长、质量越差,这种情况就越明显。而后置USB接口是直接集成在主板上的,几乎不存在任何的传输损耗。

    如果电流长时间达不到额定电流时,就会使插在前置USB接口的移动硬盘供电不足,进而导致移动硬盘的损坏。

    信号不稳定

    电脑机箱内的高频杂波比较多,导线做的屏蔽比较差或根本没有做屏蔽,信号也会受到干扰,导致数据传输不稳定,移动硬盘又对信号的稳定性的要求比较高。

    虽然有些电脑的主板通过从电源取电,强化了对前置USB接口的供电能力,尽量解决了前置不足的弊端,但是信号不稳定这一弊端无法解决。

    兼容性差

    后置USB接口上直接集成了芯片,而前置USB接口只是一个单纯的接口,相对于后置USB接口,前置USB接口的兼容性较差,大多数的设备后置USB接口都可以兼容。

    总结

    前置USB接口供电不足、信号不稳定、兼容性差,所以尽量不要将对供电以及信号要求比较高的设备插在前置USB接口,比如移动硬盘,打印机等。

    如果觉得使用后置USB接口不是很方便,可以买一条质量比较好的USB接口延长线插在后置USB接口上。

    展开全文
  • 模拟鼠标或者键盘,必须使用外部固件模式,内置固件只负责信息数据传输,所以不得不选择并口控制或者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;

    }
    }

    展开全文
  • 一般的电子设备都是用TTL,一些通信方式如RS232、RS485、USB等在传输线上使用差分信号(一般两个信号线的差大于2~6V为逻辑1,小于为逻辑0)进行传输(这样的好处是能够有效抑制共模干扰),因此这些通信线上的信号在...

    不同的接口有不同的用途,根据其应用场景就衍生出各种各样的通信接口标准(注意是接口标准,不是协议!),常见的有RS232、RS422、RS485、USB等。

    目录

    TTL

    RS232

    RS422

    RS485

    RS232、RS422、RS485的异同

    USB


    TTL

    TTL(transistor transistor logic)即晶体管-晶体管逻辑电平。TTL电平信号规定,+5V等价于逻辑“1”,0 V等价于逻辑“0”(采用二进制来表示数据时)。这样的数据通信及电平规定方式,被称做TTL(晶体管-晶体管逻辑电平)信号系统,这是计算机处理器控制的设备内部各部分之间通信的标准技术。一般的电子设备用的多是TTL电平,但是它的驱动能力和抗干扰能力很差,不适合作为外部的通信标准,一些通信方式如RS232、RS485、USB等在传输线上使用的不是TTL电平,因此这些通信线上的信号在电子设备端要进行电平转换,才能够正常通信。

    RS232

    RS232是一种接口电气特性的标准,全称是数据终端设备( DTE)和数据通信设备(DCE)之间串行二进制数据交换接口技术标准,RS-232在1962年发布,命名为EIA-232-E(由于EIA提出的建议标准都是以“RS”作为前缀,所以在通讯工业领域,仍然习惯将上述标准以RS作前缀称谓,即RS232),作为工业标准,以保证不同厂家产品之间的兼容。

    DCE(数据通信设备或者数据电路终端设备):该设备和其与通信网络的连接构成了网络终端的用户网络接口。它提供了到网络的一条物理连接、转发业务量,并且提供了一个用于同步DCE设备和DTE设备之间数据传输的时钟信号。调制解调器和接口卡都是DCE设备的例子。
      
    DTE(数据终端设备):指的是位于用户网络接口用户端的设备,它能够作为信源、信宿或同时为二者。数据终端设备通过数据通信设备(例如,调制解调器)连接到一个数据网络上,并且通常使用数据通信设备产生的时钟信号。数据终端设备包括计算机、协议翻译器以及多路分解器等设备。

    RS-232接口是DTE(数据终端设备)和DCE(数据通信设备)之间的一个接口,DTE包括计算机、终端、串口打印机等设备。DCE通常只有调制解调器(MODEM)和某些交换机COM口是DCE,标准指出DTE应该拥有一个插头(针输出)DCE拥有一个插座(孔输出)。

    RS-232总线规定了25条线,包含了两个信号通道,即第一通道(称为主通道)和第二通道(称为副通道)。利用RS- 232总线可以实现全双工通信,通常使用的是主通道,而副通道使用较少。在一般应用中,使用3条~9条信号线就可以实现全双工通信,采用三条信号线(接收线RXD、发送线TXD和信号地GND)能实现简单的全双工通信过程。因此RS232标准有两种接口——DB9和DB25,其中常用的是DB9接口。

    目前较为常用的串口有9针串口(DB9)和25针串口(DB25),通信距离较近时(<12m),可以用电缆线直接连接标准RS232端口(RS422,RS485较远),若距离较远,需附加调制解调器(MODEM)。最为简单且常用的是三线制接法,即地、接收数据和发送数据三脚相连。

    RS232的收、发端数据信号是相对于信号地,如从DTE设备(data terminal equipme)发出的数据是2脚相对7脚(信号地)的电平(DB25)。典型的RS-232信号在正负电平之间摆动,在发送数据时,发送端驱动器输出正电平在+5~+15V,负电平在-5~-15V电平。当无数据传输时,线上为TTL,从开始传送数据到结束,线上电平从TTL电平到RS-232电平再返回TTL电平。接收器典型的工作电平在+3~+12V与-3~-12V。由于发送电平与接收电平的差仅为2V至3V左右,所以其共模抑制能力差,再加上双绞线上的分布电容,其传送距离最大为约15米,最高速率为20kb/s。RS-232是为点对点(即只用一对收、发设备)通讯而设计的,其驱动器负载为3~7kΩ。所以RS-232适合本地设备之间的通信。

    RS232接口标准由于出现较早,所以其目前存在很多问题。
    (1)、接口电平值较高,易损坏接口电路的芯片。又因为与TTL电平不兼容故需使用电平转换电路方能与TTL电路连接。、(2)、传输速率较低,大约为20Kbps;传输距离较短,大约为15米左右。
    (3)、接口由三根线TX、RX、GND组成,没有构成差分线形式,容易产生共地共模干扰,抗干扰能力弱。

    RS422

    RS-422标准全称是“平衡电压数字接口电路的电气特性”,它定义了接口电路的特性,是一种单机发送、多机接收的单向、平衡传输规范,被命名为TIA/EIA-422-A标准,习惯称为RS422。RS-422由RS-232发展而来,它是为弥补RS-232之不足而提出的。为改进RS-232通信距离短、速率低的缺点,RS-422定义了一种平衡通信接口,将传输速率提高到10Mb/s,传输距离延长到4000英尺(速率低于100kb/s时),并允许在一条平衡总线上连接最多10个接收器,一般采用终端匹配的总线型结构,即采用一条总线将各个节点串接起来,不支持环形或星形网络。

    RS485

    为扩展应用范围,EIA又于1983年在RS-422基础上制定了RS-485标准,增加了多点、双向通信能力,即允许多个发送器连接到同一条总线上,同时增加了发送器的驱动能力和冲突保护特性,扩展了总线共模范围,后命名为TIA/EIA-485-A标准。RS-485最常见的应用是在工业环境下可编程逻辑控制器内部之间的通信。

    RS-485采用平衡发送和差分接收,因此具有抑制共模干扰的能力。加上总线收发器具有高灵敏度,能检测低至200mv的电压,故传输信号能在千米以外得到恢复。 RS-485采用半双工工作方式,支持多点数据通信,最大支持32个节点(如果使用特制的485芯片,可以达到128个或者256个节点,最大的可以支持到400个节点),同样不支持环形或星型网络。需要使用星型结构,就必须使用485中继器或者485集线器才可以。

    RS-485采用平衡发送和差分接收方式实现通信:发送端将串行口的TTL电平信号转换成差分信号a,b两路输出,经过线缆传输之后在接收端将差分信号还原成TLL电平信号。由于传输线通常使用双绞线,又是差分传输,所以有强大的抗共模干扰的能力,总线收发器灵敏度很高,可以检测到低至200mv电压。故传输信号在千米之外都是可以恢复。RS-485最大的通信距离约为1219m,最大传输速率为10Mb/s,传输速率与传输距离成反比,在10Kb/s的传输速率下,才可以达到最大的通信距离,如果需传输更长的距离,需要加RS-485中继器。

    RS232、RS422、RS485的异同

    RS-232、RS-422与RS-485都是串行数据接口标准,最初都是由电子工业协会(EIA)制订并发布的,作为工业标准,以保证不同厂家产品之间的兼容。RS-232、RS-422与RS-485标准只对接口的电气特性做出规定,而不涉及接插件、电缆或协议,在此基础上用户可以建立自己的高层通信协议。

    规定 RS232 RS422 R485
    工作方式 单端 差分 差分
    节点数 1发1收 1发10收 1发32收
    最大传输电缆长度 50英尺 4000英尺 4000英尺
    最大传输速率 20Kb/s 10Mb/s 10Mb/s
    最大驱动输出电压 +/-25V -0.25V~+6V -7V~+12V
    驱动器输出信号电平(负载最小值) 负载 +/-5V~+/-15V +/-2.0V +/-1.5V
    驱动器输出信号电平(空载最大值) 空载 +/-25V +/-6V +/-6V
    驱动器负载阻抗(Ω) 3K~7K 100 54
    摆率(最大值) 30V/μs N/A N/A
    接收器输入电压范围 +/-15V -10V~+10V -7V~+12V
    接收器输入门限 +/-3V +/-200mV +/-200mV
    接收器输入电阻(Ω) 3K~7K 4K(最小) ≥12K
    驱动器共模电压 -3V~+3V -1V~+3V -1V~+3V
    接收器共模电压 -7V~+7V -7V~+12V -7V~+12V

    USB

    USB

    USB通过一根4线的电缆传送信号和电源,其中D+、D-用于传输差分信号,另两个是电源线,四个线的名字可以通过颜色加以区分。

    引脚标号 信号名称 缆线颜色
    1 Vcc
    2 Data- (D-)
    3 Data+ (D+) 绿
    4 GND

    一个USB系统中仅有一个USB 主机,设备包括USB功能设备和USB HUB(集线器),最多支持127个设备。物理连接指的是USB传输线。在USB 2.0系统中要求使用屏蔽双绞线。

    USB 数据传输的传输使用反向不归零编码(NRZI)进行传送,可以保证数据的完整性,而且不要求传输过程中由独立的时钟信号。

    再多的部分不再写了,这里只需要知道:USB使用不是TTL电平,是差分信号!有的小伙伴以为USB就是一般单片机上的串口(因为都是四根线,而且USB的硬件接口还真可以当UART串口导线用),其实不是。USB是一个很复杂的协议规范,将来我也会将USB的协议和代码实现写成文,感兴趣可以关注一下!

    展开全文
  • www.dgzj.com QQ群:2179090关注电工之家官方微信公众号“电工之家”,收获更多经验知识RS485是串口的一种,常见的还有RS232,RS422,都属于串口,它们都只是定义了电气特性的通讯结构,并没有定义数据传输的协议。...
  • USB描述符

    2019-10-05 17:55:40
    USB描述符 主机是通过标准的USB请求命令中的GET_DESCRIPTOR...它的作用就是通过响应主机的请求命令操作来给主机传递信息,从而让主机知道设备具有什么功能、属于哪一类设备、要占用多少带宽、使用哪类传输方式及数...
  • USB流量取证分析

    2020-09-22 19:28:10
    0x00:什么是USB? USB是 UniversalSerial...0x01:USB使用的三种方式 USB UART UART,这种方式下,设备只是简单的将 USB 用于接受和发射数据,除此之外就再没有,其他通讯功能了。 USB HID HID 是人性化的接口。这
  • USB host枚举设备的过程

    千次阅读 2013-12-29 17:12:48
    USB host枚举设备的过程 整理自网络 ... USB主机在检测到USB设备插入以后,就会对USB设备进行枚举了。枚举就是从设备中读到一些信息,知道设备是什么样...他要保证数据的正确性,在设备的枚举过程中都是使用控制
  • 标准的USB描述符 当USB设备第一次连接到主机上时,要接收主机的枚举和配置,目的就是让主机知道该设备具有什么功能、是哪一类的USB设备、需要占用多少USB的资源、使用了哪些传输方式以及传输数据量多大等等。...
  • 六、标准的USB描述符

    2018-11-09 23:04:56
    USB 设备第一次连接到主机上时 , 要接收主机的枚举( Enumeration)和配置( Configuration), 目的就是让主机知道该设备具有什么功能、是哪一类的USB设备、需要占用多少USB的资源、使用了哪些传输方式以及传输数据量...
  • usb描述符的简介

    2017-08-13 11:04:01
    它的作用就是通过如问答节中的命令***作来给主机传递信息,从而让主机知道设备具有什么功能、属于哪一类设备、要占用多少带宽、使用哪类传输方式数据量的大小,只有主机确定了这些信息之后,设备才能真正开始工作...
  • 手机蓝牙功能并不是没有人使用,而是使用的人不是那么多。手机蓝牙有很多应用场景:通过蓝牙耳机听歌曲打...早些年功能机时代,手机与电脑之间进行数据传输时,我们常会使用手机USB数据线,这样一来,电脑上的线就...
  • 苹果表示,该USB Type-C接口将电源、USB数据传输、Display Port、HDMI和VGA五种功能集合于一身,重新定义了连接性的标准。  那么,新MacBook的电源适配器以及USB Type-C数据线究竟蕴藏着什么样的秘密呢?...
  • 描述符的作用就是通过命令操作来给主机传递信息,从而让主机知道设备具有什么功能、属于哪一类设备、要占用多少带宽、使用哪类传输方式数据量的大小,只有主机确定了这些信息之后,设备才能真正开始工作。
  • linux为主机,stm32为从机,实现以下:stm32为一个无线传输设备,最大256字节,将接收到的数据通过usb发送给linux,linux将需要发送的信息通过usb发送给stm32。 (linux的usb-skeleton.c已经看过)有以下疑惑: 1....
  • 工业相机的连接方式一般有千兆网线和USB两种,那么,它们有什么区别呢,哪一种连接方式更有优势呢? 工业相机千兆网线的优势:高数据传输率、现有以太网基础架构可用、较长的传输距离、易于集成、高度标准化(采用...
  • 苹果表示,该USB Type-C接口将电源、USB数据传输、Display Port、HDMI和VGA五种功能集合于一身,重新定义了连接性的标准。  那么,新MacBook的电源适配器以及USB Type-C数据线究竟蕴藏着什么样的秘密呢?...
  • 它的作用就是通过如问答节中的命令***作来给主机传递信息,从而让主机知道设备具有什么功能、属于哪一类设备、要占用多少带宽、使用哪类传输方式数据量的大小,只有主机确定了这些信息之后,设备才能真正开始工作...
  • 想必大家应该有经常使用USB数据线,但是另一种数据线OTG大家有没有听过呢?讲真,小编之前对它也不太清楚...USB技术的发展,使得PC和周边设备能够通过简单方式、适度的制造成本将各种数据传输速度的设备连接在一起。...
  • 对于 PS/2 的串口过滤基本上使用通用的绑定设备的方法就可以实现,那么,在 USB传输方式上,究竟会是什么样的呢? 对于这个问题,我在 开源的 ctr2cap 的基础上,做了一些简化的操作,让它来达到这个功能。。。 ...
  • 如果显示的不是device,请确认下您的设备是否已经安装好驱动,并且允许了USB调试,部分手机需要将连接模式设置为传输图片(MTP)模式才可正常连接。 单机场景 Windows: %ANDROID_SDK%\platform-tools\adb.exe ...
  • ELDK使用与开发手册

    2018-03-07 10:53:39
    使用U-Boot下载Linux内核或者应用程序的最快捷的方法是通过网络传输。为了这一目的,U-Boot实现了TFTP协议(参见U-Boot中的tftpboot命令)。为了使主机支持TFTP,你必须确保TFTP后台程序/usr/sbin/in.tftpd已经安装...
  • fastboot是一种线刷,就是使用USB数据线连接手机的一种刷机模式。相对于某些系统(如小米)卡刷来说,线刷更可靠,安全。 recovery是一种卡刷,就是将刷机包放在sd卡上,然后在recovery中刷机的模式。 (2)fastboot...
  • 使用USB转TTL方式(电脑需要安装CH340驱动)连接ESP8266,接线图如下。 二、透传模式 什么是透传模式,简单的讲就是,ESP8266将通过串口接收到的数据,直接进行转发到所设置的目标服务器的端口上,而我们不需要关心...
  • 2、DLNA:这种方式主要通过无线传输方式,传送到PC端,然后再用网页显示出来(不知道我有没理解错?)。我需要usb有线连接,adb传输的。 3、Android screen monitor:使用ddmslib.jar的方式,进行截图,然后PC端...
  • 异步方式数据的每一位分时的使用同一通道进行传输。 RS-232、RS-485、RS-422、SATA和USB都是串口。 串口参数主要包括:波特率、数据位、停止位、流控制协议 编程中包含的主要文件:#include PPSIX终端控制定义 ...
  • libusb-1.0.9

    热门讨论 2012-10-25 15:52:15
    每个端点对于设备来说完成一部分特殊的目标,比如接受命令或者传输数据。一个全速设备最高可以拥有16个端点,然后低速的设备只拥有三个端点。 所有的USB设备当供电时都支持端口0。这个端口是默认的目标管道。当设备...
  • 7.4.9 实际传输数据截图 179 7.5 小结 180 第8章 计算机与Modem的通信 181 8.1 Modem的工作原理 181 8.1.1 Modem的基本工作原理 181 8.1.2 Modem的功能介绍 182 8.1.3 内置Modem与外置Modem 182 8.2 Modem的通信标准...
  • 监听亮屏息屏、获取加速度传感器数据、调用百度SDK获取定位(由于GPS耗电量大,目前一直仅用wifi、基站等较低功耗的定位方式在测试)、操作SQLite数据库、Service中开启一个Thread每隔20s查询下数据库,数据足够量如...

空空如也

空空如也

1 2 3
收藏数 48
精华内容 19
关键字:

usb使用什么方式传输数据