
USB
文章平均质量分 78
pq113_6
这个作者很懒,什么都没留下…
展开
-
GD32450i-EVAL学习笔记 19 - USB FS 数据传输
1. SETUP数据包的获取SETUP数据包的获取发生在接收数据FIFO非空中断下图是接收数据FIFO非空中断的处理流程图:在接收SETUP数据包前必须先设置好USBFS_DOEP0LEN中的STPCNT的大小,控制端点每收到一个 SETUP 数据包后, STPCNT的值都会递减。STPCNT的值必须设置为3.而接收数据 FIFO 中需要分配一些额外空间,以便能够在控制端点上接收连续的最多三个 SETUP 数据包。每个SETUP需要8个字节的数据和4个字节的SETUP状态,3个S..原创 2021-12-26 15:58:37 · 2532 阅读 · 11 评论 -
FT4232H Android开发 6 - USB转IIC
IIC的实现采用GPIO模拟的方式。GPIO的方式可以采用任意IO作为IIC的管脚。这里为了程序简单点,只使用PortD口作为IIC的IO。为了保持兼容性,选择xDBUS0作为IIC的SCL,xDBUS1和xDBUS2短接在一起作为SDA,xDBUS1作为SDA的输出,而xDBUS2作为SDA的输入。实际只使用xDBUS1作为SDA口的输入输出。1. 新建类mpsse_iicpublic class mpsse_iic { public FT_Device ftDevice;...原创 2021-10-25 18:30:00 · 1071 阅读 · 0 评论 -
FT4232H Android开发 5 - USB转SPI
目录1.基本原理2. 设置频率3. CS电平控制4. SPI写的实现5. SPI读的实现6. 验证当FT4232H作为MPSSE设备时,DBUS0固定为CLK输出,DBUSD1固定为DO,DBUSD2固定为DI。其他DBUS口都可以作为SPI的CS脚控制,所以理论上FT4232H可以一路通道控制5个SPI设备。验证的电路如下:基于USB转GPIO的工程修改1.基本原理与USB转GPIO类似,通过特殊的命令字写入FTx232H,FTx232H在DO上根据...原创 2021-10-24 18:30:00 · 2598 阅读 · 0 评论 -
FT4232H Android开发 4 - USB转GPIO
USB转GPIO利用的是FT4232H的MPSSE模式。FT4232H虽然有4路UART,但是只能支持2路MPSSE(Channel A和Channel B)。其中Channel A对应ADBUS0 ~ ADBUS7,而Channel B对应BDBUS0 ~ BDBUS7,即FT4232H最多可以操作16个GPIO(注意,FT2232H最多可以操作32个GPIO,每个Channel可以多控制8个GPIO)。1. 新建一个类mpsse该类继承自FTDevicepublic class mps..原创 2021-10-23 18:30:00 · 1902 阅读 · 0 评论 -
FT4232H Android开发 3 - USB转UART
FT4232H支持4路串口,选择第一路串口做LOOP实验,将AD0和AD1短接1. 新建继承FTDevice的类usb2uartpublic class usb2uart extends FTDevice{ public usb2uart(Context context) { super(context); }}2. 函数open打开串口设备,并设置串口的波特率、校验方式、数据位数,停止位数。public int open(int bau.原创 2021-10-22 18:30:00 · 1046 阅读 · 0 评论 -
FT4232H Android开发 2 - 建立一个FTDI设备的样板工程
d2xx.jar可以用在FTDI的USB产品上,不仅仅是FT4232H。对于一个FTDI的设备,都需要找到这个设备,并Open设备。原创 2021-10-21 18:30:00 · 1156 阅读 · 0 评论 -
Linux如何安装FTDI D2XX驱动
1. VCP驱动和D2XX驱动的区别VCP是VirtualCOMPort的简称,VCP驱动是通用的虚拟串口驱动,一般系统是内嵌此驱动。D2XX驱动是FTDI为其USB桥接芯片设计的驱动程序,可以提供更多的USB虚拟设备支持(即FTDI独有的MPSSE功能),例如USB转SPI,USB转I2C等。2. 使用VCP驱动2.1 打开终端,输入dmesg | grep FTDI(当前插入的FT4232H的平台,4路串口)2.2 安装minicom在终端中输入 : sudo apt-ge...原创 2021-09-22 17:39:35 · 7027 阅读 · 0 评论 -
FT4232H Android开发 1 - 建立环境
系统:Windows 10 64bitIDE: Android Studio硬件平台:FT4232H Mini Module1. 新建工程2. 下载J2XXhttps://ftdichip.com/wp-content/uploads/2021/01/Android_Java_D2XX_2.08.zip将d2xx.jar拷贝到\app\libs\下,然后在Android Studio中就会出现这个JAR文件右键选中这个文件,菜单中选择“Add As Library”.原创 2021-10-20 18:30:00 · 1217 阅读 · 0 评论 -
USB HOST芯片SL2.1A调试心得
SL2.1A是一颗1转4口的USB HOST芯片。它的外围电路非常简单,价格便宜。不过调试中遇到一些问题,记录一下。1.原创 2021-06-27 07:21:02 · 14392 阅读 · 9 评论 -
基于STM32F103的USB学习笔记38 - Mass Storage之SPI Flash做U盘
SPI NorFlash的Sector大小为4KB,所以MSC_MEMORY_BLOCK_SIZE和FAT_SECTOR_SIZE都设置为4096.NorFlash选择的是4MB的大小,为了减少簇的数量,选择每个簇为64KB,即16个Sector。原创 2021-05-29 09:23:59 · 1310 阅读 · 0 评论 -
基于STM32F103的USB学习笔记37 - Mass Storage之调试
尝试解决拷贝覆盖的问题。1. 让根目录区可写const uint8_t mscRootDir[ROOT_SIZE * FAT_SECTOR_SIZE]在写里面添加写跟目录区else if(gScsiInfo.offset >= (FAT_RESERVE_SIZE + FAT_SIZE * 2) * FAT_SECTOR_SIZE){//Root Area uint32_t i; offset = gScsiInfo.offset - (FAT_RESERVE_SIZ原创 2021-05-23 18:00:02 · 508 阅读 · 7 评论 -
C# USB转串口编程 - 查找COM口
参考文档https://www.cnblogs.com/catzhou/archive/2018/06/08/9156863.html1. 新建类SetupAPI.cs,处理SetupAPI.dll对应的操作a. API函数SetupDiGetClassDevs[DllImport("SetupAPI.dll")]public static extern IntPtr SetupDiGetClassDevs( ref Guid ClassGuid, [Marshal.原创 2021-05-05 17:43:09 · 4441 阅读 · 3 评论 -
C++ USB转串口编程 - 查找COM口
环境:Visual Studio 2017 + Windows 101. 新建项目,选择C++和DLL生成空项目SerialPort2. 新建头文件“SerialPort.h”原创 2021-05-02 09:20:18 · 3971 阅读 · 6 评论 -
STM32F103 USB EP0通信数据详解
记录一下STM32F103的USB端点0的数据处理过程。可以用一个变量gUsbDevState.state记录USB的状态,开始的时候USB的状态为USB_CTRL_IDLE。1. HOST第一笔数据是SETUP数据,即告知Device接下来的数据要如何处理。从USB buffer中读入8字节数据获取Setup信息。下面是这8个字节具体对应的含义。#pragma pack (1)typedef struct _stUSBReqInfo{ uint8_t bmRequestType;..原创 2020-10-03 11:21:22 · 5333 阅读 · 3 评论 -
基于STM32F103的USB学习笔记36 - Mass Storage之Memory管理
用内部RAM作为Memory作为示例。开一个2KB空间作为U盘容量。#define MSC_MEMORY_SIZE 2048uint8_t gMscMemroy[MSC_MEMORY_SIZE];原创 2021-05-22 07:14:50 · 1289 阅读 · 0 评论 -
基于STM32F103的USB学习笔记35 - Mass Storage之SCSI命令
参考文档:UFI Command Specification1.SCSI_TEST_UNIT_READY(0x00)查询设备是否ready。空闲的时候,主机就会发送testready命令下来,这个命令不用回复和应答数据,如果已经Ready,只要回复个CBW即可。如果设备无法运行或处于需要主机操作以准备就绪的状态,设备应返回检查条件状态,检测键为NOT ready。void scsiCmdTestUnitReady(uint8_t lun){ if(massMalGetStatus(...原创 2021-05-22 07:14:42 · 4375 阅读 · 3 评论 -
基于STM32F103的USB学习笔记34 - Mass Storage之CBW、CSW和数据的处理
将HOST发送过来的数据拷贝到CBW结构体中。 uint8_t i; for(i = 0; i < gMscBotData.len; i++) { *((uint8_t *)&gMscCBW + i) = gMscBotData.dat[i]; }把CBW中的Tag值和数据长度赋值给CSW。 gMscCSW.dTag = gMscCBW.dTag; gMscCSW.dDataResidue = gMscCBW.dDataL...原创 2021-05-22 07:14:32 · 1567 阅读 · 0 评论 -
基于STM32F103的USB学习笔记33 - Mass Storage之BOT
BOT就是Bulk Only Transport的缩写。数据、命令、状态都通过Bulk端点传输(没有使用到中断、控制端点),这里用到的是EP1和EP2,2个端点都是Bulk的模式,这就是所谓的Bulk Only。命令/数据/状态的协议如下图所示:【CBW】CBW是Command Block Wrapper的缩写。一个CBW包结构如下图所示:dCBWSignature: 固定为43425355h(小端),表示这段数据是CBW。dCBWTag: HOST发送的命令标记。设备在CSW.原创 2021-05-22 07:14:23 · 1268 阅读 · 0 评论 -
基于STM32F103的USB学习笔记32 - Mass Storage之修改属性及其处理部分
1. 修改端点数量的宏定义:#define EP_NUM (3)2. 字符串描述符的结构增加一条ONE_DESCRIPTOR stUsbStringDescriptor[] ={ {(uint8_t*)usbDeviceStringLangID, USB_DEVICE_STRING_LANGID}, {(uint8_t*)usbDeviceStringVendor, USB_DEVICE_STRING_VENDOR}, {(uint8_t*)usbDeviceS...原创 2021-05-22 07:14:12 · 527 阅读 · 0 评论 -
基于STM32F103的USB学习笔记31 - Mass Storage之修改描述符
例程Mass Storage使用的是SCSI子类下的Bulk-Only传输协议。1. 修改设备描述符:修改PID和VID即可,子类在配置描述符中的接口描述符中指定。 0x83, /*idVendor (0x0483)*/ 0x04, 0x20, /*idProduct = 0x5710*/ 0x57,2. 修改配置描述符基本不需要修改,也是1个接口。3. 修改接口描述...原创 2021-05-22 07:13:57 · 1014 阅读 · 0 评论 -
基于STM32F103的USB学习笔记30 - 虚拟串口之完善USB请求
1.usbClassGetInterfaceSetting中接口数量改为1,因为这里有2个接口RESULT usbClassGetInterfaceSetting(uint8_t Interface, uint8_t AlternateSetting){ if (AlternateSetting > 0) { return USB_UNSUPPORT; } else if (Interface > 1) { retu...原创 2020-06-21 16:24:52 · 1965 阅读 · 0 评论 -
基于STM32F103的USB学习笔记29 - 虚拟串口之端点
1. 修改EP数量,用到EP0,EP1,EP2,EP3共4个端点#define EP_NUM (4)2. 修改端点的PMA分配/* EP0 *//* rx/tx buffer base address */#define ENDP0_RXADDR (0x40) //0x80-0x40 = 0x40 = 64字节#define ENDP0_TXADDR (0x80) //0xC0 - 0x80 = 0x40 =...原创 2020-06-21 16:23:47 · 1661 阅读 · 0 评论 -
基于STM32F103的USB学习笔记28 - 虚拟串口之修改描述符
同样基于JoyStickMouse例程修改。a) 设备描述符中修改设备的类和PID,VIDconst uint8_t usbDeviceDescriptor[USB_DEVICE_DESC_LEN] ={ USB_DEVICE_DESC_LEN, /*bLength */ USB_DEVICE_DESCRIPTOR_TYPE, /*bDescriptorType*/ 0x00, /*bcdUSB */ 0x02, ...原创 2020-06-21 10:27:14 · 2007 阅读 · 0 评论 -
基于STM32F103的USB学习笔记27 - CustomHID
基于JoyStickMouse例程修改即可。1. 调整描述符设备描述符可以不用改。配置描述符长度改为41,主要是增加一个端点。#define USB_CONFIG_DESC_LEN 41配置描述符集合中的Interfae描述符修改如下, 0x09, /*bLength: Interface Descriptor size*/ USB_INTERFACE_DESCRIPTOR_TYPE,/*bDescriptorTy...原创 2020-06-20 19:58:32 · 1069 阅读 · 2 评论 -
基于STM32F103的USB学习笔记26 - JoyStickMouse调试
例程在Win10下好像有问题,设备能被识别到,但是并没被识别为HID设备,Win10也没有提示错误。用Wireshark查看一下USB通信过程。下图是抓取的数据可以看到USB HOST拿到到配置描述符后并没有继续拿描述符。而配置描述符也是和代码中的配置一致。抓USB鼠标的数据对比看看差别:...原创 2020-06-20 10:16:37 · 1088 阅读 · 3 评论 -
基于STM32F103的USB学习笔记25 - In0_Process
In0_Process是USB主机从设备端点0读数据的处理过程。uint8_t In0_Process(void){ uint32_t ControlState = pInformation->ControlState; if ((ControlState == IN_DATA) || (ControlState == LAST_IN_DATA)) { DataStageIn(); /* ControlState may be chang...原创 2020-06-19 22:08:15 · 477 阅读 · 3 评论 -
基于STM32F103的USB学习笔记24 - DataStageOut
函数DataStageOut是写数据到端点0的过程。与DataStageIn相对应。void DataStageOut(void){ ENDPOINT_INFO *pEPinfo = &pInformation->Ctrl_Info; uint32_t save_rLength; save_rLength = pEPinfo->Usb_rLength; if (pEPinfo->CopyData && save_rLengt...原创 2020-06-19 22:07:57 · 482 阅读 · 0 评论 -
基于STM32F103的USB学习笔记23 - Out0_Process
Out0_Process是处理端点0上的USB主机发送数据到设备的OUT过程。uint8_t Out0_Process(void){ uint32_t ControlState = pInformation->ControlState; if ((ControlState == IN_DATA) || (ControlState == LAST_IN_DATA)) {//表明还在数据IN的过程,总线输出STALLED的状态 /* host aborts ...原创 2020-06-19 22:07:41 · 297 阅读 · 0 评论 -
基于STM32F103的USB学习笔记22 - DataStageIn
函数DataStageIn是读取数据的过程。USB主机知道要读取的总长度,如果一次读入不够,主机会发多次IN读完数据,所以需要一个机制来确认每笔数据的内容和长度。void DataStageIn(void){ ENDPOINT_INFO *pEPinfo = &pInformation->Ctrl_Info; uint32_t save_wLength = pEPinfo->Usb_wLength; uint32_t ControlState = pInfo...原创 2020-06-19 22:07:21 · 519 阅读 · 0 评论 -
基于STM32F103的USB学习笔记21 - Data_Setup0
处理有数据阶段的SETUP过程。void Data_Setup0(void){ uint8_t *(*CopyRoutine)(uint16_t); RESULT Result; uint32_t Request_No = pInformation->USBbRequest; uint32_t Related_Endpoint, Reserved; uint32_t wOffset, Status; CopyRoutine = NULL; ...原创 2020-06-14 20:10:12 · 648 阅读 · 0 评论 -
基于STM32F103的USB学习笔记20 - NoData_Setup0
处理没有数据阶段的SETUP过程首先会判断接收到的数据中第一个字节USBbmRequestType,判断bit6-bit5(REQUEST_TYPE)和bit4-bit0(RECIPIENT)#define Type_Recipient (pInformation->USBbmRequestType & (REQUEST_TYPE | RECIPIENT))void NoData_Setup0(void){ RESULT Result = USB_UNSUPPORT;...原创 2020-06-14 20:09:54 · 591 阅读 · 0 评论 -
基于STM32F103的USB学习笔记19 - Setup0_Process
uint8_t Setup0_Process(void){ union { uint8_t* b; uint16_t* w; } pBuf; uint16_t offset = 1; pBuf.b = PMAAddr + (uint8_t *)(_GetEPRxAddr(ENDP0) * 2); //指针指向PMA中的EP0的Rx Buffer地址 if (pInformation->ControlState != P...原创 2020-06-14 20:09:07 · 566 阅读 · 0 评论 -
基于STM32F103的USB学习笔记18 - CTR_LP
设置好设备地址(开始设置为0),使能USB,USB中断就会开始工作。1.设置设备地址,使能USB_SetDADDR(Val | DADDR_EF);2. USB中断函数调用CTR_LP()void CTR_LP(void){ __IO uint16_t wEPVal = 0; while (((wIstr = _GetISTR()) & ISTR_CTR) != 0) //如果一直有正确的传输就一直处理数据。EP0除外,EP0处理完就返回了。...原创 2020-06-14 10:11:22 · 840 阅读 · 0 评论 -
基于STM32F103的USB学习笔记17 - 初始化端点
USB 端点n寄存器(USB_EPnR), n=[0..7],其结构如下图:CTR_RX:正确接收标志位,由硬件置位,只能写0。DTOG_RX:用于数据接收的数据翻转位,此位应用程序可读可写,但写0无效,写1可以翻转此位。STAT_RX[1:0]:用于数据接收的状态位,此位用于指示端点当前的状态,这些位也是写0无效,写1翻转,SETUP:SETUP分组传输完成标志位,硬件置位并且只有控制端点才使用。此位应用程序只读。EP_TPYE[1:0]:端点类型位EP_KIND:..原创 2020-06-14 10:10:52 · 1601 阅读 · 0 评论 -
基于STM32F103的USB学习笔记16 - 分组缓冲存储区
Device_Property.Reset()里面有几个概念1.BTABLESTM32F103有一组分组缓冲存储区,大小为512字节。原创 2020-06-13 19:33:43 · 2240 阅读 · 0 评论 -
基于STM32F103的USB学习笔记15 - USB中断处理
端点是一个逻辑通道,用于定义一个USB设备不同传输特性的通道。一个USB设备最多只能有16个端点,其中端点0是默认端点,其作用为对设备枚举和对设备进行一些基本的控制功能,端点0也被称为控制端点。端点0是双向的,而其他端点是单向的,并且只能在Set Config之后使用。...原创 2020-06-13 19:33:24 · 5160 阅读 · 0 评论 -
基于STM32F103的USB学习笔记14 - Transfer与Transaction
将不同的包按照一定的规则组织在一起就是一个transaction。一个transaction一般有2个包(令牌包+握手包)或3个包组成(令牌包+数据包+握手包)。一个Transfer包含一个或多个Transaction。USB协议规定了4种Transfer类型:批量传输、等时传输、中断传输和控制传输。1. 批量传输批量传输中的数据包并没有规定具体的意义和结构,需要设备自己解释处理。批量传输用于数据量大,实时性要求低的场合,如U盘。2.等时传输等时传输没有握手包,等时传输用于数据.原创 2020-06-13 19:32:37 · 941 阅读 · 0 评论 -
基于STM32F103的USB学习笔记13 - USB的包结构
USB是一个串行总线,,在其上面传输的数据是以包为基本单位的,分4类包,分别为令牌包,数据包,握手包和特殊包。包的数据结构如下:1. 同步域全速设备和低速设备的同步域使用的是0b00000001,即一共8bit,7bit 0 + 1bit 1; 而高速设备使用的是31bit 0 + 1bit。后面不再说明高速设备的区别,只考虑全速设备。同步域的作用是同步时钟,并告诉USB设备准备好数据传输。下图是一个同步域的时序图(USB通信采用的是NRZI编码)2. PID(包标识)..原创 2020-06-13 19:32:10 · 953 阅读 · 0 评论 -
基于STM32F103的USB学习笔记7 - 配置描述符
在设备描述符的最后一个字节表明设备有几个配置描述符,从而主机能够从设备描述符得知需要获取几个配置描述符。配置描述符里面定义了有多少个接口(interface)。原创 2020-06-10 20:32:26 · 833 阅读 · 0 评论 -
基于STM32F103的USB学习笔记12 - HID设备的描述符总结
USB主机通过描述符一级级的得到从机的信息,STM32的USB代码是通过Device_Property实现的。一个USB设备只有一个设备描述符--N个配置描述符 -----N个接口描述符--------N个端点描述符原创 2020-06-13 10:59:42 · 1375 阅读 · 0 评论