前面已经解读了GPIO以及同步FIFO操作,下面我们看一个SPI读写的例子,它是主程序命令从SPI中读写一些数据。

SPI传输子程序看一下: 页地址,字节计数,缓冲区,读写标志

因为只能一页一页的读或写,故读写总是从页地址开始的

/* SPI read / writefor programmer application. */

CyU3PReturnStatus_t

CyFxSpiTransfer (

uint16_t  pageAddress, //页地址

uint16_t  byteCount,      //字节计数

uint8_t *buffer,            //缓冲区

CyBool_t  isRead)                  //读写标志

{

CyU3PDmaBuffer_t buf_p;    //DMA buffer

uint8_t location[4];

uint32_t byteAddress = 0;

uint16_t pageCount = (byteCount /glSpiPageSize);

CyU3PReturnStatus_t status =CY_U3P_SUCCESS;

if (byteCount == 0)

{

return CY_U3P_SUCCESS;

}

if ((byteCount % glSpiPageSize) != 0)

{

pageCount ++;                ///如果除不尽,则按多一页来读写

}

buf_p.buffer = buffer; //地址重载

buf_p.status = 0;

byteAddress = pageAddress * glSpiPageSize;                   //页地址*尺寸=实际地址

CyU3PDebugPrint (2, "SPI access -addr: 0x%x, size: 0x%x, pages: 0x%x.\r\n",

byteAddress, byteCount, pageCount);

while (pageCount != 0)

{

//高字节

location[1] = (byteAddress >> 16)& 0xFF;       /* MS byte */

location[2] = (byteAddress >> 8)& 0xFF;

//低字节

location[3] = byteAddress &0xFF;               /* LS byte */

if (isRead)

{

location[0] = 0x03; /* Read command. *///读命令

buf_p.size  = glSpiPageSize;

buf_p.count = glSpiPageSize;

status = CyFxSpiWaitForStatus ();

if (status != CY_U3P_SUCCESS)

return status;

CyU3PSpiSetSsnLine (CyFalse);

status = CyU3PSpiTransmitWords(location, 4);

if (status != CY_U3P_SUCCESS)

{

CyU3PDebugPrint (2, "SPIREAD command failed\r\n");

CyU3PSpiSetSsnLine (CyTrue);

return status;

}

CyU3PSpiSetBlockXfer (0,glSpiPageSize);        //设置传输尺寸

/// 这个子程序是允许DMA。两个参数一个是TX,一个是RX的个数

status =CyU3PDmaChannelSetupRecvBuffer (&glSpiRxHandle,

&buf_p);

if (status != CY_U3P_SUCCESS)

{

CyU3PSpiSetSsnLine (CyTrue);

return status;

}

status =CyU3PDmaChannelWaitForCompletion (&glSpiRxHandle,

CY_FX_USB_SPI_TIMEOUT);

if (status != CY_U3P_SUCCESS)

{

CyU3PSpiSetSsnLine (CyTrue);

return status;

}

CyU3PSpiSetSsnLine (CyTrue);

CyU3PSpiDisableBlockXfer (CyFalse,CyTrue);

}

else /* Write */

{

location[0] = 0x02; /* Writecommand */

buf_p.size  = glSpiPageSize;

buf_p.count = glSpiPageSize;

status = CyFxSpiWaitForStatus ();

if (status != CY_U3P_SUCCESS)

return status;

CyU3PSpiSetSsnLine (CyFalse);

status = CyU3PSpiTransmitWords(location, 4);

if (status != CY_U3P_SUCCESS)

{

CyU3PDebugPrint (2, "SPIWRITE command failed\r\n");

CyU3PSpiSetSsnLine (CyTrue);

return status;

}

CyU3PSpiSetBlockXfer(glSpiPageSize, 0);

status =CyU3PDmaChannelSetupSendBuffer (&glSpiTxHandle,

&buf_p);

if (status != CY_U3P_SUCCESS)

{

CyU3PSpiSetSsnLine (CyTrue);

return status;

}

status =CyU3PDmaChannelWaitForCompletion(&glSpiTxHandle,

CY_FX_USB_SPI_TIMEOUT);

if (status != CY_U3P_SUCCESS)

{

CyU3PSpiSetSsnLine (CyTrue);

return status;

}

CyU3PSpiSetSsnLine (CyTrue);

CyU3PSpiDisableBlockXfer (CyTrue,CyFalse);

}

/* Update the parameters */

byteAddress  += glSpiPageSize;

buf_p.buffer += glSpiPageSize;

pageCount --;

CyU3PThreadSleep (10);

}

return CY_U3P_SUCCESS;

}

在USB的SETUP中回调中( CyFxUSBSetupCB ),有两个参数,一个是setupdat0,一个是setupdat1.

这两个参数是类,VENDOR调用时的回调函数。

如果是请求ID号,则直接往EP0中写入一个字符串。

如果是请求FLASH写,则从EP0中得到相应的数组。后写到SPI中。

如果是请求读,则从SPI中读出指定长度的数,再送到EP0中去。

如果是请求擦除或点名。则如果点名,就送状态过去,如果是擦除,就送一个ACK包给USB即可。

那么就要了解一下类/VENDOR请求的格式是什么即可。

