FT245BM USB FIFO 接口设计指南:384 字节缓冲、四线握手与 EEPROM 描述符

调试口从 RS-232 换成 USB,客户电脑认不出、大数据吞吐忽高忽低,问题多半不在电路。结论先给:FT245BM 把 USB 协议做进芯片,MCU 只面对并口和四根握手线;真正的门槛是时序余量、缓冲区超时和 EEPROM 里的 VID/PID。

2026-10-28
USB接口FT245BMFIFO握手EEPROM工业终端驱动程序

工业设备的调试口以前大多是一颗 MAX232 加 DB9,现在客户只给一根 USB 线:插上不认、驱动装不上、传大数据时吞吐忽高忽低,是这类改造里最常见的三类投诉。结论先给:FT245BM 把整个 USB 协议做在片内,MCU 侧只看到 8 位数据口加 4 根握手线,384 字节发送缓冲、128 字节接收缓冲,D2XX 驱动下能跑到 1 MB/s;真正决定体验的不是芯片,而是握手时序余量、缓冲区超时设置和外挂 EEPROM 里的描述符。

一、片内做完 USB 协议:MCU 只看到并口和四根握手线

FT245BM 是 FTDI 的第二代 USB FIFO 芯片,32 脚 LQFP 封装,单 5V 供电,内部自带 3.3V 稳压器和 PLL,把外部 6 MHz 时钟倍频到 48 MHz 供 USB 使用。对固件工程师来说,它就是一个"带流控的并口":数据线 D0~D7 接 MCU 的一个 8 位端口,控制线只有 TXE#、RXF#、RD#、WR 四根,不需要写任何 USB 协议栈。

项目手册数值对设计的影响
传输速率D2XX 驱动 1 MB/s;VCP 驱动 300 KB/s选驱动方式等于选吞吐上限
片内缓冲发送 384 字节,接收 128 字节接收缓冲小,MCU 必须及时取数
供电4.35~5.25 V 单电源5V 系统可直接供电,无需外部 3.3V
IO 电平VCCIO 独立引脚,内置电平转换可直连 5V 或 3.3V 逻辑,省掉电平芯片
USB 兼容性USB 1.1 / 2.0 兼容,片内 6 MHz 倍频 48 MHz不需要外部 USB 高速器件,线材要求低
配置存储外挂 93C46/56/66,93C46 为 64×16 位VID/PID 与序列号都存在这里
复位内置上电复位,另有 RSTOUT# 输出可给 MCU 提供复位,省一颗复位芯片

两种驱动的差别要提前想清楚。VCP 驱动把设备伪装成标准串口,上位机用现成的串口代码就能收发,但波特率设置是"摆设"——手册写明命令会被忽略,芯片始终按自己最快的速度搬数据,所以指望它做精确的 9600 b/s 时序会出错。D2XX 驱动通过 DLL 直接访问设备,吞吐能到 1 MB/s,代价是上位机要按 FTDI 的 API 写代码。调试口、参数下发这类低频场景用 VCP 更省事;波形数据、批量日志上传就该走 D2XX。

二、四线握手:时序余量在 MCU 这一侧

TXD 方向的数据流是这样的:MCU 检测到 TXE# 为低,把一字节写到 D0~D7,再给 WR 一个低脉冲;芯片收下这一字节后把 TXE# 拉高,等内部 FIFO 腾出空间再拉低。接收方向反过来:RXF# 为低表示至少有一个字节可取,MCU 给 RD# 一个低脉冲后读数据。手册给的手册级时序如下,单位都是纳秒:

参数含义最小 / 最大MCU 侧注意
T1RD# 有效脉宽≥50脉冲太短会读不到数据
T3RD# 有效到数据有效20 / 50读之前留够建立时间
T5RD# 无效到 RXF# 变化0 / 25不要靠 RXF# 立即翻转判断
T6RXF# 在一次读周期后失效≥80连续读要留 80 ns 间隔
T7WR 有效脉宽≥50GPIO 翻转要够宽
T9WR 失效前数据建立≥20先放数据再拉 WR
T11WR 无效到 TXE# 变化5 / 25写完别马上判 TXE#
T12TXE# 在一次写周期后失效≥80连续写要留 80 ns 间隔

这些数字看起来宽松,真正吃掉余量的是 MCU 侧的软件开销。72 MHz 的 MCU 跑一条 GPIO 翻转指令在几十纳秒量级,中间只要进一次中断,50 ns 的脉宽就可能变成几百纳秒;如果 FIFO 操作放在中断里,还要把更高优先级中断的延迟算进去。稳妥的做法是把 RD#/WR 脉冲用连续几条语句写死、期间关中断,或者直接挂到 FSMC/外部总线上由硬件产生时序。

三、吞吐与延迟:1 MB/s 和 300 KB/s 之间还有一层"超时"

很多人以为吞吐只由驱动决定,实际还有一个隐藏参数:发送缓冲区的超时时间。芯片收下若干字节后不会立刻打包上传,而是等缓冲区填满或超时到点才发。手册写明这个超时可以按 1 ms 步进在 1~255 ms 之间配置,而上一代芯片是固定 16 ms;默认值下,每 10 ms 发一帧小数据的设备,上位机会看到明显的"一批一批"到达。

