spi访问fpga

news2024/12/29 12:06:56

SPI 外设的三线/四线模式及时钟极性相位可以配置,支持主机/从机、全双工/半双
工,传送数据格式可灵活配置,并且有发送空接收满 SPI 错误等中断事件功能配合应用使用,更多功能详见本系列芯片手册的相关章节。 

SPI四线模式框图:

 串行通信模式参数:

1,时钟极性

根据硬件制造商的命名规则不同,时钟极性通常写为CKP或CPOL。时钟极性和相位共同决定读取数据的方式,比如信号上升沿读取数据还是信号下降沿读取数据。

CKP可以配置为1或0。这意味着你可以根据需要将时钟的默认状态(IDLE)设置为高或低。极性反转可以通过简单的逻辑逆变器实现。你必须参考设备的数据手册才能正确设置CKP和CKE。

CKP = 0:时钟空闲IDLE为低电平 0;

CKP = 1:时钟空闲IDLE为高电平1。

2、时钟相位

根据硬件制造商的不同,时钟相位通常写为CKE或CPHA。顾名思义,时钟相位/边沿,也就是采集数据时是在时钟信号的具体相位或者边沿;

CKE = 0:在时钟信号SCK的第一个跳变沿采样;

CKE = 1:在时钟信号SCK的第二个跳变沿采样。

3、四种模式

根据SPI的时钟极性和时钟相位特性可以设置4种不同的SPI通信操作模式,它们的区别是定义了在时钟脉冲的哪条边沿转换(toggles)输出信号,哪条边沿采样输入信号,还有时钟脉冲的稳定电平值(就是时钟信号无效时是高还是低),详情如下所示:

Mode0:CKP=0,CKE =0:当空闲态时,CS_N处于低电平,数据采样是在第1个边沿,也就是SCLK由低电平到高电平的跳变,所以数据采样是在上升沿(准备数据),(发送数据)数据发送是在下降沿。

Mode1:CKP=0,CKE=1:当空闲态时,CS_N处于低电平,数据发送是在第2个边沿,也就是SCLK由低电平到高电平的跳变,所以数据采样是在下降沿,数据发送是在上升沿。

Mode2:CKP=1,CKE=0:当空闲态时,CS_N处于高电平,数据采集是在第1个边沿,也就是SCLK由高电平到低电平的跳变,所以数据采集是在下降沿,数据发送是在上升沿。

Mode3:CKP=1,CKE=1:当空闲态时,CS_N处于高电平,数据发送是在第2个边沿,也就是SCLK由高电平到低电平的跳变,所以数据采集是在上升沿,数据发送是在下降沿。

以上参数由GPIO或者仪表设置.

举例说明:CKP = 1,CKE = 0 

SPI读,关闭可用片选信号

SPI写

 

数据比特位解析:

起始位+读写标志位+数据长度 + 数据(地址+ 数据)

SPI 通信硬件连接相关 IO 如下 :

管脚名

端口方向

功能

主机

从机

SCK

输出

输入

通信时钟

MOSI

输出

输入

MISO

输入

输出

SS0

输出

输入

片选信号

设置参数

  1. 通过寄存器 SPI_CFG2.DSIZE 配置 SPI 数据帧长度为 4~16202432 位, 寄存器SPI_CFG2.LSBF 配置数据格式为 MSB LSB, 寄存器 SPI_CR1.PAE 配置数据奇偶校验是否使能 。
  2. 数据传送帧数
    通过寄存器 SPI_CFG1.FTHLV 可配置数据传送帧数分别为 1 ~4 帧,即启动一次数据传送的数据帧长度。当作为主机发送或接收数据时,向 DTR 寄存器写完所配置数据帧数目后才能启动一次数据传送;当作为从机接收数据时,收到了所配置数据帧数目的数据后才能产生 RDFF(接收缓冲器满)标志。 
  3. SPI 的模式定义
    SPI 外设通过 SPI_CFG2.CPHA 配置时钟相位(Clock Phase)和 SPI_CFG2.CPOLClockPolarity)配置时钟极性。 见四种模式说明

软件实现:

初始化:




