搜索
bottom↓
回复: 40

分享个高速USB2SPI适配器,简单快速的将数据传输到PC

  [复制链接]

出0入0汤圆

发表于 2017-5-19 12:11:21 | 显示全部楼层 |阅读模式
在很多应用场合,我们需要将数据传输到PC端进行数据分析处理,最常用的当然就是串口了,但是大家也知道,串口有个最大的问题就是速度问题;
为解决这个问题,这个高速版本的USB2SPI就出来了;
1,USB传输采用高速USB(480Mbps);
2,两路硬件SPI,每一路最大接收数据速度可高达50Mbps;
3,SPI采用DMA环形循环接收,每一路SPI高达40K数据缓冲区,可以防止丢数据;
4,PC端采用回调函数方式接收数据,也就是启动数据接收后,若接收到了数据,会自动进入回调函数里面,用户在回调函数里面处理数据即可;
5,支持Windows,Linux,Android;

从机接收到数据之后将数据写入文件中的程序:
  1.   /*
  2.   ******************************************************************************
  3.   * @file     : USB2XXXSPISlaveReceiveFile.cpp
  4.   * @Copyright: usbxyz
  5.   * @Revision : ver 1.0
  6.   * @Date     : 2014/12/19 9:33
  7.   * @brief    : USB2XXX SPI slave receive file test demo
  8.   ******************************************************************************
  9.   * @attention
  10.   *
  11.   * Copyright 2009-2014, usbxyz.com
  12.   * http://www.usbxyz.com/
  13.   * All Rights Reserved
  14.   *
  15.   ******************************************************************************
  16.   */
  17. #include <stdlib.h>
  18. #include <stdio.h>
  19. #include <string.h>
  20. #include "usb_device.h"
  21. #include "usb2spi.h"

  22. #define USE_CALLBACK_RECEIVE_DATA   1

  23. FILE *pFile;
  24. int FileSize = 0;

  25. #if USE_CALLBACK_RECEIVE_DATA
  26. int __stdcall SlaveGetData(int DevHandle,int SPIIndex,unsigned char *pData,int DataNum)
  27. {
  28.     fwrite(pData,1,DataNum,pFile);
  29.     FileSize += DataNum;
  30.     printf("Get data num = %d\n",DataNum);
  31.     return 0;
  32. }
  33. #endif

  34. int main(int argc, const char* argv[])
  35. {
  36.     DEVICE_INFO DevInfo;
  37.     SPI_CONFIG SPIConfig;
  38.     int DevHandle[10];
  39.     int SPIIndex = SPI1_CS0;
  40.     bool state;
  41.     int ret;
  42.     unsigned char ReadBuffer[20480];
  43.     //扫描查找设备
  44.     ret = USB_ScanDevice(DevHandle);
  45.     if(ret <= 0){
  46.         printf("No device connected!\n");
  47.         getchar();
  48.         return 0;
  49.     }
  50.     //打开设备
  51.     state = USB_OpenDevice(DevHandle[0]);
  52.     if(!state){
  53.         printf("Open device error!\n");
  54.         getchar();
  55.         return 0;
  56.     }

  57.     //输入SPI相关参数,必须和主机匹配
  58.     int DataTemp;
  59.     printf("Please input CPHA(0 or 1):");
  60.     scanf("%d",&DataTemp);
  61.     SPIConfig.CPHA = DataTemp;
  62.     printf("Please input CPOL(0 or 1):");
  63.     scanf("%d",&DataTemp);
  64.     SPIConfig.CPOL = DataTemp;
  65.     printf("SPIConfig.CPHA = %d\n",SPIConfig.CPHA);
  66.     printf("SPIConfig.CPOL = %d\n",SPIConfig.CPOL);
  67.     //配置SPI总线相关参数(配置为从机模式)
  68.     SPIConfig.Mode = SPI_MODE_HARD_FDX;
  69.     SPIConfig.ClockSpeedHz = 50000000;
  70.     //SPIConfig.CPHA = 0;
  71.     //SPIConfig.CPOL = 0;
  72.     SPIConfig.LSBFirst = SPI_MSB;
  73.     SPIConfig.Master = SPI_SLAVE;
  74.     SPIConfig.SelPolarity = SPI_SEL_LOW;
  75.     ret = SPI_Init(DevHandle[0],SPIIndex,&SPIConfig);
  76.     if(ret != SPI_SUCCESS){
  77.         printf("Initialize device error!\n");
  78.         getchar();
  79.         return 0;
  80.     }
  81.     //输入文件名
  82.     printf("Please input file name:");
  83.     char FileName[512]={0};
  84.     scanf("%s",FileName);
  85.     printf("Start receive data to file,the file name is %s\n",FileName);
  86.     printf("Press any key to exit the data reception!\n");
  87.     pFile=fopen(FileName,"wb"); //获取文件的指针
  88.     if(pFile == NULL){
  89.         printf("Open file faild\n");
  90.         getchar();
  91.         return 0;
  92.     }
  93. #if USE_CALLBACK_RECEIVE_DATA
  94.     SPI_SlaveContinueRead(DevHandle[0],SPIIndex,SlaveGetData);
  95.     getchar();
  96.     getchar();
  97.     SPI_SlaveContinueReadStop(DevHandle[0],SPIIndex);
  98. #else
  99.     while(true)
  100.     {
  101.         unsigned char DataBuffer[40960];
  102.         int DataNum = SPI_SlaveReadBytes(DevHandle[0],SPIIndex,DataBuffer,0);
  103.         if(DataNum > 0){
  104.             fwrite(DataBuffer,1,DataNum,pFile);
  105.             FileSize += DataNum;
  106.             printf("Get data num = %d\n",DataNum);
  107.             printf("FileSize = %d Byte\n",FileSize);
  108.         }else if(DataNum < 0){
  109.             break;
  110.         }
  111.         //延时
  112. #ifndef OS_UNIX
  113.         Sleep(900);
  114. #else
  115.         usleep(900*1000);
  116. #endif
  117.     }
  118. #endif

  119.     USB_CloseDevice(DevHandle[0]);
  120.     fclose(pFile);
  121.     printf("FileSize = %d Byte\n",FileSize);
  122.     printf("Stop receive!\n");
  123.     getchar();
  124.     return 0;
  125. }
