FT4232H Android开发 4 - USB转GPIO
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相关推荐
- FT4232H Android开发 5 - USB转SPI
目录 1. 基本原理 2. 设置频率 3. CS电平控制 4. SPI写的实现 5. SPI读的实现 6. 验证 当FT4232H作为MPSSE设备时,DBUS0固定为CLK输出,DBUSD1固定为 ...
- FT4232H Android开发 6 - USB转IIC
目录 1. 新建类mpsse_iic 2. 修改类mpsse_gpio 3. iic的初始化 4. IIC的Start 5. IIC的Stop 6. IIC的读一个字节 7. IIC的发送一个字节 8 ...
- FT4232H Android开发 3 - USB转UART
目录 1. 新建继承FTDevice的类usb2uart 2. 函数open 3. 函数close 4. 函数write 5. 函数read 6. 验证 6.1 发送数据 6.2 处理read的线程 ...
- FT4232H Android开发 2 - 建立一个FTDI设备的样板工程
目录 1. 新建一个FTDevice的类 2. 导入用到的类 3. 添加变量 4. 定义构造函数 5. 成员函数selectDevice 6. 成员函数getDeviceType 7. 成员函数cl ...
- FT4232H Android开发 1 - 建立环境
系统:Windows 10 64bit IDE: Android Studio 硬件平台:FT4232H Mini Module 1. 新建工程 2. 下载J2XX https://ftdichip. ...
- Android Camera相机开发示例、Android 开发板 USB摄像头采集、定期拍照、定时拍照,安卓调用摄像头拍照、Android摄像头预览、监控,USB摄像头开发、摄像头监控代码
我们有个需求,在机器上加个摄像头,定时拍照: 我到网上搜索,发现没有快速上手和简单使用的: 个人感觉,大部分博客写得很乱,或者长篇大论: 而我只想简单实现功能,并不打算学习多少理论: 下面代码是我写来 ...
- Android开发之USB数据通信
Android开发中USB串口通信开发主要涉及到以下几个类及相应的方法: 1 ,UsbManager:负责管理USB设备的类,你可以在相应代码中通过以下方法获得 //获取UsbManager实例方法 ...
- mac android手机调试,mac os开发android应用通过usb真机调试
当前开发用的ari,sublime + webstrom 开发node.js还比较流畅,还没有出现被堵被坑的局面. 尝试开发android应用时,各种坑,其中一个比较深的坑就是今天要和大家分享的. m ...
- B4A 或其它Android开发平台连接USB设备进行调试
- 配置Android开发环境. (Basic4android新手指南-1 搭建环境.pdf) - 首先下载Android设备相关的自身驱动. - 下载安装USB驱动管理软件 UsbDriv ...
最新文章
- springboot原生mysql写法_【Rainbond最佳实践】Spring Boot框架配置MySQL
- 124. Binary Tree Maximum Path Sum
- 飞凌 修改ip地址 linux,linux上搭建DHCP服务
- CentOS 程序开机自启动方法总结
- 深入理解gtest C/C++单元测试经验谈
- 【优先队列】HDU 1873——看病找医生
- java invoke 泛型_如何通过java反射调用含有泛型数组参数的方法
- [转]厚积薄发,有的放矢--李开复博士给中国计算机系学生的建议
- linux mv命令: 移动文件或文件改名
- python库skimage 绘制二值图像的凸壳
- Pannellum:实例之全景图自动旋转
- mysql text取出乱码_关于delphi2010读取MySQL数据库TEXT类型乱码的解决方案
- 搭建国产化统信UOS操作系统虚拟机
- Js解决微信浏览器刷新的问题
- 用计算机计算实发工资,工资税率计算器 个税反推应发工资计算公式
- python基础学习(一)
- 《东周列国志》第四十三回 智宁俞假鸩复卫 老烛武缒城说秦
- 多线程采集表情包,下一届斗图王者属于你
- 力扣练习——23 救生艇
- NOIP2016普及组复赛第一题——买铅笔