×

如何在FTDI FT2232H上使用快速串行模式

消耗积分:2 | 格式:zip | 大小:0.00 MB | 2023-06-19

郭大

分享资料个

描述

快速串行概述

FTDI FT2232H 快速串行接口使用以下 4 个引脚:

  • FSDI,输入,数据,接收串行数据
  • FSCLK,输入,来自 FSDI 和 FSDO 的串行数据时钟
  • FSDO,输出,从 FT2232H 输出的串行数据
  • FSCTS,输出,驱动为低电平以指示 FT2232H 我们准备好发送数据

详细时序图在 FTD223H 芯片 4.8.1 节的数据表中。

CYC1000 FPGA 引脚输出到 FT2232H

CYC1000上的 Cyclone 10LP FPGA使用以下引脚连接到 FT2232H 芯片:

  • FSDI 连接到引脚 R7
  • FSCLK 连接到引脚 T7
  • FSDO 连接到引脚 M8
  • FSCTS 连接到引脚 M8。

必须通过更改 EEPROM 在 FT2232H 中启用串行模式

要启用快速串行模式,需要将端口 B 更改为使用 OPTO 隔离,附件是使用 FTDI 编程器进行更改的屏幕截图。

poYBAGOII6qAbWdYAAEnfs7m8_w018.png
 

现在,CYC1000 串行接口将使用快速串行硬件握手,而不是标准的两针串行。PC端使用Linux Ubuntu 18.04,无需加载任何驱动,通过ttyUSBx即可访问接口。

Quartus 精简版 18.1

加载快速串行项目,从菜单文件-> 打开项目-> fast_serial.qpf

poYBAGOII62ALi6yAAHvAxKjM2g025.png
加载项目
 

从菜单中选择 tools->platform designer->select avalon_fast_serial.qsys

pYYBAGOII7CAY81yAAKtt13VgH0141.png
加载平台设计
 

加载平台设计器文件后,将显示 Avalon Bus。

以下是每个块的说明:

  • Master 是与每个 slave 通信的 Avalon 总线 master。
  • in_bytes_to_packets:将来自 Fast Serial rx_module.v 模块的字节放入流中以转发给 Master
  • out_bytes_to_packets:从 Master 获取流并转换为 Fast Serial tx_module.v 的字节流
  • led_gpio_slave:是 Avalon Memory mapped slave to Master。地址为 0x0 到 0x3F。
  • sysid_qsys_0:是 Master 的 Avalon Memory mapped slave。有两个寄存器,系统 ID,硬编码为 0x112233。和时间戳。

快速串行verilog代码

Fast Serial有3个基本模块,

  • clock_fastserial.v:将 clk 除以 2。
  • rx_fastserial.v:使用 FT2232H 的 FSDO 和 FSCLK 引脚为 Avalon 字节流接口创建字节接口。
  • tx_fastserial.v:FSCTS、FSDI 和 FSCLCK 引脚,用于创建字节接口数据包到字节流接口,以将字节传输回 PC

Avalon字节流包说明

第 43 节 Avalon -St to Packets 和 Packets to Bytes Converter Cores 描述了字节流。

这是一个基本描述,数据包使用编码字节流,因此任何保留的字节都会使用转义序列进行编码。该帧具有 SOP、数据包开始 0x7A、EOP 数据包结束 0x7B 和通道 0x7B。这是从手册中摘录的:

如果内核源接口上的 endofpacket 信号被置位,则内核会在数据的最后一个字节之前插入一个数据包结尾 (0x7b)。
如果内核源接口上的通道信号在数据包中更改为新值,则内核会插入一个通道号指示器 (0x7c),后跟新通道号。
如果数据字节是特殊字符,内核会插入一个转义符 (0x7d),然后是与 0x20 异或的数据。

加载FPGA

从菜单中选择 Tools -> Programmer 应该会出现以下对话框。使用开始按钮将图像加载到 FPGA RAM 中。

poYBAGOII7KAWVhuAAB5izuxERU143.png
 

Python 示例

在 python 目录中是一个示例应用程序,用于获取 FPGA ID 和切换 LED。需要安装serial_asyncio

在控制台:python3 avalon_loopback_serial.py

LED 应递增。

提高 tty 的性能

setserial /dev/ttyUSBx low_latency

x CYC1000 连接的 USB 设备,例如,我的是 /dev/ttyUSB0 所以命令是:

setserial /dev/ttyUSB0 low_latency

这在 FT2232H 中使用较低的定时器延迟定时器来增加 FIFO 的消耗。由于命令小于 512 字节(高速 USB 的最小 USB 数据包大小),定时器将到期以发送数据。定时器可以设置为0,所以每微帧发送一次数据。