复制代码


测试工程下载:
适配器购买链接:https://item.taobao.com/item.htm ... amp;id=545509364910

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入90汤圆

发表于 2017-5-19 13:26:52 | 显示全部楼层
楼主是个高手,像你学习。

出0入0汤圆

发表于 2017-5-19 13:37:35 来自手机 | 显示全部楼层
300不贵,昨天买个ST的脱机烧写器要了400

出0入0汤圆

 楼主| 发表于 2017-5-19 13:39:41 | 显示全部楼层
honami520 发表于 2017-5-19 13:26
楼主是个高手,像你学习。

过奖了,共同学习哈

出0入13汤圆

发表于 2017-5-19 14:55:28 | 显示全部楼层
不错,硬件功能齐全
头像被屏蔽

出0入0汤圆

发表于 2017-5-19 15:01:31 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

出0入17汤圆

发表于 2017-5-19 15:16:18 来自手机 | 显示全部楼层
就扶楼上,FT2232H双路串口,直接支持UART,MPSSE支持I2C,SPI,JTAG,MPSSE库的源码官方直接开放

出0入17汤圆

发表于 2017-5-19 15:17:19 来自手机 | 显示全部楼层
价格25每颗

出0入0汤圆

发表于 2017-5-19 15:21:14 | 显示全部楼层
立创商城-技术 发表于 2017-5-19 15:01
为何不直接用 FT232H? 它的SPI也支持30 Mbit/s的传输率? 并口模式可达40 Mbytes/S,含税价格才20多。

或 ...

双路50Mbit就是有100Mbit了,加上超大的缓冲区。
不过ft232h是支持8Mbyte的SPI,也就是40Mbit的。并口支持40 Mbytes/Sec。但是发送和接收缓冲区分别只有1K。

出0入0汤圆

 楼主| 发表于 2017-5-19 15:40:17 | 显示全部楼层
立创商城-技术 发表于 2017-5-19 15:01
为何不直接用 FT232H? 它的SPI也支持30 Mbit/s的传输率? 并口模式可达40 Mbytes/S,含税价格才20多。

或 ...

它支持SPI从机?

