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

该类继承自FTDevice

public class mpsse extends FTDevice{public mpsse(Context context) {super(context);}}

2. open和close

在mpsse类里面实现open和close的方法,设备模式为MPSSE。

    public int open(){int ret;ret = openDevice(D2xxManager.FT_BITMODE_MPSSE);if(ret < 0)return ret;return FTDevice.RETURN_OK;}public int close(){return closeDevice();}

3. 新建类mpsse_gpio

public class mpsse_gpio{}

3. 成员变量

在mpsse_gpio中添加下面的变量。

    public FT_Device ftDevice;private byte PortDDir;private byte PortDLevel;private byte PortCDir;private byte PortCLevel;

变量ftDevice对应FTDI设备。

PortDDir和PortCDir分别对应芯片的DBUS口和CBUS口的IO方向(例如Channel A的ADBUS0~ADBUS7和ACBUS0~ACBUS7,,模组上丝印是AD0~AD7和AC~AC7)。而PortDLevel和PortCLevel表示IO的电平状态。电平状态用一个枚举表示

    public enum eLevel{Low,High,}

4. 初始化

    public void init(FT_Device dev, byte DDir, byte DLeve, byte CDir, byte CLevel){PortDDir = DDir;PortDLevel = DLeve;PortCDir = CDir;PortCLevel = CLevel;ftDevice = dev;}

初始化GPIO的方向和电平值。

5. 设置GPIO方向

参数io表示对应的GPIO口,有效值0-15,其中0-7对应DBUS0~DBUS7,8-15对应CBUS0~CBUS7。参数dir表示方向,1表示输出,0表示输入。

    /** io:  0-7 low byte io, xDBUS0 - xDBUS7*      8-15 high byte io, xCBUS0 - xCBUS7*      x - A or B* dir:   0 output*        1 input*/public void setDir(byte io, byte dir){if (io < 8){if (dir == 0)PortDDir |= (byte)(1 << io);elsePortDDir &= (byte)(~(1 << io));}else{if (dir == 0)PortCDir |= (byte)(1 << (io % 8));elsePortCDir &= (byte)(~(1 << (io % 8)));}}

6. 输出电平

    /** io:  0-7 low byte io, xDBUS0 - xDBUS7*      8-15 high byte io, xCBUS0 - xCBUS7*      x - A or B* level:   output high or output low* return: true/false*/public boolean output(byte io, eLevel level){byte[] buff = new byte[3];if(io < 8){buff[0] = (byte)0x80;if(level == eLevel.High)PortDLevel = (byte)(PortDLevel | ((byte)1 << io));elsePortDLevel = (byte)(PortDLevel & ~((byte)1 << io));PortDDir = (byte)(PortDDir | ((byte)1 << io));buff[1] = PortDLevel;buff[2] = (byte)(PortDDir | ((byte)1 << io));}else{io = (byte)(io - 8);buff[0] = (byte)0x82;if (level == eLevel.High)PortCLevel = (byte)(PortCLevel | ((byte)1 << io));elsePortCLevel = (byte)(PortCLevel & ~((byte)1 << io));PortCDir = (byte)(PortCDir | ((byte)1 << io));buff[1] = PortCLevel;buff[2] = (byte)(PortCDir | ((byte)1 << io));}ftDevice.write(buff, (int)buff.length);return true;}

从代码可以看出,对于MPSSE的操作只是往USB写入对应的命令序列就可,对于PortD的输出命令为0x80,第二个字节是8个GPIO的电平状态,第三个字节是8个GPIO的方向,而对于PortC的输出命令为0x82。

具体细节可以参考官方文档AN108.

7. 读电平状态

如上图所示,读用到的命令字是0x81和0x83,通过读USB数据得到当前IO的电平状态。

    public byte input(byte io) throws InterruptedException {byte[] buff = new byte[1];long byteWritten = 0;if (io < 8 || io == (byte)0x80)buff[0] = (byte)0x81;elsebuff[0] = (byte)0x83;ftDevice.write(buff, (int)1);long gpioData = 0;do{sleep(1);gpioData = ftDevice.getQueueStatus();} while (gpioData == 0);if (gpioData > 0){ftDevice.read(buff, 1);Log.i("IO Read", "buf:" + buff[0]);if (io == (byte)0x80 || io == (byte)0x40) {Log.i("IO Read", "return all io:" + buff[0]);return buff[0];}else{Log.i("IO Read", "return io" + io);if ((buff[0] & (byte)(1 << (io % 8))) == (byte)(1 << (io % 8)))return 1;elsereturn 0;}}return (byte)0xff;}

8. 在mpsse类中添加成员变量gpio

public mpsse_gpio gpio = new mpsse_gpio();

在open中赋值ftDevice

    public int open(){int ret;ret = openDevice(D2xxManager.FT_BITMODE_MPSSE);if(ret < 0)return ret;gpio.ftDevice = ftDevice;return FTDevice.RETURN_OK;}

9. 验证

