[开发工具] 分享个高速USB2SPI适配器,简单快速的将数据传输到PC

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

从机接收到数据之后将数据写入文件中的程序:
  1.   /*
  2.   ******************************************************************************
  3.   * [url=home.php?mod=space&uid=288409]@file[/url]     : USB2XXXSPISlaveReceiveFile.cpp
  4.   * @Copyright: usbxyz
  5.   * @Revision : ver 1.0
  6.   * [url=home.php?mod=space&uid=212281]@date[/url]     : 2014/12/19 9:33
  7.   * [url=home.php?mod=space&uid=247401]@brief[/url]    : 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. }
测试工程下载: USB2XXXSPISlaveReceiveFile.rar (650.1 KB, 下载次数: 60)
适配器购买链接:https://item.taobao.com/item.htm ... amp;id=545509364910

mmuuss586 发表于 2017-5-19 13:30 | 显示全部楼层
734774645 发表于 2017-5-19 15:45 | 显示全部楼层
看看怎么个情况,学习一下。
734774645 发表于 2017-5-19 15:45 | 显示全部楼层
看看怎么个情况,学习一下。
 楼主| beyond696 发表于 2017-5-20 08:48 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:USB转I2C,SPI,CAN,UART,GPIO,PWM,IR,ADC,DAC合一 http://usb2xxx.taobao.com

55

主题

294

帖子

12

粉丝
快速回复 在线客服 返回列表 返回顶部