static void Spi_Config(void)
{
    stc_spi_init_t stcSpiInit;
    stc_spi_delay_t stcSpiDelayCfg;

    /* Configure SPI Port function for master */
    GPIO_SetFunc(SPI_SCK_PORT, SPI_SCK_PIN, SPI_SCK_FUNC, PIN_SUBFUNC_DISABLE);
    GPIO_SetFunc(SPI_MOSI_PORT, SPI_MOSI_PIN, SPI_MOSI_FUNC, PIN_SUBFUNC_DISABLE);
    GPIO_SetFunc(SPI_MISO_PORT, SPI_MISO_PIN, SPI_MISO_FUNC, PIN_SUBFUNC_DISABLE);
    

    /* Clear initialize structure */
    (void)SPI_StructInit(&stcSpiInit);
    (void)SPI_DelayStructInit(&stcSpiDelayCfg);

  

    /* Port configurate */
    (void)GPIO_StructInit(&stcGpioCfg);
    /* High driving capacity for output pin. */
    stcGpioCfg.u16PinDir = PIN_DIR_OUT;
    stcGpioCfg.u16PinDrv = PIN_DRV_HIGH;
    stcGpioCfg.u16PinState = PIN_STATE_SET;
    (void)GPIO_Init(SPI_NSS_PORT, SPI_NSS_PIN, &stcGpioCfg)

      /* Configure peripheral clock */
    PWC_Fcg1PeriphClockCmd(SPI_UNIT_CLOCK, Enable);

    /* SPI De-initialize */
    SPI_DeInit(SPI_UNIT);

    /* Configuration SPI structure */
    stcSpiInit.u32WireMode = SPI_WIRE_3;
    stcSpiInit.u32TransMode = SPI_FULL_DUPLEX;
    stcSpiInit.u32MasterSlave = SPI_MASTER;
    stcSpiInit.u32SuspMode = SPI_COM_SUSP_FUNC_OFF;
    stcSpiInit.u32Modfe = SPI_MODFE_DISABLE;
    stcSpiInit.u32Parity = SPI_PARITY_INVALID;
    stcSpiInit.u32SpiMode = SPI_MODE_0;
    stcSpiInit.u32BaudRatePrescaler = SPI_BR_PCLK1_DIV256;
    stcSpiInit.u32DataBits = SPI_DATA_SIZE_8BIT;
    stcSpiInit.u32FirstBit = SPI_FIRST_MSB;
    (void)SPI_Init(SPI_UNIT, &stcSpiInit);

    stcSpiDelayCfg.u32IntervalDelay = SPI_INTERVAL_TIME_8SCK_2PCLK1;
    stcSpiDelayCfg.u32ReleaseDelay = SPI_RELEASE_TIME_8SCK;
    stcSpiDelayCfg.u32SetupDelay = SPI_SETUP_TIME_1SCK;
    (void)SPI_DelayTimeCfg(SPI_UNIT, &stcSpiDelayCfg);
    SPI_FunctionCmd(SPI_UNIT, Enable);
}


读写:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/75683.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

轻松玩转树莓派Pico之五、FreeRTOS体验

树莓派Pico开发板片上主芯片为RP2040单片机,双核 Arm Cortex-M0 处理器,工作主频为133MHz,264K片上SRAM,和2MByteFlash。 这么大的RAM和Flash资源,不跑一下RTOS操作系统实在有些可惜,这次就先体验一下Fre…

基于新型战争策略优化算法的光伏模型优化(Matlab代码实现)

💥💥💥💞💞💞欢迎来到本博客❤️❤️❤️💥💥💥 🎉作者研究:🏅🏅🏅本科计算机专业,研究生电气学硕…

vscode通过插件一键运行 c++单元测试

gtest使用初探 简介: 本文在 ubuntu18.04 上实现了 googletest 的全局安装,并在一个 demo项目中演示了使用 cmake 引入了该库,实现了在命令行中运行 c 单元测试,包括运行单个 TEST 函数。另外通过 vscode 的插件 C TestMate, 实现…

MATLAB应用2——MATLAB串口采集加速度计数据

