首页 > 编程知识 正文

FT232R之Bit Bang

时间:2023-05-05 04:04:53 阅读:219099 作者:2794

那啥FT232R 强大而憋屈

开发环境的简单搭建
FT232R是各种平常可以用到的串口中质量比较好的芯片,如果有一个FT232R的板子,你会发现上面会有CBUS0~4四个空焊的引脚,或许一开始不清楚是做什么用的,一般来说都会宣传这个串口支持GPIO之类的。也就是FTDI手册中所说的Bitwndnm,Bitwndnm是一个类似并口的东西可以设置波特率的前提下Input,Output,想要使用,就必须通过FTDI的SDK进行编程。

既然有了GPIO,那就有人做出了开发GPIO是他强大的方式,实现SPI和IIC这些简单的通信协议,一个简单的软件,就可以让你的在PC上调试简单的外设,免去一次次下载程序的繁琐,然而这是有些问题的。
这篇国外的博客讲述了开发一个简单的spi协议DDS时遇到的问题
如果不想麻烦,就可以直奔FT232H,他是FT232RL的加强版,支持高速USB,支持多种协议的MPSSE可以直接变身成SPI,I2C,JTAG,可以说省了不少事,CPU FIFO和FPGA通信速度相当可观,但是价格也不菲,国内的加个接近50元一个。但是身边简单又有潜力的串口怎么可以埋没他呢?文中的问题,在后面的一次更新中提到,是由于没有外部晶振导致的,只在低速情况下亮一个LED你当然不会发现什么问题,但是如果要进行通信就会有问题了:

图片来自上面的博客,由于没有外部晶振导致的输出的信号会乱掉,大多数串口都是按照官方原理图,使用内部晶振,所以释放身边FT232串口的潜力希望不大了。另一种方法是飞线到晶振上去,这样的方法很不稳,也很丑,除非自制一个个性的串口,把晶振给加上去,使用12MHz有源或者无源晶振。

重新设计,释放潜力

就此投降放弃,就没有太坑读者了,经过一番研究FDTI的文档,重新设计了PCB,DIY一个自己的串口,把经验总结一下。

电路布线

电路还是手册里的老样子,就是添加了晶振。我在写这篇文章的时候板子刚刚做好发货。测试好继续补充。

新到的板子,可以焊接USB TypeB和Mini,晶振和TypeB还没到,就用直插晶振先凑活一下,但是终于如愿成功啦!(多此一举画了ESD,其实FT232RL是有的)接着就是配置外部晶振咯。如果没有晶振勾选了此项,就会导致芯片无法启动,一定要注意

FT232R实际可以编程的3种模式 Asynchronous Bit wndnm Mode (异步Bitwndnm)Synchronous Bit wndnm Mode (同步Bitwndnm)CBUS Bit wndnm Mode (CBUS Bitwndnm) 异步Bitwndnm (0x01)
异步Bitwndnm是最容易理解的,他一共有8个可配置输入输出的 IO,所指代的也就是FTDI芯片中的DBUS,分别对应Bit0-7,未配置情况下也就是RS232的标准引脚分别是:TX RX RTS# CTS# DTR# DSR# DCD# RI# 手册的只标明了引脚号,其实对应的就是这个功能。每个IO的输入和输出可以单独配置,不受影响。可以选CBUS配置WR# RD#功能,这些功能需要在EEPROM中配置,而不是通过编程!

FT232RL自带了EEPROM,在官网下载FT PROG就可以配置FT232R的功能了,配制成Biwndnm WRn等等
同步Bitwndnm(0x04)
这个模式是一定要先读在写入,需要的话和异步模式相同可以配置WR# RD#功能到CBUS上,具体参考手册。这种模式也是实现SPI,I2C的主要模式,讲一些类生成好的时钟序列写给芯片后,每次写电平FT232都会记录输入管脚的电平,然后取出对应位置的电平进行解码。
CBUS Bitwndnm(0x20)

CBUS并不是提供了API可以自由控制,而且只能控制CBUS0-3一共4个IO。跟当初想的不一样,与控制DBUS的Birwndnm只能两者取其一。需要上面提到的那样,在FT_PROG中配置成I/O MODE。切换很不灵活,而且官方说传输大的buffer,CBUS起来和DBUS相比会慢很多,受到USB的帧决定,可能应该是,DBUS有硬件FIFO的缘故。 不标准的Hello World

TX和RX口软件输出50%占空比的方波

#include "ftd2xx.h"#include <stdio.h>#include <stdlib.h>#include <windows.h>int main() { FT_STATUS ftStatus; FT_HANDLE handle; FT_DEVICE_LIST_INFO_NODE *ftDevInfoList; DWORD numDevs; ftStatus = FT_CreateDeviceInfoList(&numDevs); if (ftStatus == FT_OK) { printf("Number of FTDI devices is:%ldn", numDevs); if (numDevs == 0) { return 0; } } else { return 1; } if (FT_Open(0, &handle)) { puts("Can't open device"); return 1; } BYTE dat[] = {0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02}; DWORD bytes; ftStatus = FT_SetBitMode(handle, 0x03, 0x01); if (ftStatus) { puts("BitMode"); return 1; } ftStatus = FT_SetBaudRate(handle, 9600); if (ftStatus) { puts("BaudRate"); return 1; } for (int i = 0; i < 4; ++i) { FT_Write(handle, dat, sizeof(dat), &bytes); } FT_Close(handle);}

FT232R的结果(没有改进)

FT232H的结果

改进后的FT232RL用SPI Birwndnm输出0xAA。第一步算是完成啦,接下来还有软件的工作。

参考资料
AN_232R-01_Bit_wndnm_Mode_Available_For_FT232R_and_Ft245R.pdf
DS_FT232R.pdf

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。