默认都是高电平(显示为红色),然后设置GPIO7为低电平,读回来电平可以看到电压为低了(显示为灰色)。

FT4232H Android开发 4 - USB转GPIO相关推荐

  1. FT4232H Android开发 5 - USB转SPI

    目录 1.  基本原理 2. 设置频率 3. CS电平控制 4. SPI写的实现 5. SPI读的实现 6. 验证 当FT4232H作为MPSSE设备时,DBUS0固定为CLK输出,DBUSD1固定为 ...

  2. FT4232H Android开发 6 - USB转IIC

    目录 1. 新建类mpsse_iic 2. 修改类mpsse_gpio 3. iic的初始化 4. IIC的Start 5. IIC的Stop 6. IIC的读一个字节 7. IIC的发送一个字节 8 ...

  3. FT4232H Android开发 3 - USB转UART

    目录 1. 新建继承FTDevice的类usb2uart 2.  函数open 3. 函数close 4. 函数write 5. 函数read 6. 验证 6.1 发送数据 6.2 处理read的线程 ...

  4. FT4232H Android开发 2 - 建立一个FTDI设备的样板工程

    目录 1. 新建一个FTDevice的类 2. 导入用到的类 3.  添加变量 4. 定义构造函数 5. 成员函数selectDevice 6. 成员函数getDeviceType 7. 成员函数cl ...

  5. FT4232H Android开发 1 - 建立环境

    系统:Windows 10 64bit IDE: Android Studio 硬件平台:FT4232H Mini Module 1. 新建工程 2. 下载J2XX https://ftdichip. ...

  6. Android Camera相机开发示例、Android 开发板 USB摄像头采集、定期拍照、定时拍照,安卓调用摄像头拍照、Android摄像头预览、监控,USB摄像头开发、摄像头监控代码

    我们有个需求,在机器上加个摄像头,定时拍照: 我到网上搜索,发现没有快速上手和简单使用的: 个人感觉,大部分博客写得很乱,或者长篇大论: 而我只想简单实现功能,并不打算学习多少理论: 下面代码是我写来 ...

  7. Android开发之USB数据通信

    Android开发中USB串口通信开发主要涉及到以下几个类及相应的方法: 1 ,UsbManager:负责管理USB设备的类,你可以在相应代码中通过以下方法获得 //获取UsbManager实例方法 ...

  8. mac android手机调试,mac os开发android应用通过usb真机调试

    当前开发用的ari,sublime + webstrom 开发node.js还比较流畅,还没有出现被堵被坑的局面. 尝试开发android应用时,各种坑,其中一个比较深的坑就是今天要和大家分享的. m ...

  9. B4A 或其它Android开发平台连接USB设备进行调试

    -   配置Android开发环境.   (Basic4android新手指南-1 搭建环境.pdf) -  首先下载Android设备相关的自身驱动. - 下载安装USB驱动管理软件 UsbDriv ...

最新文章

  1. springboot原生mysql写法_【Rainbond最佳实践】Spring Boot框架配置MySQL
  2. 124. Binary Tree Maximum Path Sum
  3. 飞凌 修改ip地址 linux,linux上搭建DHCP服务
  4. CentOS 程序开机自启动方法总结
  5. 深入理解gtest C/C++单元测试经验谈
  6. 【优先队列】HDU 1873——看病找医生
  7. java invoke 泛型_如何通过java反射调用含有泛型数组参数的方法
  8. [转]厚积薄发,有的放矢--李开复博士给中国计算机系学生的建议
  9. linux mv命令: 移动文件或文件改名
  10. python库skimage 绘制二值图像的凸壳
  11. Pannellum:实例之全景图自动旋转
  12. mysql text取出乱码_关于delphi2010读取MySQL数据库TEXT类型乱码的解决方案
  13. 搭建国产化统信UOS操作系统虚拟机
  14. Js解决微信浏览器刷新的问题
  15. 用计算机计算实发工资,工资税率计算器 个税反推应发工资计算公式
  16. python基础学习(一)
  17. 《东周列国志》第四十三回 智宁俞假鸩复卫 老烛武缒城说秦
  18. 多线程采集表情包,下一届斗图王者属于你
  19. 力扣练习——23 救生艇
  20. NOIP2016普及组复赛第一题——买铅笔

热门文章

  1. Python爬虫初探(九)——爬虫之Beautifulsoup4实战(爬取豆瓣信息)
  2. 用最简单的原理做最不简单的事——电磁流量计
  3. Kerberos 认证协议
  4. 中国碎石机市场趋势报告、技术动态创新及市场预测
  5. 安卓仿淘宝导航栏实现
  6. 光伏低电压穿越控制Matlab/simulink仿真模型
  7. python求完数的因子_「每日一练」巧用python找出1000以内的所有完数
  8. MySQL 根据关键字(keyword)查询
  9. JESD204B高速AD开发(二)LMK04821时钟芯片配置代码详解
  10. 一起刑事案件法庭辩护 z