两个办法解决:一是把超时调小,代价是 USB 事务变多、总线开销上升;二是用第 28 脚 SI/WU,MCU 在写完一帧后把它拉低,芯片立即把接收缓冲里的数据推给主机,不管包大小。反过来,主机下发大数据时受 128 字节接收缓冲限制,MCU 必须持续把数据取走,一旦取数慢于 USB 到达速度,芯片会通过 USB 流控让主机等,表现为"上位机写入卡住"——这不是故障,是背压。

四、EEPROM 与电源管理:不写描述符,每台电脑都要装驱动

FT245BM 的 VID、PID、序列号和产品描述字符串都存在外挂的 93C46/56/66 里,芯片支持通过 USB 在线烧写。空着不焊或者沿用默认值,后果是所有同型号设备在主机眼里长得一模一样:多台设备同时插上时分不清谁是谁,驱动也只能靠默认 VID/PID 匹配,产品换个名字就得让客户重新装一次驱动。量产时把 VID/PID、序列号写进 EEPROM,再配合上位机按序列号枚举,是这类设备最基本的产品化动作。

电源侧有三条容易踩的线。第一,PWREN# 上电为高,要等 USB 枚举成功才变低,手册明确要求总线取电超过 100 mA 的设备必须用它控制外部电源,否则枚举完成前就超限。第二,待机电流典型值低于 100 µA(不含 USBDP 上的 1.5 kΩ 上拉),整机要满足 500 µA 挂起电流限制,就得让 MCU 跟着进低功耗。第三,RSTOUT# 在复位期间是三态、没有下拉能力,要用它复位外部 MCU 就必须加下拉电阻,参考电路里是 47 kΩ;不用时悬空即可。

外围还有几个固定动作:USB 差分对串 27 Ω、VBUS 串磁珠、TEST 脚接地、6 MHz 谐振配 33 nF 负载电容、总线供电时 USBDP 上拉 1.5 kΩ。这些在 FTDI 的参考原理图里都有,照抄即可,唯独 RSTOUT# 的下拉最容易被漏掉。

五、MCU 侧代码与现场排查

把握手落到代码上就是一个状态轮询加两个脉冲,下面按 STM32 的寄存器写法给出最小实现,数据口假设映射到外部存储区:

#define FIFO_DATA (*(volatile uint8_t *)0x60000000)
#define TXE_N     (GPIOA->IDR & (1u << 0))
#define RXF_N     (GPIOA->IDR & (1u << 1))
#define WR_LOW()  (GPIOB->BRR  = (1u << 3))
#define WR_HIGH() (GPIOB->BSRR = (1u << 3))
#define RD_LOW()  (GPIOB->BRR  = (1u << 4))
#define RD_HIGH() (GPIOB->BSRR = (1u << 4))

int fifo_write(uint8_t b)
{
    uint32_t guard = 100000;
    while (TXE_N && --guard) { }   /* TXE# low: room */
    if (guard == 0) return -1;
    FIFO_DATA = b;
    WR_LOW();
    __NOP(); __NOP();              /* keep >= 50 ns */
    WR_HIGH();
    return 0;
}

int fifo_read(uint8_t *p)
{
    uint32_t guard = 100000;
    while (RXF_N && --guard) { }   /* RXF# low: data */
    if (guard == 0) return -1;
    RD_LOW();
    __NOP(); __NOP();
    *p = FIFO_DATA;
    RD_HIGH();
    return 0;
}

注意两个循环都要有超时退出,USB 线被拔掉时 TXE#/RXF# 不会按预期变化,没有 guard 的写法会让设备卡死在 while 里。实际项目里如果数据量大,建议把数据口挂到 FSMC 的 8 位模式,让硬件产生 RD#/WR 时序,软件只负责状态判断。

现场现象优先检查处理方向
插上后提示未知设备USBDP 上拉、27 Ω 与磁珠、EEPROM 是否空片先看设备管理器描述符,再量 D+ 电平
多台设备只认一台EEPROM 里 VID/PID 与序列号重复逐台写入唯一序列号
小包数据延迟明显发送缓冲区超时设置调小超时或使用 SI/WU 强制发送
上位机写入卡住接收缓冲 128 字节被占满提高取数频率,别在中断里做长任务
休眠电流超标MCU 未随 PWREN# 进入低功耗把 PWREN# 接到 MCU,挂起时断电外设

一句话总结:FT245BM 把 USB 的复杂度收进芯片,留给工程师的只有三笔账——握手脉冲要够宽、缓冲区超时要配小、EEPROM 描述符要唯一。硬件照着参考图抄、软件把超时和背压处理掉,一个调试口就能稳定服役到产品生命周期结束。

还想接着看:RS-485 多节点总线怎么组、I2C、SPI、UART 三种接口怎么选、物联网网关通信方式选型。

本文基于 FTDI FT245BM 数据手册(DS245B Version 1.7,2005)与 FT245BM Designer's Guide(DG245 Version 2.0)中的特性、FIFO 读写时序、EEPROM 配置与参考原理图章节整理优化。

需要定制开发?

沧州艾诺威电子 — 国家高新技术企业,20+项国家专利
嵌入式系统开发 · 物联网方案 · AI智能硬件 · 一站式交付

立即微信咨询

电话:13930711029 | 邮箱:tech@czinv.com | 24小时内响应