摘 要: FT245BM芯片是FTDI(Future Technology Devices Intl. Ltd)公司生产的一种USB接口芯片,支持USB协议与并行I/O协议之间的转换,文中主要介绍了FT245BM芯片的内部结构、功能、工作原理,以及基于FT245BM芯片的硬件接口设计及软件编程。
关键字:FT245BM;USB
概要
通用串行总线USB(Universal Serial Bus)由于具有数据传输速率高、易于使用、支持热插拔等特点,越来越成为一种流行的计算机通信接口。FT245BM芯片是由FTDI(Future
Technology Devices Intl. Ltd)公司推出的第二代USB接口芯片,与其他USB芯片相比,应用FT245BM芯片进行USB外设开发,只需熟悉单片机(MCU)编程及简单的VC或VB
编程,而无需考虑固件设计以及驱动程序的编写,从而能大大缩短USB外设产品的开发周期。此外,FT245BM支持USB1.1及USB2.0规范,数据传输速度可达到1M
byte/s。因此,FT245BM是开发USB外设所需接口芯片的极佳选择。
FT245BM的结构与功能
FT245BM芯片是一种32脚,LQFP封装的芯片,管脚定义如下:
D[0-7](25,24,23,22,21,20,19,18):双向数据信号线;
RD#(16):读信号;
WR(15):写信号;
TXE#(14): FIFO发送缓冲区空标志信号;
RXF#(12): FIFO接收缓冲区非空标志信号;
USBDP(7),USBDM(8):USB数据信号正端,USB数据信号负端;
EECS(32),EESK(1),EEDATA(2):EEPROM片选线,时钟线,数据线;
PWREN(10):电源使能信号;
SI/MU(11):立即发送或唤醒信号;
RESET(4):复位信号;
RSTOUT(5):内部复位生成器的输出信号;
XTIN(27),XTOUT(28):时钟输入信号,输出信号;
TEST(31):测试信号;
3V3OUT(6):3.3V输出信号;
VCC(3,26),VCCIO(13),AVCC(30):芯片电源,控制引脚电源,内部模拟电源;
GND(9,17),AGND(29):芯片地,内部模拟地。
芯片内部由3.3V稳压器,USB收发器,锁相环,串行接口引擎(SIE),FIFO控制器,USB协议引擎,FIFO接收缓冲区,发送缓冲区以及6M振荡器,8倍频时钟倍频器等组成。
FT245BM芯片可实现USB接口与并行I/O接口之间数据的双向转换。一方面,当USB收发器从主机接收USB串行数据后,由串行接口引擎将数据转换成并行数据,存储在FIFO接收缓冲区,
FIFO控制器检测到读信号RD为低,就把接收缓冲区的数据送到并行数据线D0-D7上;另一方面当FIFO控制器检测到写信号WR为高时,就从数据线D0-D7上读取并行数据,存储在FIFO发送缓冲区,并行数据经串行接口引擎转换成USB串行数据,再通过USB收发器传送到主机。可见FT245BM芯片自身就可完成数据转换,而不需要设计者考虑硬件设计。其内部结构功能如图1。
图1 FT245BM芯片功能框图(略)
硬件接口设计
接口电路原理图见图2。
设计采用USB总线供电,图2中FT245BM与一片MCU相连,MCU的一个8位端口用来传输数据,另外一个端口用来控制和产生FT245BM需要的4根握手信号线,即RXF#、TXE#、RD#、WR。TXE#为低,表示当前FIFO发送缓冲区空,这时WR脉冲由高变低就将数据线D0-D7上数据写入FIFO发送缓冲区中;当TXE#变高时,表示当前FIFO发送缓冲区满或者正在存储上一个字节,禁止向发送缓冲区中写数据。RXF#为低,表示当前FIFO接收缓冲区有数据,这时RD#脉冲由低变高,将从FIFO接收缓冲区中读取数据;读信号RD#为低时,把数据读到数据线D0...D7上;当RXF#为高时,禁止从FIFO接收缓冲区读数据。读写时序见图3与图4。
图2 硬件设计原理(略)
图2中的93C46(93C56或93C66)是一片EEPROM,用于存储产品的VID、PID、设备序列号及一些说明性文字等。该EEPROM是可选的,若没有EEPROM,FT245BM将使用默认的VID、PID、产品描述符和电源描述符,并且没有设备的序列号。
图3 读数据时序(略)
图4 写数据时序(略)
设计时需在USB接口的电源端连接一个磁珠,以减少设备的噪声和USB电缆辐射对主机产生的电磁干扰;电源端增加了去耦和旁路电容,以提高电路的抗干扰性能。还需注意的是,电路中RSTOUT#用来提供上电复位MCU。如果MCU本身有复位逻辑,那么通常就不需使用RSTOUT#来复位设备,这部分连接与47K下拉电阻就能省略。
软件设计
当外设连到主机USB接口时,主机会检测到新硬件,这时需要安装一个可从FTDI公司的网站上免费下载的虚拟串口(VCP)驱动程序,该驱动程序适用于WINDOWS98/2000/ME/XP等不同操作系统。设计者需要完成的是,编写一个针对虚拟串口通信的应用程序,把虚拟串口(VCP)当作一个标准的串口去访问。
设计的软件部分可使用VB或VC语言中提供的串口通信MSComm控件进行应用程序编写,下面我们以VC语言为例介绍如何编写应用程序,主要介绍MSComm控件的设置及串口消息事件MSComm.CommEvent响应函数的编写。
1)MSComm控件设置:编程时通常把虚拟串口设置为COM3,即将MSComm.SetCommPort置为3, MSComm.SetSettings置为"9600,n,8,1"(该速率为默认设置,实际上VCP驱动程序总是使数据以最快速率传输);通过MSComm.SetPortOpen设置COM3的开关状态;通过MSComm.SetInput和MSComm.SetOutput读入或输出数据。在读取数据时,设置MSComm.Rthreshold的值为1。
2)有数据传到PC机时,就立即触发串口消息事件MSComm.CommEvent,自动读取COM3的数据。下面是本文作者编写的应用程序,处理这个串口消息事件的OnComm函数,其完成的是从串口接收数据并显示在一个编辑框中。
发送数据则可自动发送或者手动发送,这由用户根据具体情况自己设定。
void CAaDlg::OnComm()
{
VARIANT variant_inp;
COleSafeArray safearray_inp;
LONG len,k;
BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integerthat is not signed.
CString strtemp;
if(MSComm.GetCommEvent()==2); //事件值为2表示接收缓冲区内有字符
{ / /以下可以根据通信协议加入处理代码
variant_inp= MSComm.GetInput(); //读缓冲区
safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
len=safearray_inp.GetOneDimSize(); //得到有效数据长度
for(k=0;k<len;k++)
safearray_inp.GetElement(&k,rxdata+k);
//转换为BYTE型数组
for(k=0;k<len;k++) //将数组转换为Cstring型变量
{
BYTE bt=*(char*)(rxdata+k); //字符型
strtemp.Format("%c",bt); //将字符送入临时变量strtemp存放
m_redit+=strtemp; //加入接收编辑框对应字符串 }
}
UpdateData(FALSE); //更新编辑框内容
}
结论
上述接口设计的硬件与软件部分作者均已调试通过,成功的实现了外设与计算机的USB接口通信。FT245BM成本不高,使用灵活方便,开发周期短,设计者即可用于工程实践,如USB接口的工业控制,也可用于产品开发,如数码相机的USB接口等。
|