八、赛普拉斯EZ-USB FX3 SPI

2023-11-23 08:40
文章标签 usb spi ez 普拉斯 fx3

本文主要是介绍八、赛普拉斯EZ-USB FX3 SPI,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、简介

        SPI(Serial Perripheral Interface)串行外设接口,是由摩托罗拉(Motorola)推出的一种高速、同步、串行、全双工的通信技术,在嵌入式设备中广泛使用的接口协议。SPI支

        SPI分为两种模式:主模式,从模式,当作为主模式时可以挂载多个从设备,每个设备都有单独的片选线。

图1.0 SPI一主多从 

        SPI接口共有四根通信线,分别为MOSI、MISO、CS(SSN)、SCLK,当采用4根通信线则为全双工通信,当采用3根通信线则为单工通信:

                ·MOSI(Master Output Slave Input):主设备数据输出,从设备数据输入

                ·MISO(Master Input Slave Output):主设备的数据输入,从设备数据输出

                ·SCLK(Serial Clock):时钟信号,由主设备产生

                ·CS(Chip Select):片选信号,拉低选择对应的从设备

        SPI根据时钟相位(CPHA)与时钟极性(CPOL)的不同组合共有四种模式,它能决定数据是在什么时刻采样。

 图1.1 SPI采样模式

        SPI模式0,CPOL = 0,CPHA = 0,时钟空闲时为低电平,数据在时钟的偶数边沿采样(橙色线)

 图1.2 SPI模式0

         SPI模式1,CPOL = 0,CPHA = 1,时钟空闲时为低电平,数据在时钟的奇数边沿采样(橙色线)

 图1.3 SPI模式1

         SPI模式2,CPOL = 1,CPHA = 0,时钟空闲时为高电平,数据在时钟的奇数边沿采样(橙色线)

图1.4 SPI模式2

         SPI模式3,CPOL = 1,CPHA = 1,时钟空闲时为高电平,数据在时钟的偶数边沿采样(橙色线)

图1.5 SPI模式3 

二、程序

        初始化SPI设备函数

extern CyU3PReturnStatus_t
CyU3PSpiInit (
        void);

        配置SPI函数

extern CyU3PReturnStatus_t
CyU3PSpiSetConfig (
        CyU3PSpiConfig_t *config,       /**< Pointer to the SPI config structure. */
        CyU3PSpiIntrCb_t cb             /**< Callback for receiving SPI events. */
        );

        设置片选信号函数

extern CyU3PReturnStatus_t
CyU3PSpiSetSsnLine (
        CyBool_t isHigh                 /**< CyFalse: Pull down the SSN line, CyTrue: Pull up the SSN line. */
        ); 

         SPI发送函数(单位:字)

extern CyU3PReturnStatus_t
CyU3PSpiTransmitWords (
        uint8_t *data,                  /**< Source data pointer. This needs to be padded to nearest
                                byte if the word length is not byte aligned. */
        uint32_t byteCount              /**< This needs to be a multiple of the word length aligned to the next
                                             byte. */
        );

         SPI接收函数(单位:字)

extern CyU3PReturnStatus_t
CyU3PSpiReceiveWords (
        uint8_t *data,                  /**< Buffer to read the data into. */
        uint32_t byteCount              /**< Amount of data to be read. This should be an integral multiple
                                             of the SPI word length aligned to the next byte. */
        );

         SPI发送/接收函数(单位:字)

extern CyU3PReturnStatus_t
CyU3PSpiTransferWords (
        uint8_t  *txBuf,        /**< Source buffer containing data to transmit. Can be NULL if txByteCount is 0. */
        uint32_t  txByteCount,  /**< Number of data bytes to transmit. Needs to be a multiple of the word length
                                     aligned to the next byte. */
        uint8_t  *rxBuf,        /**< Destination buffer to receive data into. Can be NULL if rxByteCount is 0. */
        uint32_t  rxByteCount   /**< Number of data bytes to receive. Needs to be a multiple of the word length
                                     aligned to the next byte. */
        );

         SPI配置源文件