进一步提高性能,使用 libftdi1 和 C,我仍在努力提高性能,并解决几个错误,但能够实现约 180us 的往返。

 


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !

'+ '

'+ '

'+ ''+ '
'+ ''+ ''+ '
'+ ''+ '' ); $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code ==5){ $(pop_this).attr('href',"/login/index.html"); return false } if(data.code == 2){ //跳转到VIP升级页面 window.location.href="//m.obk20.com/vip/index?aid=" + webid return false } //是会员 if (data.code > 0) { $('body').append(htmlSetNormalDownload); var getWidth=$("#poplayer").width(); $("#poplayer").css("margin-left","-"+getWidth/2+"px"); $('#tips').html(data.msg) $('.download_confirm').click(function(){ $('#dialog').remove(); }) } else { var down_url = $('#vipdownload').attr('data-url'); isBindAnalysisForm(pop_this, down_url, 1) } }); }); //是否开通VIP $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code == 2 || data.code ==5){ //跳转到VIP升级页面 $('#vipdownload>span').text("开通VIP 免费下载") return false }else{ // 待续费 if(data.code == 3) { vipExpiredInfo.ifVipExpired = true vipExpiredInfo.vipExpiredDate = data.data.endoftime } $('#vipdownload .icon-vip-tips').remove() $('#vipdownload>span').text("VIP免积分下载") } }); }).on("click",".download_cancel",function(){ $('#dialog').remove(); }) var setWeixinShare={};//定义默认的微信分享信息,页面如果要自定义分享,直接更改此变量即可 if(window.navigator.userAgent.toLowerCase().match(/MicroMessenger/i) == 'micromessenger'){ var d={ title:'如何在FTDI FT2232H上使用快速串行模式',//标题 desc:$('[name=description]').attr("content"), //描述 imgUrl:'https://'+location.host+'/static/images/ele-logo.png',// 分享图标,默认是logo link:'',//链接 type:'',// 分享类型,music、video或link,不填默认为link dataUrl:'',//如果type是music或video,则要提供数据链接,默认为空 success:'', // 用户确认分享后执行的回调函数 cancel:''// 用户取消分享后执行的回调函数 } setWeixinShare=$.extend(d,setWeixinShare); $.ajax({ url:"//www.obk20.com/app/wechat/index.php?s=Home/ShareConfig/index", data:"share_url="+encodeURIComponent(location.href)+"&format=jsonp&domain=m", type:'get', dataType:'jsonp', success:function(res){ if(res.status!="successed"){ return false; } $.getScript('https://res.wx.qq.com/open/js/jweixin-1.0.0.js',function(result,status){ if(status!="success"){ return false; } var getWxCfg=res.data; wx.config({ //debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId:getWxCfg.appId, // 必填,公众号的唯一标识 timestamp:getWxCfg.timestamp, // 必填,生成签名的时间戳 nonceStr:getWxCfg.nonceStr, // 必填,生成签名的随机串 signature:getWxCfg.signature,// 必填,签名,见附录1 jsApiList:['onMenuShareTimeline','onMenuShareAppMessage','onMenuShareQQ','onMenuShareWeibo','onMenuShareQZone'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 }); wx.ready(function(){ //获取“分享到朋友圈”按钮点击状态及自定义分享内容接口 wx.onMenuShareTimeline({ title: setWeixinShare.title, // 分享标题 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享给朋友”按钮点击状态及自定义分享内容接口 wx.onMenuShareAppMessage({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 type: setWeixinShare.type, // 分享类型,music、video或link,不填默认为link dataUrl: setWeixinShare.dataUrl, // 如果type是music或video,则要提供数据链接,默认为空 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ”按钮点击状态及自定义分享内容接口 wx.onMenuShareQQ({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到腾讯微博”按钮点击状态及自定义分享内容接口 wx.onMenuShareWeibo({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ空间”按钮点击状态及自定义分享内容接口 wx.onMenuShareQZone({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); }); }); } }); } function openX_ad(posterid, htmlid, width, height) { if ($(htmlid).length > 0) { var randomnumber = Math.random(); var now_url = encodeURIComponent(window.location.href); var ga = document.createElement('iframe'); ga.src = 'https://www1.elecfans.com/www/delivery/myafr.php?target=_blank&cb=' + randomnumber + '&zoneid=' + posterid+'&prefer='+now_url; ga.width = width; ga.height = height; ga.frameBorder = 0; ga.scrolling = 'no'; var s = $(htmlid).append(ga); } } openX_ad(828, '#berry-300', 300, 250);