CYPEESS USB3.0程序解读之---SPI读写的更多相关文章

  1. CYPEESS USB3.0程序解读之---GPIO

    CPRESS 官方给出的SDK1.1中(目前最新的SDK),提供了大量的例程供我们开发软件的时候作参考,就像STM32的开发一样提供了库一样,但是又不是库,仅仅是参考例程. 首先看一个简单一点的GPI ...

  2. CYPEESS USB3.0程序解读之---同步FIFO(slaveFifoSync)

    上一篇文章解读了CYPRESS FX3的GPIO的操作过程,下面解读同步FIFO的一个例子(slaveFifoSync). *生产者,消费者. 1.首先看DMA的回调函数(cyu3dma.h): ty ...

  3. 第24章 SPI—读写串行FLASH—零死角玩转STM32-F429系列

    第24章     SPI—读写串行FLASH 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/ ...

  4. AC6102开发板USB3.0测试和使用说明

    AC6102开发板USB3.0测试和使用说明 概述 AC6102上集成了一颗Cypress 推出的高性能USB3.0传输芯片CYUSB3014,Cypress称之为EZ-USBFX3.该芯片性能强劲, ...

  5. USB3.0测试和使用说明

    概述 AC6102上集成了一颗Cypress 推出的高性能USB3.0传输芯片CYUSB3014,Cypress称之为EZ-USBFX3.该芯片性能强劲,功能强大,接口简单,非常适合用于各种需要高速数 ...

  6. 给windows 7安装文件添加USB3.0驱动

    给Air安装win7进入语言与区域选择之后,发现键盘触摸板都失灵.   原因:新款的 Macbook Air 2013 因为使用了 USB3.0 端口键盘和触摸板设备,所以在安装 Windows 7 ...

  7. 【原创】基于部署映像服务和管理(DISM)修改映象解决WIN7 USB3.0安装时报错

    本文作者为博客园阿梓喵http://www.cnblogs.com/c4isr/,转载请注明作者. 本文源地址:http://www.cnblogs.com/c4isr/p/3532362.html ...

  8. 如何在Win7安装U盘中加入USB3.0驱动的支持

    U盘安装系统出现鼠标键盘不能使用,在intel六代处理器平台,安装过程中会出现安装原生镜像不能识别或者鼠标键盘不能使用等情况,可以参考以下方法进行. 风险提示:重装或升级系统会导致系统盘数据丢失,建议 ...

  9. USB3.0及NVME SSD安装WIN7X64

    USB3.0及NVME SSD安装WIN7X64https://tieba.baidu.com/p/4822034273?pn=1所有的人都是菜鸟过来的,不过有些人懂得自己动手找到答案:有些人则是懒得 ...

随机推荐

  1. ssh-正向与反向代理

    常用参数 栗子 实战 常用参数 -N 告诉SSH客户端,这个连接不需要执行任何命令.仅仅做端口转发 -C 表示压缩数据传输 -f 告诉SSH客户端在后台运行 -q Quiet mode. 安静模式,忽 ...

  2. elk 日志收集 filebeat 集群搭建 php业务服务日志 nginx日志 json 7.12版本 ELK 解决方案

    难的不是技术,难的是业务.熟悉业务流程才是最难的. 其实搜索进来的每一个人的需求不一样,希望你能从我的这篇文章里面收获到. 建议还是看官方文档,更全面一些. 一.背景 1,收集nginx  acces ...

  3. CRM系统选型时的参考哪些方面

    企业不论在制定营销策略或是在进行CRM系统选型时,首先都是要了解自身的需求.每一家企业的情况和需求都有很大差异,CRM系统的功能也都各有偏重.有些CRM偏重销售管理.有些注重于营销自动化.有些则侧重于 ...

  4. 使用了gitlab管理pipeline,Jenkinsfile 中在出现克隆命令流水线执行会混乱

    Jenkins_pipeline关闭默认检出 问题描述 在使用 Pipeline(流水线)过程中,如果使用了(Pipeline script from SCM)远程 Git 的 Jenkinsfile ...

  5. SpringCloud:Zuul路由配置超时问题

    测试访问时长 修改下业务类,增加sleep休眠时长,以此查看Zuul的熔断 @GetMapping("/test1") public Object test1() { try { ...

  6. MySql:MySql忘记密码怎么修改?

    1. 关闭正在运行的MySQL服务2. 打开DOS窗口,转到mysql\bin目录3. 输入mysqld --skip-grant-tables 回车       --skip-grant-table ...

  7. Java实验项目四——多线程矩阵相乘算法的设计

    Program:多线程矩阵相乘算法的设计 Description:利用多线程实现矩阵相乘,因为各个线程的运算互不影响, 所以不用使用锁,代码如下: thread.OperateMatrix类,实现矩阵 ...

  8. Kotlin Coroutine(协程): 一、样例

    @ 目录 前言 一.直接上例子 1.延时任务. 2.异步任务 3.并行任务: 4.定时任务: 总结 前言 你还在用 Hanlder + Message? 或者 AsyncTask? 你还在用 Rxja ...

  9. Android系统编程入门系列之界面Activity交互响应

    在上篇文章中已经了解到界面Activity的绘制完全依赖其加载的视图组件View,不仅如此,用户的每次触摸操作都可以在界面Activity内接收并响应,也可以直接传递给其中的某个视图View响应.本文 ...

  10. 题解 guP3956 棋盘

    好吧本来这题可以用最短路跑完的,结果我硬是打了1.5小时的dfs... 其实这题并没有那么难,构造一个无向图再跑最短路即可. 我用的dj跑最短路 问题来了 如果(n,n)是无色的,那么图上就没有这个点 ...