书接上一篇,把FT232H开发板配置为 Xilinx 下载器,怎么再配回到默认串口模式呢,非常简单,使用 FT_Prog_Pro (下载方式参考 上一篇https://mpbeta.csdn.net/mp_blog/creation/editor/148950091)把 EEPROM 擦除即可。

擦除之后重新插拨开发板,电脑设备管理器可以看到多出一个COM口

连接常规USB转串口小板测试

互相发送数据,传输文件都OK。也可以连接嵌入式设备使用,比如树莓派等。

上面是擦除 EEPROM 是比较简单粗暴的方法,但是擦除之后,下载器模式就不能用了,只能再次刷 EERPOM,下面讲一种即可以做串口也可以做下载器的配置方法,不需要反复刷 EEPROM。

如下图所示

FT EEPROM -> Hardware Specific -> Hardware -> 选择 RS232 UART

FT EEPROM -> Hardware Specific -> Driver -> 选择 Vitrtual COM Port

Porgram Device 后,重新插拨开发板,这个时候设备管理器同样会多出一个COM口,如果没有出现新的COM口,按下面方法操作后即可。

设备管理器,右击对应的 USB Serial Convert,弹出菜单选择属性

弹出对话框,高级页勾选加载VCP,点击确定,再次插拨开发板就可以看到多出的COM口了。

这个时候就可以使用对应的串口了,在不占用串口的情况下,也可以直接当下载器使用。需要注意的是,这两种模式不可以同时使用,在使用下载器后再用串口的话,可能需要插拨一下开发板。

同理,也可以把一个 FT232H 方案的现成下载器配置为串口模式,但是但是,配置以后也有可能只能单向使用,取决于你的下载器硬件设计,因为一般的下载器JTAG接口能支持宽电压, FT232H 的IO出来以后会接电平转换芯片,有些下载器使用的电平转换芯片是单向的。UART TX 对应 JTAG TCK,都为输出信号,没有问题,UART RX 对应 JTAG TDI,JTAG TDI 是输出信号,而 UART RX 是输入信号,这就出问题了,UART RX 无法正常接收输入数据,类似这样的下载器配置成串口模式只能发送数据,无法接收数据。另外一点,需要给 VREF 一个参考电压。

FT232H UART 模式有一个非常重要的优点是:串口波特率可以达到12Mbps,这是常见的U转串小板不具有的,12M 波特率比我们常用的115200波特率快100多倍,可以用来高效传输文件之类的特殊应用场合,我们来测试一下效果如何,不幸的是,常见的工具大多不支持 12Mbps 这个波特率,比如 MobaXterm(921600),Tera Term(921600),minicom(4M),后续老吴再胡编一个支持12M波特率的工具出来,暂且按下不表,先用pyserial写一段代码来测试一下这个波特率是否可行。

硬件连接,两个FT232H

代码:

import serial
ser = serial.Serial("/dev/tty.usbserial-14230", 12000000)
length = int.from_bytes(ser.read(4), "big")
filename = ser.read(length).decode() + ".recv"
print(filename)

with open(filename, "wb") as fp:
	while True:
		length = int.from_bytes(ser.read(4), "big")
		if length == 0xFFFFFFFF:
			break
		fp.write(ser.read(length))
ser.close()

import serial
import sys
import os
import time
ser = serial.Serial("/dev/tty.usbserial-210251A08870", 12000000)
filename = os.path.basename(sys.argv[1])
filename_bytes = filename.encode()
ser.write(len(filename_bytes).to_bytes(4))
ser.write(filename_bytes)
s_time = time.time()
filesize = 0

with open(sys.argv[1], 'rb') as fp:
	filesize = fp.seek(0, os.SEEK_END)
	fp.seek(0, os.SEEK_SET)
	size = filesize
	while size:
		rd = size
		if rd > 1024:
			rd = 1024
		ser.write(rd.to_bytes(4))
		ser.write(fp.read(rd))
		time.sleep(0.002)
		size -= rd
	size = 0xFFFFFFFF
	ser.write(size.to_bytes(4))
	
e_time = time.time()
total_time = e_time-s_time;
print("file size = " + str(filesize))
print(total_time)
print("the transfer rate is " + str(filesize/total_time))
ser.close()

测试结果

实测传输速率可达400多K大B,但这个测试没有加协议、加校验,一边发,一边收,全速写的话,对端接收会丢数据,经简单测试每发1K数据,中间加一点延时就好。如果加上协议、拿掉延时控制,速率应该还会高很多。

感兴趣的欢迎微 【老吴胡编】

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