目录

1.  基本原理

2. 设置频率

3. CS电平控制

4. SPI写的实现

5. SPI读的实现

6. 验证


当FT4232H作为MPSSE设备时,DBUS0固定为CLK输出,DBUSD1固定为DO,DBUSD2固定为DI。其他DBUS口都可以作为SPI的CS脚控制,所以理论上FT4232H可以一路通道控制5个SPI设备。验证的电路如下:

基于USB转GPIO的工程修改

1.  基本原理

与USB转GPIO类似,通过特殊的命令字写入FTx232H,FTx232H在DO上根据命令字的不同在CLK的上升沿或者下降沿将数据送出,在DI上将数据读入。

这里只实现SPI Mode 0。其基本属性是:

CPOL = 0,CPHA = 0 --- 即SPI_CLK空闲试为低电平,SPI在SPI_CLK的第一个边沿开始采样。 

MSB first --- 高位在前

在上升沿捕获数据,在下降沿时输出数据

参考类mpsse_gpio增加一个新类mpsse_spi。

public class mpsse_spi {public FT_Device ftDevice;mpsse_gpio gpio;public mpsse_spi(mpsse_gpio spiGPIO){gpio = spiGPIO;ftDevice = dev;}
}

2. 设置频率

通过命令设置SPI的频率。通过命令0x8a和0x8b开启关闭5分配设置最大频率,通过0x86设置SPI的频率。

0x8a: 关闭5分频,即MaxFreq = 60MHz。

0x8b: 开启5分频,MaxFreq = 12MHz。

0x86, 0xValueH, 0xValueL: SPI_CLK的最大频率计算公式为MaxFreq / (( 1 +[ (0xValueH * 256) OR 0xValueL] ) * 2)

注:0x8a、0x8b只有FT232H,FT2232H,FT4232H支持。

    public void setFreq(int freq){int byteWritten = 0;int maxFreq = 60 * 1000 * 1000;int value = 0;byte[] buf = new byte[3];if(freq < 500){buf[0] = (byte)0x8b;maxFreq = 12 * 1000 * 1000;}else{buf[0] = (byte)0x8a;}ftDevice.write(buf, 1);if (freq > 30 * 1000 * 1000)value = 0;else if (freq < 92)value = 0xffff;elsevalue = (int)((maxFreq - freq * 2) / (freq * 2));buf[0] = (byte)0x86;buf[1] = (byte)(value & 0xff);buf[2] = (byte)((value >> 8) & 0xff);ftDevice.write(buf, 3);}

3. CS电平控制

SPI的CS控制通过GPIO的方式控制.

     /** io:  3-7 low byte io, xDBUS3 - xDBUS7*      8-15 high byte io, xCBUS0 - xCBUS7*      x - A or B* sel:   true - select flash*        false = deselect flash*/public void cs(byte io, boolean sel){if(sel == true){gpio.output((byte)io, mpsse_gpio.eLevel.Low);}else{gpio.output((byte)io, mpsse_gpio.eLevel.High);}}

4. SPI写的实现

利用MPSSE的命令0x11实现,一次最多64K字节。

    public void writeBytes(byte[] wrBuf, int len){if (len == 0 || wrBuf == null)return;int offset = 0;while (len > 0){int count = (len > 0x10000) ? 0x10000 : len;byte[] tmpWrBuf = new byte[count + 3];int byteWritten = 0;tmpWrBuf[0] = 0x11;tmpWrBuf[1] = (byte)((count - 1) & 0xff);tmpWrBuf[2] = (byte)(((count - 1) >> 8) & 0xff);for (int i = 0; i < count; i++){tmpWrBuf[3 + i] = wrBuf[i + offset];}ftDevice.write(tmpWrBuf, count + 3);len -= count;offset += count;}}

5. SPI读的实现