#include "cyfx3_spi.h"
#include "cyu3error.h"
#include "cyu3utils.h"static CyU3PReturnStatus_t CyFx3GpioConfig(void)
{CyU3PReturnStatus_t CyFx3Status;//GPIO时钟配置(整个工程中只需要初始化一次)CyU3PGpioClock_t GpioClkConifg = {.fastClkDiv = 2,.slowClkDiv = 0,.halfDiv = 0,.simpleDiv = CY_U3P_GPIO_SIMPLE_DIV_BY_2,.clkSrc = CY_U3P_SYS_CLK,};CyFx3Status = CyU3PGpioInit(&GpioClkConifg,NULL);if(CyFx3Status != CY_U3P_SUCCESS){return CyFx3Status;}#if !SPI_HARDWARECyU3PGpioSimpleConfig_t SpiMosiGpioConfig = {.outValue = CyTrue,.driveLowEn = CyTrue,.driveHighEn = CyTrue,.inputEn = CyFalse,.intrMode = CY_U3P_GPIO_NO_INTR,};CyFx3Status = CyU3PGpioSetSimpleConfig(SPI_MOSI_GPIO_PIN,&SpiMosiGpioConfig);if(CyFx3Status != CY_U3P_SUCCESS){return CyFx3Status;}CyU3PGpioSimpleConfig_t SpiMisoGpioConfig = {.outValue = CyTrue,.driveLowEn = CyFalse,.driveHighEn = CyFalse,.inputEn = CyTrue,.intrMode = CY_U3P_GPIO_NO_INTR,};CyFx3Status = CyU3PGpioSetSimpleConfig(SPI_MISO_GPIO_PIN,&SpiMisoGpioConfig);if(CyFx3Status != CY_U3P_SUCCESS){return CyFx3Status;}CyU3PGpioSimpleConfig_t SpiClkGpioConfig = {.outValue = CyTrue,.driveLowEn = CyTrue,.driveHighEn = CyTrue,.inputEn = CyFalse,.intrMode = CY_U3P_GPIO_NO_INTR,};CyFx3Status = CyU3PGpioSetSimpleConfig(SPI_CLK_GPIO_PIN,&SpiClkGpioConfig);if(CyFx3Status != CY_U3P_SUCCESS){return CyFx3Status;}CyU3PGpioSimpleConfig_t SpiSsnGpioConfig = {.outValue = CyTrue,.driveLowEn = CyTrue,.driveHighEn = CyTrue,.inputEn = CyFalse,.intrMode = CY_U3P_GPIO_NO_INTR,};return CyU3PGpioSetSimpleConfig(SPI_SSN_GPIO_PIN,&SpiSsnGpioConfig);#endif
}CyU3PReturnStatus_t CyFx3SpiInit(void)
{#if !SPI_HARDWAREreturn CyFx3GpioConfig();#elseCyU3PReturnStatus_t CyFx3Status;CyFx3Status = CyU3PSpiInit();if(CyFx3Status != CY_U3P_SUCCESS){return CyFx3Status;}CyU3PSpiConfig_t SpiConfig = {.isLsbFirst = CyFalse,.cpol = CyFalse,.cpha = CyFalse,.ssnPol = CyFalse,.ssnCtrl = CyFalse,.leadTime = CY_U3P_SPI_SSN_LAG_LEAD_HALF_CLK,.lagTime = CY_U3P_SPI_SSN_LAG_LEAD_HALF_CLK,.clock = SPI_FREQUENCY,.wordLen = 8,};CyFx3Status = CyU3PSpiSetConfig(&SpiConfig,NULL);if(CyFx3Status != CY_U3P_SUCCESS){return CyFx3Status;}return CyU3PSpiSetSsnLine(CyFalse);
#endif
}#if !SPI_HARDWAREstatic CyU3PReturnStatus_t SpiSetMosiValue(CyBool_t isHigh)
{return CyU3PGpioSetValue(SPI_MOSI_GPIO_PIN,isHigh);
}static CyBool_t SpiGetMisoValue(void)
{return CyFx3GpioReadBit(SPI_MISO_GPIO_PIN);
}static CyU3PReturnStatus_t SpiSetClkValue(CyBool_t isHigh)
{return CyU3PGpioSetValue(SPI_CLK_GPIO_PIN,isHigh);
}CyU3PReturnStatus_t SpiSetSsnValue(CyBool_t isHigh)
{return CyU3PGpioSetValue(SPI_SSN_GPIO_PIN,isHigh);
}//CPOL = 0, CPHA = 0, MSB first
uint64_t SpiReadWriteMode0(uint32_t write_dat1,uint32_t write_dat2,uint32_t len)
{uint32_t i;uint32_t read_dat;uint32_t testreadspi;if(len == 32){for(i = 0;i < 32;i++){if(write_dat1 & 0x80000000){SpiSetMosiValue(CyTrue);}else{SpiSetMosiValue(CyFalse);}SpiSetClkValue(CyTrue);read_dat <<= 1;write_dat1 <<= 1;CyU3PBusyWait(1);if(SpiGetMisoValue() == CyTrue){read_dat++;}SpiSetClkValue(CyFalse);}testreadspi = read_dat;}else if(len == 64){for(i = 0;i < 32;i++){if(write_dat1 & 0x80000000){SpiSetMosiValue(CyTrue);}else{SpiSetMosiValue(CyFalse);}SpiSetClkValue(CyTrue);write_dat1 <<= 1;//CyU3PBusyWait(1);read_dat <<= 1;CyU3PBusyWait(1);if(SpiGetMisoValue() == CyTrue){read_dat++;}SpiSetClkValue(CyFalse);}testreadspi = read_dat << 16;for(i = 0;i < 32;i++){if(write_dat2 & 0x80000000){SpiSetMosiValue(CyTrue);}else{SpiSetMosiValue(CyFalse);}SpiSetClkValue(CyTrue);write_dat2 <<= 1;read_dat <<= 1;CyU3PBusyWait(1);if(SpiGetMisoValue() == CyTrue){read_dat++;}//CyU3PBusyWait(1);SpiSetClkValue(CyFalse);}testreadspi += read_dat >> 16;}return testreadspi;
}uint8_t SpiReadWriteByte(uint8_t Byte)
{uint8_t i;for(i = 0;i < 8;i++){if(Byte & 0x80){SpiSetMosiValue(CyTrue);}else{SpiSetMosiValue(CyFalse);}Byte <<= 1;CyU3PBusyWait(1);SpiSetClkValue(CyFalse);if(SpiGetMisoValue() == CyTrue){Byte |= 0x01;}CyU3PBusyWait(1);SpiSetClkValue(CyTrue);}/*for(i = 0;i < 8;i++){SpiSetClkValue(CyTrue);if(Byte & 0x80){SpiSetMosiValue(CyTrue);}else{SpiSetMosiValue(CyFalse);}Byte <<= 1;CyU3PBusyWait(1);SpiSetClkValue(CyFalse);if(SpiGetMisoValue() == CyTrue){Byte |= 0x01;}CyU3PBusyWait(1);}*/return Byte;
}void CyFx3SpiReceiveTransmitBytes(uint8_t *WriteData,uint8_t *ReadData,uint16_t DataLen)
{for(uint16_t i = 0;i < DataLen;i++){ReadData[i] = SpiReadWriteByte(WriteData[i]);}
}#endif

        SPI配置头文件

#ifndef CYFX3_SPI_H_
#define CYFX3_SPI_H_#include "cyu3spi.h"
#include "cyu3gpio.h"
#include "gpio_regs.h"#define SPI_HARDWARE					0
#define SPI_GPIO_REGS					0#define SPI_FREQUENCY				    8000000U   //8MHz#if !SPI_HARDWARE#define CyFx3GpioReadBit(GpioPin)	    ((GPIO->lpp_gpio_simple[GpioPin]& CY_U3P_LPP_GPIO_IN_VALUE) >> 1)
#define CyFx3GpioSetBit(GpioPin)		((*(uvint32_t *)&GPIO->lpp_gpio_simple[GpioPin]) |= CY_U3P_LPP_GPIO_OUT_VALUE)
#define CyFx3GpioResetBit(GpioPin)		((*(uvint32_t *)&GPIO->lpp_gpio_simple[GpioPin]) &= ~CY_U3P_LPP_GPIO_OUT_VALUE)#define SPI_MOSI_GPIO_PIN            	 51
#define SPI_MISO_GPIO_PIN            	 57
#define SPI_CLK_GPIO_PIN             	 50
#define SPI_SSN_GPIO_PIN              	 52CyU3PReturnStatus_t SpiSetSsnValue(CyBool_t isHigh);
uint8_t SpiReadWriteByte(uint8_t WriteData);
void CyFx3SpiReceiveTransmitBytes(uint8_t *WriteData,uint8_t *ReadData,uint16_t DataLen);
#endifCyU3PReturnStatus_t CyFx3SpiInit(void);
#endif /* CYFX3_SPI_H_ */

这篇关于八、赛普拉斯EZ-USB FX3 SPI的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/416697

相关文章

【STM32】SPI通信-软件与硬件读写SPI

SPI通信-软件与硬件读写SPI 软件SPI一、SPI通信协议1、SPI通信2、硬件电路3、移位示意图4、SPI时序基本单元(1)开始通信和结束通信(2)模式0---用的最多(3)模式1(4)模式2(5)模式3 5、SPI时序(1)写使能(2)指定地址写(3)指定地址读 二、W25Q64模块介绍1、W25Q64简介2、硬件电路3、W25Q64框图4、Flash操作注意事项软件SPI读写W2

Usb Audio Device Descriptor(10) Hid Device

对于 Standard Interface Descriptor, 当 bInterfaceClass=0x03时,即为HID设备。Standard Interface Descriptor如下 struct usb_standard_interface_descriptor{U8 bLength; /*Size of this descriptor in bytes*/U8 bDescrip

Android rk3399 UAC(USB Audio)开发笔记

一、UAC有1.0和2.0,因Windows对2.0支持不好,我使用的是UAC1.0驱动 内核配置:CONFIG_USB_CONFIGFS_F_UAC1          ---这个宏配置无需物理codec,使用虚拟 alsa codec  驱动路径:"kernel\drivers\usb\gadget\function\f_uac1.c" 内核配置:CONFIG_USB_CONFIGFS_

多款式随身WiFi如何挑选,USB随身WiFi、无线电池随身WiFi、充电宝随身WiFi哪个好?优缺点分析!

市面上的随身WiFi款式多样琳琅满目,最具代表性的就是USB插电款、无线款和充电宝款。今天就来用一篇文章分析一下这三种款式的优缺点。 USB插电款 优点:便宜,无需充电,在有电源的地方可以随时随地插电使用,比如中兴的USB随身WiFi。 缺点:无电源的情况下,无法带出门使用,部分品牌考虑到这个问题,会配备一个充电仓,这个充电仓相对来说就有点累赘了。网速上也不太稳定,波动比较大。

基于FPGA的开源项目:FOC/SHA/USB/JPEG等

文章目录 [1. USB 1.1控制器](https://github.com/WangXuan95/FPGA-USB-Device)[2. FOC控制算法](https://github.com/WangXuan95/FPGA-FOC)[3. BSV高级硬件描述语言入门指南](https://github.com/WangXuan95/BSV_Tutorial_cn)[4. 基于XDMA的

stm32之软件SPI读写W25Q64存储器应用案例

系列文章目录 1. stm32之SPI通信协议 文章目录 系列文章目录前言一、电路接线图二、应用案例代码三、应用案例分析3.1 SPI通信模块3.2 W25Q64模块3.3 主程序 前言 提示:本文主要用作在学习江科大自化协STM32入门教程后做的归纳总结笔记,旨在学习记录,如有侵权请联系作者 本案例使用软件SPI通信的方式实现了STM32与W25Q64 Flas

Flink1.10基于工厂模式的任务提交与SPI机制

《2021年最新版大数据面试题全面开启更新》 Flink任务执行模式包含了yarn-session、standalone、per-job、local, 在1.10中又增加k8s的执行模式,那么在任务提交过程中如何根据不同的执行模式进行任务提交呢?主要通过两个接口来实现:PipelineExecutorFactory 与 PipelineExecutor。PipelineExecutorF

转载 SPI的比喻理解

SPI 传输是一个虚拟的移位寄存器方式。 你这么理解就可以: 主机和从机之间有一条 16 格的传送带。主机一格一格拨动它转动(相当于发送时钟)。 如果是主机发送,它就把一个个的东西放在传送带上,转动 8 次,就传到从机一侧了。这时,从机可以从传送带上将东西取下。如果从机没有取东西,这些东西再转 8 次又回到主机一侧。 如果是主机接收,从机就要把 8 个东西一次放上传送带。当主机转动 8 次,东西就

关于小米手机USB传输稍大点的文件老中断的问题解决方法!

关于小米手机USB传输稍大点的文件老中断的问题解决方法! 这是一个很痛苦的事情,当你传输大文件的时候,传输到一半就会莫名其妙的中断,拔插数据线很多次以后,好不容易没准可以成功传输一次。 后来使用了360的手机助手,从调试模式传输文件,虽然不会中断,但是慢的要死。 最后我看到手机插上后手机提示 有3种模式:仅限充电 传输文件(MTP) 传输照片(PTP)。当然我们选择传输文件是没戏了,会中

VirtualBox安装VirtualBox Extension Pack,支持USB No USB devices connected after upgrade

安装步骤及出现问题解决No USB devices connected after upgrade: 一、本要主机ubuntu14.04,安装virtualbox,支持usb设置步骤: 1.安装VirtualBox. 可以从https://www.virtualbox.org官方站点下载或者从软件中心。 2.在VirtualBox里安装Windows; 3.为USB2.0,你需要