CYPEESS USB3.0程序解读之---SPI读写
前面已经解读了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读写的更多相关文章
- CYPEESS USB3.0程序解读之---GPIO
CPRESS 官方给出的SDK1.1中(目前最新的SDK),提供了大量的例程供我们开发软件的时候作参考,就像STM32的开发一样提供了库一样,但是又不是库,仅仅是参考例程. 首先看一个简单一点的GPI ...
- CYPEESS USB3.0程序解读之---同步FIFO(slaveFifoSync)
上一篇文章解读了CYPRESS FX3的GPIO的操作过程,下面解读同步FIFO的一个例子(slaveFifoSync). *生产者,消费者. 1.首先看DMA的回调函数(cyu3dma.h): ty ...
- 第24章 SPI—读写串行FLASH—零死角玩转STM32-F429系列
第24章 SPI—读写串行FLASH 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/ ...
- AC6102开发板USB3.0测试和使用说明
AC6102开发板USB3.0测试和使用说明 概述 AC6102上集成了一颗Cypress 推出的高性能USB3.0传输芯片CYUSB3014,Cypress称之为EZ-USBFX3.该芯片性能强劲, ...
- USB3.0测试和使用说明
概述 AC6102上集成了一颗Cypress 推出的高性能USB3.0传输芯片CYUSB3014,Cypress称之为EZ-USBFX3.该芯片性能强劲,功能强大,接口简单,非常适合用于各种需要高速数 ...
- 给windows 7安装文件添加USB3.0驱动
给Air安装win7进入语言与区域选择之后,发现键盘触摸板都失灵. 原因:新款的 Macbook Air 2013 因为使用了 USB3.0 端口键盘和触摸板设备,所以在安装 Windows 7 ...
- 【原创】基于部署映像服务和管理(DISM)修改映象解决WIN7 USB3.0安装时报错
本文作者为博客园阿梓喵http://www.cnblogs.com/c4isr/,转载请注明作者. 本文源地址:http://www.cnblogs.com/c4isr/p/3532362.html ...
- 如何在Win7安装U盘中加入USB3.0驱动的支持
U盘安装系统出现鼠标键盘不能使用,在intel六代处理器平台,安装过程中会出现安装原生镜像不能识别或者鼠标键盘不能使用等情况,可以参考以下方法进行. 风险提示:重装或升级系统会导致系统盘数据丢失,建议 ...
- USB3.0及NVME SSD安装WIN7X64
USB3.0及NVME SSD安装WIN7X64https://tieba.baidu.com/p/4822034273?pn=1所有的人都是菜鸟过来的,不过有些人懂得自己动手找到答案:有些人则是懒得 ...
随机推荐
- layui 监听checkbox 、radio、switch选中改变事件
form.on('checkbox(filter)', function(data){ console.log(data.elem); //得到checkbox原始DOM对象 console.log( ...
- Jenkins 凭证 Devops 的粘合剂
大家好,我是小猿来也,一个热衷于搞 Devops 自动化的 Java 程序猿. 万事具备,只欠东风.当我决定大搞特搞 Devops 的时候,Jenkins 凭证却傻傻分不清. 玩 Devops 的小伙 ...
- mysql 的基础操作
1.建表 create table 表名( 字段一 数据类型 [列属性] , 字段二 数据类型 [列属性], ......... )[表类型][表字符集][注释]; 注意:MySQL命令终止符为分号 ...
- WPF技巧:通过代码片段管理器编写自己常用的代码模板提示效率
在写自定义控件的时候,有一部分功能是当内部的值发生变化时,需要通知控件的使用者,而当我在写依赖项属性的时候,我可以通过popdp对应的代码模板来完成对应的代码,但是当我来写属性更改回调的时候,却发现没 ...
- ESP8266相关知识笔记
1.ESP8266 可以用来做串口透传,PWM 调控,远程控制开关:控制插座.开关.电器等.2.ESP8266有几种不同的使用方式,适用于不同水平的开发工作者. 使用AT指令进行操作:这是最常见的方式 ...
- ORB随便记一记
论文摘取 (这部分看的是泡泡机器人的翻译) 基于特征点.单目.完全自动初始化,基于PTAM框架. 相关工作 A.位置识别(大概是用于回环检测) bags of words FAB-map DBOW2 ...
- facade层,service 层,domain层,dao 层设计
转自http://fei-6666.iteye.com/blog/446247,记录下来 一,Service->DAO,只能在Service中注入DAO. 二,DAO只能操作但表数据,跨表操作放 ...
- GIS数据资源下载
GeoJSON数据下载 1.全国.省.市.县级geojson数据下载 地址:http://datav.aliyun.com/tools/atlas/#&lat=33.5219039961561 ...
- windows7查看和关闭占用的端口
1. 查看占用的端口 cmd 后输入命令:netstat -aon|findstr [要查的端口] 如欲查端口1099,输入:netstat -aon|findstr 1099 2. 关闭占用的端口 ...
- 基于小熊派Hi3861鸿蒙开发的IoT物联网学习【四】
一.互斥锁基本概念: 1.互斥锁又称互斥型信号量,是一种特殊的二值性信号量[二值型信号量可以理解为任务与中断间或者两个任务间的标志,该标志非"满"即"空"],用 ...