出0入0汤圆

 楼主| 发表于 2017-5-19 15:43:41 | 显示全部楼层
立创商城-技术 发表于 2017-5-19 15:01
为何不直接用 FT232H? 它的SPI也支持30 Mbit/s的传输率? 并口模式可达40 Mbytes/S,含税价格才20多。

或 ...

Multi-Protocol Synchronous Serial Engine (MPSSE) to simplify synchronous serial protocol (USB to JTAG, I2C, SPI (MASTER) or bit-bang) design. 
好像并不支持从机模式,用过SPI传输数据的都知道,数据传输都是主机发起,若它只支持主机模式,传输数据并不是很方便,我们可以工作在从机模式下,这样你用单片机或者FPGA的SPI直接往外发送数据即可。

出0入0汤圆

 楼主| 发表于 2017-5-19 15:45:45 | 显示全部楼层
Nuker 发表于 2017-5-19 15:16
就扶楼上,FT2232H双路串口,直接支持UART,MPSSE支持I2C,SPI,JTAG,MPSSE库的源码官方直接开放 ...

它这个芯片功能已经固件,想实现一些特殊的时序或者想实现其他的功能就没办法了,我们这个是单片机实现的,我们可以根据客户需求做一些定制化的开发,比如适应非标准的一些协议,或者实现一些额外的控制信号配合SPI进行数据传输。

出0入0汤圆

发表于 2017-5-19 15:51:17 | 显示全部楼层
Nuker 发表于 2017-5-19 15:16
就扶楼上,FT2232H双路串口,直接支持UART,MPSSE支持I2C,SPI,JTAG,MPSSE库的源码官方直接开放 ...

原来FT232H这么多功能。
从论坛买了网友一个FT232H的RS232---TTL。
仅用做串口通讯了。
头像被屏蔽

出0入0汤圆

发表于 2017-5-19 16:48:40 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

出0入0汤圆

 楼主| 发表于 2017-5-19 17:09:22 | 显示全部楼层
立创商城-技术 发表于 2017-5-19 16:48
嗯,FT232H确实不支持SPI  SLAVE模式,但支持并口/FIFO的从模式。

实现了它没实现的,这不就够了吗?是吧
头像被屏蔽

出0入0汤圆

发表于 2017-5-19 17:41:42 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

出0入0汤圆

发表于 2017-5-19 20:31:38 来自手机 | 显示全部楼层
可以当从机是个优点  

出0入0汤圆

发表于 2017-5-20 13:43:48 | 显示全部楼层
真是高手         

出590入992汤圆

发表于 2017-5-22 20:41:44 | 显示全部楼层
膜拜大神~~楼主简单介绍下自己呗,建议楼主开贴分享经验。

出0入0汤圆

 楼主| 发表于 2017-5-23 16:06:37 | 显示全部楼层
主机模式下的速度测试:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出20入0汤圆

发表于 2017-5-23 19:36:37 | 显示全部楼层
楼主的分享都很有质量,买过楼主的设备,很好。

出0入0汤圆

发表于 2017-5-23 20:22:58 | 显示全部楼层
USB转UART速度最快可以多快呢?

出0入0汤圆

发表于 2017-5-23 22:48:10 来自手机 | 显示全部楼层
感觉很有用的工具,mcu与pc就缺这种速度的数据交换

出0入0汤圆

发表于 2017-5-24 01:59:33 | 显示全部楼层
请教一下,上位机读数据是开一个线程不停的轮询吗?

出0入0汤圆

发表于 2017-5-24 08:10:13 | 显示全部楼层
厉害,尝试下

出0入0汤圆

 楼主| 发表于 2017-5-24 09:22:01 | 显示全部楼层
ericw2012 发表于 2017-5-23 20:22
USB转UART速度最快可以多快呢?

后面我写个测试程序测试下,然后给你结果

出0入0汤圆

 楼主| 发表于 2017-5-24 09:23:40 | 显示全部楼层
gongcsf 发表于 2017-5-24 01:59
请教一下,上位机读数据是开一个线程不停的轮询吗?

主机模式下我的测试程序没开线程,直接for循环不断调用读写函数即可,实际用的时候可以通过开线程实现
从机程序底层是开了一个接收数据线程,接收到数据之后通过回调函数的方式传出数据,用过只需要实现自己的回调函数即可