串口保存数据为txt格式: clc ; %死机的时候,在命令窗口输入return %getcominstrhwinfo (serial) %寻找串口 delete(instrfindall) %这句话必须有 global xx; global nn; global data1; global s; xx0; nn500; data1(1:nn)0; sserial(COM8); set(s,Bau…

什么?用Python实用脚本也能实现快速卡通画人物头像,这不就是妥妥的QQ秀嘛。

前言 今天我们就利用Python脚本实现天气查询应用吧。直接开整~ 思路分析 从大量照片/卡通数据中习得照片到卡通画的映射。 开发工具 python版本: 3.6 相关模块: pytorch 1.4 tensorflow-gpu 1.14 face-alignment dlib 1.数据准备 训练数据包括…

Linux入门—Shell常用命令之打包压缩

本文由【正厚软件】沙老师提供 打包压缩命令 1. gzip 命令 命令功能:压缩或展开文件 命令格式: ogzip [ -acdfhlLnNrtvV19 ] [-S 后缀] [ 文件名 ... ] :压缩文件 ogunzip [ -acfhlLnNrtvV ] [-S 后缀] [ 文件名 ... ] :解压缩文件…

离线安装harbor容器镜像仓库单机版(harbor-v2.3.5)

记录:358 场景:在CentOS 7.9操作系统上,离线部署harbor容器镜像仓库单机版,使用Redis为外部缓存、使用PostgreSQL为外部数据库、使用docker-ce操作容器、使用docker-compose操作harbor容器镜像仓库。 版本: 操作系统…

OpenAI chatGPT火爆出圈,世界悄悄发生着变化

OpenAI chatGPT火爆出圈,世界悄悄发生着变化一、为什么突然火起来了?二、ChatGPT功能实例2.1 [AI聊天](https://chat.openai.com/chat)2.2 [AI写新闻稿](https://chat.openai.com/chat)2.3 [AI写代码](https://chat.openai.com/chat)2.4 [AI写论文](http…

Kubernetes二进制单节点集群部署

Kubernetes二进制单节点集群部署 常见的K8S按照部署方式 ●Mini kube Minikube是一个工具,可以在本地快速运行一个单节点微型K8S,仅用于学习、预览K8S的一些特性使用部署地址: https://kubernetes.io/docs/setup/minikube ●Kubeadmin Kubea…

浅谈Kernel32.dll(Windows平台下必有的动态库文件)

今天听了前辈的黑客攻击的知识分享,里面比较基础的元素就是Kernel32.dll,我对它感兴趣好久了,今天搜集一些资料,有关Kernel32的。 目录 ​编辑 一、Kernel32介绍 二、Kernel32内存管理 三、引起Kernel32出错的主要元凶 四、解…

【求助帖】从技术转为项目经理后,如何快速进入角色?

近日,看到了一个求助贴,小李今年26岁,干了两年技术后,现在转行到项目经理的岗位。每天东奔西跑、天天加班还是感觉很吃力、工作也没有成效,想问下如何能快速进入角色? 那么小李的一天具体是怎么样的呢&…

追格小程序重磅升级 新亮点来袭!

追格小程序是一个积木式小程序搭建框架,基于UniappWordPress开发,代码免费开源不加密且支持二开,安装追格相应扩展模块,简单配置即可快速搭建不限于圈子社区、知识付费、活动报名、资讯等类型小程序。 新的亮点是什么 追格小程序…

以太网 VLAN(VLAN数据帧格式、交换机接口类型)

2.8.2 以太网 VLAN(VLAN数据帧格式、交换机接口类型) 原始的以太网数据帧没有802.1QTag字段,在网络中进行转发的时候能够被主机接收、解封查看。 而一但有了802.1Q Tag字段的以太网数据帧,主机即使能接收数据帧,也无法…

233的字符串

//在群里看到了老师发布的下面这条消息,许久没打代码,打算找找感觉,第一道就拿捏我了,题目不是很难,但是高数据范围的超时问题一直是我未找到解决办法的一个问题,虽然现在比赛未结束,不过我的错…

人脑如果是台计算机,那么电从哪里来?

1.人脑是一台量子计算机 2022年10月7日,爱尔兰都柏林三一学院的实验团队在《物理学通讯》杂志上发表了一篇名为《非经典脑功能的实验指标》的论文。研究人员在论文中写道:“我们的研究结果表明,我们可能已经目睹了由意识相关的大脑功能介导的…

我写这10+个JavaScript单行代码,被组长夸代码写得优雅

JavaScript 非常大的特点容易上手且非常灵活,代码实现方式五花八门;有时候能一行代码解决,就尽量不用两行。 本文整理了非常有用的单行代码,这些需求都是在开发中非常常见的,用单行代码可以帮助你提高工作效率。 数组…

问卷开头语怎么写?

问卷的开头语是一份问卷的开场,开场好不好关系到整个问卷过程能够顺利进行。所以,在关注问卷的标题、题目、设计以外,我们也要重视起问卷的开头语。通俗易懂的内容更易进行传播,这一点也可以运用到问卷中,表达清晰、完…

低代码平台数据表格组件的设计实践

在做低代码产品的过程中,产品经理可能会遇到各种各样的问题,比如部分产品经理可能会因为对数据模型的不熟悉,而在实际对接中产生一定障碍。所以产品经理要如何在低代码工作中铲除障碍、并进行决策?本篇文章里,作者结合…

⚡热点管理模块⚡

热点管理模块概念 如果一个文件在连续一段时间内没有访问到,则该文件是一个非热点文件,否则位热点文件。在服务上上有两个目录,一个目录是backdir存储的是热点文件,一个目录是packdir存储的是非热点文件热点管理模块每隔一段时间…

ROHM | 开发出隔离型DC-DC转换器“BD7Fx05EFJ-C”

全球知名半导体制造商ROHM(总部位于日本京都市)开发出两款隔离型反激式*1DC-DC转换器“BD7F105EFJ-C”和“BD7F205EFJ-C”,新产品非常适用于xEV(电动汽车)的主驱逆变器、车载充电器(以下简称“OBC”&#x…