利用MPSSE的命令0x20实现

    public void readBytes(byte[] rdBuf, int len) throws InterruptedException {if (len == 0 || rdBuf == null)return;int offset = 0;//Clear read buffer from device first.int gpioData = 0;int dly = 0;gpioData = ftDevice.getQueueStatus();if (gpioData > 0){byte[] tmpbuf = new byte[gpioData];ftDevice.read(tmpbuf, gpioData);}while (len > 0){int count = (len > 0x10000) ? 0x10000 : len;byte[] tmpWrBuf = new byte[3];byte[] tmpRdBuf = new byte[count];tmpWrBuf[0] = 0x20;tmpWrBuf[1] = (byte)((count - 1) & 0xff);tmpWrBuf[2] = (byte)(((count - 1) >> 8) & 0xff);ftDevice.write(tmpWrBuf, 3);while (true){gpioData = ftDevice.getQueueStatus();dly++;if (dly > 0xfffffff){//Console.Write("spi transfer data time out\n");return;}if (gpioData >= count)break;Thread.sleep(1);}if (gpioData > 0){ftDevice.read(tmpRdBuf, count);System.arraycopy(tmpRdBuf, 0, rdBuf, (int)offset, (int)count);}len -= count;offset += count;}}

6. 验证

FT4232H的通道A上接一颗SPI接口的Nor Flash,CS脚接ADBUS3,通过读取Flash的ID确认SPI是否通讯正确。

    TextView tvSpiFlashID;void getFlashID() throws InterruptedException {if(mpsseDev == null)return;byte[] cmdBuf = {(byte)0x9F};byte[] rdBuf = {(byte)0xff, (byte)0xff, (byte)0xff};mpsseDev.spi.cs((byte)3, true);mpsseDev.spi.writeBytes(cmdBuf, cmdBuf.length);mpsseDev.spi.readBytes(rdBuf, 3);mpsseDev.spi.cs((byte)3, false);int id = ((int)rdBuf[0] << 16) | (int)(rdBuf[1] << 8) | (int)(rdBuf[2]);String strID = "Flash ID:0x" +Integer.toHexString(id).toUpperCase();tvSpiFlashID.setText(strID);}

初始化ADBUS0~3,其中0为SCK脚,输出,1为MOSI,输出,2为MISO,输入,3为CS,输出。

mpsseDev.gpio.init((byte)0xfb, (byte)0xfe, (byte)0xff, (byte)0xff);
try {getFlashID();
} catch (InterruptedException e) {e.printStackTrace();
}

测试结果:

FT4232H Android开发 5 - USB转SPI相关推荐

  1. FT4232H Android开发 4 - USB转GPIO

    USB转GPIO利用的是FT4232H的MPSSE模式.FT4232H虽然有4路UART,但是只能支持2路MPSSE(Channel A和Channel B).其中Channel A对应ADBUS0 ...

  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. MindSpore API编程概述
  2. AndroidStudio自动补完包的快捷键
  3. PWN-PRACTICE-BUUCTF-21
  4. python文本字符串比对_python-模糊字符串比较
  5. django select option拼接时value中空格后的内容被截断
  6. 一个简单的VC++案例:显示年月日
  7. android 关闭服务代码,android – 调用stopService方法时,服务不会停止
  8. jQuery conflict with other Liberary
  9. 速达软件无法打开帐套数据库/一般性网络错误
  10. APP推广重点渠道解析及我这些年踩过的坑
  11. 【题目回顾】广工大2020年10月ACM第一次月赛B题--Dio的面包工坊
  12. 【思考】人脸认证真的准确吗?通过身份证的人脸对比有哪些问题?
  13. c语言4位数求各位数的立方和,功能:使用循环结构求一个四位数的各位数字的立方和...
  14. org.apache.ibatis.builder.IncompleteElementException: Could not find parameter map java.util.Map
  15. Microchip PIC单片机
  16. cocos2dx 实习生培训计划
  17. CSDN湖大高校俱乐部活动的吐槽
  18. DFS(爆搜、深搜)
  19. python交流企鹅裙_动漫迷的福利!Python小白也可以学会的爬虫教程
  20. 跳槽,面试官问“你为什么离职”时实际上是在问什么?

热门文章

  1. 小麦教你如何利用电子表格制作交叉报表
  2. 淘宝/天猫店铺oAuth2.0接口:Taobao.user.seller.get 查询淘宝卖家用户信息接口接入说明
  3. 将CAD模型通过SolidWorks导出机器人URDF文件(基于innfos六轴机械臂)
  4. SAP UI5 应用开发教程之一百零七 - SAP UI5 OverflowToolbar 容器控件介绍的试读版
  5. C语言—函数_成仙不问道
  6. 网络舆情监控系统之军犬网络舆情监控系统
  7. 思维导图 基础篇(04)思维方法-水平/垂直 思考法
  8. 如何将百度网盘的分享连接设置成自动填充验证码的格式,便于分享。百度网盘不用验证码。
  9. XDU-OJ-C语言
  10. opencv VideoCapture抓取RTSP高延迟,崩溃解决方法