出0入0汤圆

发表于 2017-5-24 09:26:47 | 显示全部楼层
Excellence 发表于 2017-5-19 15:51
原来FT232H这么多功能。
从论坛买了网友一个FT232H的RS232---TTL。
仅用做串口通讯了。 ...

还可以用他的可编程io口,控制stm32的rst和boot0,实现在线下载程序

出0入0汤圆

 楼主| 发表于 2017-5-24 10:10:01 | 显示全部楼层



测试UART的极限速度基本上在6M左右,受UART速度本身限制,没能发挥出高速USB的优势,看来还是用SPI快得多...

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出100入101汤圆

发表于 2017-5-24 14:20:07 | 显示全部楼层
lnso 发表于 2017-5-19 13:37
300不贵,昨天买个ST的脱机烧写器要了400

可以同时烧写几个片子?

出0入0汤圆

 楼主| 发表于 2017-6-1 10:42:44 | 显示全部楼层
                 

出0入0汤圆

发表于 2017-6-1 14:34:24 | 显示全部楼层
楼主很厉害,询问下,你的产品很多的上位机软件是用Qt编写的吗?

出0入0汤圆

发表于 2017-6-1 23:22:36 | 显示全部楼层
wdluo 发表于 2017-5-24 10:10
测试UART的极限速度基本上在6M左右,受UART速度本身限制,没能发挥出高速USB的优势,看来还是用SPI快得 ...

这个速度可以了,比市面上卖的很多USB转串口芯片都快

出0入0汤圆

发表于 2017-6-2 08:36:21 | 显示全部楼层
ericw2012 发表于 2017-5-23 20:22
USB转UART速度最快可以多快呢?

受限于UART  没有测试意义。       USB传输足够快,F4的缓冲液足够,但是UART应该只能到几M波特率不会超过10M(一般16采样,F4是100多M,就算不分频也在10M级别)。  就是这个几M也难用起来,异步通信要求双方波特率一模一样值允许一点点误差,你对接的另一个板子也要求一样的精准几M波特率。

出0入0汤圆

发表于 2017-6-2 08:38:43 | 显示全部楼层
12M USB, 理论按约1M字节速度,也够几M波特率串口单向传输了。

出0入0汤圆

 楼主| 发表于 2017-6-2 09:34:39 | 显示全部楼层
wzd5230 发表于 2017-6-1 14:34
楼主很厉害,询问下,你的产品很多的上位机软件是用Qt编写的吗?

是的,Qt写的很容易兼容Linux和Mac系统,程序基本上不用改啥

出0入0汤圆

 楼主| 发表于 2017-6-2 09:35:53 | 显示全部楼层
huangqi412 发表于 2017-6-2 08:38
12M USB, 理论按约1M字节速度,也够几M波特率串口单向传输了。

是的,转UART完全没啥优势,高速USB的性能完全发挥不起来,不过转SPI的话是很不错的

出0入0汤圆

发表于 2017-6-2 10:21:18 | 显示全部楼层
wdluo 发表于 2017-6-2 09:35
是的,转UART完全没啥优势,高速USB的性能完全发挥不起来,不过转SPI的话是很不错的 ...

你这个最大亮点和优点是高速SPI从机支持,可以让另一块板子无痛对接(对方肯定想用SPI主机)  这个比IC好,IC也有USB转SPI的,但IC一般只支持SPI主机模式

出0入0汤圆

 楼主| 发表于 2017-6-2 10:59:48 | 显示全部楼层
huangqi412 发表于 2017-6-2 10:21
你这个最大亮点和优点是高速SPI从机支持,可以让另一块板子无痛对接(对方肯定想用SPI主机)  这个比IC好 ...

是的,SPI有速度快,引脚少的优点,主机控制也非常方便,比如FPGA,模拟SPI时序是很容易的,这样就能很方便的把数据直接透传到PC

出0入0汤圆

发表于 2017-6-10 22:43:09 | 显示全部楼层
记好了,以后留着用

出0入0汤圆

发表于 2020-2-18 12:36:18 | 显示全部楼层
谢谢,不错,学习

出0入0汤圆

发表于 2020-2-26 15:50:07 | 显示全部楼层

谢谢,不错,学习
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-24 02:51

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表