stm32与FPGA通信代码实现方案spi

发布者:DreamyEclipse最新更新时间:2019-09-16 来源: eefocus关键字:stm32  FPGA  通信代码实  spi 手机看文章 扫描二维码
随时随地手机看文章

/*------------以下是FPGA与微控制器通信SPI模块的编程思路-分析-------------*/


模块结构框图

Spi_scl是SPI通信时钟,由主机自行产生,跟一般意义的时钟不一样,上升沿32发数据,下降沿32接收数据


主要由SPI信号缓存模块,SPI时钟边沿检测,命令接收+数据接收,发送几部分构成:

 

Spi_sdo:MISO发给32处理


dout:[31:0]:这个数据通过dcm的选择发给其他从机


Cmd_done:从器件地址接收完毕标志,高电平有效


Data_done:FPGA数据收发完成标志,高电平有效


rst:FPGA复位


clk:FPGA时钟


Spi_sdi:MOSI


Spi_cs_data:低电平时开启SPI接收数据(接收数据片选信号)


Spi_cs_cmd:使能FPGA接收其他从器件地址的信号,低电平有效


Spi_scl:32提供的通信时钟


din[31:0]:FPGA并行数据接收端口,接收外界待测频率信号


程序分析:


程序一:SPI信号两级缓存部分程序设计


(为避免产生毛刺和方便信号边沿检测,SPI通信中spi_scl(通信时钟),spi_cs_cmd(低,FPGA从器件地址接收片选),spi_cs_data(低,FP接收数据片选)这三个信号需要进行两级缓存)



这里只写spi_scl的二级缓存示例,其他两个方法一样


搞个always@(posedge clk )如同步复位的话就先清零spi_scl_reg1,else只是clk上升沿的话就让spi_scl_reg1<=spi_scl,这是一级缓存


在搞个always@(posedge clk)如同步复位的话就先清零spi_scl_reg,else只是clk上升沿的话就让spi_scl_reg<=spi_scl_reg1,这是二级缓存



程序二:SPI通信时钟边沿检测模块设计


//为什么要边沿检测,在SPI主从机通信中FPGA在sclk上升沿接收数据,在sclk下降沿进行数据发送//


第一部分:sclk上升沿检测模块:存储在scl_up_flag中


搞个always@(posedge clk )如同步复位的话就先清零spi_scl_flag,else只是clk上升沿的话就再判断if(spi_scl_reg1==1&&spi_scl_reg==0)//scl一级缓存为1且scl二级缓存为零,  就令scl_up_flag<=1,标志这时sc刚刚有过上升沿现在还在高电平状态,   else令scl_up_flag <= 0;


第二部分:sclk下降沿检测模块:存储在scl_down_flag中


搞个always@(posedge clk )如同步复位的话就先清零spi_down_flag,else只是clk上升沿的话就再判断if(spi_scl_reg1==0&&spi_scl_reg==1)//scl一级缓存为0且scl二级缓存为1,  就令scl_down_flag<=1,标志这时scl刚刚有过下降沿现在还在低电平状态,   else令scl_down_flag <= 0;


注意(这里的up和down信号个高电平会维持一个clk周期,称为高脉冲)


程序三:SPI通信接收模块设计

//这里只分析接收数据的方法,接收地址的方法不赘述地址为宽我们用8wei//


//手先需要spi_cs_data使能信号低电平有效,同时等到spi_scl上升沿时,接收模块将spi_sdi传入的串行数据经移位寄存器dout转成并行数据(注意没个上升沿只能传一位串行数据),经过数据位宽个spi_clk时钟后(我们用的是32位)数据片选使能才会拉高//


还是搞个always@(posedge clk )如同步复位的话就先清零spi_down_flag,else只是clk上升沿的话就再判断if(spi_cs_data_reg1==0&&spi_cs_data_reg==1)//scl一级缓存为0且scl二级缓存为1, 说明数据片选信号有效,允许接收数据,这是在判断有没有if(scl_up_flag)通信时钟为高电平,刚有过上升沿,现在开始用移位寄存器dout接收spi_sdi的串行数据第一个数,


dout[31:0] <={dout[30:0],spi_sdi} //  dout左移让输入数据先占据最低位,依此。。。


再搞个else,如果以上三条件有一个不满足的话就让dout保持原值。


//再产生数据接收结束标志,搞个data_done触发器,当数据片选信号拉高之后表明数据串转并完毕,这时再让相应的接收完成标志寄存器data_done <= 1//


 


判断刚刚有过数据片选上升沿的语句:if(spi_cs_data_reg1 = = 1&& spi_cs_data_reg = = 0)


数据接收一开始也是先判断刚刚有过下降沿if(spi_data_reg1== 0&&spi_data_reg== 1),这个时候是给dout<=0,如果不是这样就dout保持,


 


程序四:SPI通信数据发送模块设计


//刚刚说了spi_cs_data为低时数据接收,发送的方法跟接收是对称的,所以在spi_cs_data为高的期间,一旦spi_scl的下降沿到来,就要将刚刚接收的数据存入数据发送寄存器进行din_reg中,仍然是等到spi_cs_data低电平期间一旦spi_scl下降沿到来时就将din_reg中并行数据转换成串行数据并经过spi_sdo端口输出给stm32,有事经过位宽个通信时钟后数据发送完毕,spi_cs_data拉高,//


 


先发送最高位,if(scl_down_flag)


Spi_sdo <= din_reg[31]


din_reg[31:0]={din_reg[30:0],1’b0}//左移


//注意都别忘了当不满足条件时让spi_sdo和din_reg[31:0]都保持前面都是这样的,这是一个默认的规则,还有那个复位也是//


这里在spi_cs_data拉高之后让din_reg[31:0]获取下一轮din[31:0]中接收的数据,else还是保持,切记!!


 


总结:din[31:0]中的数据是FPGA其他模块传来的,外界传来的信号加上测频部分的可能有好几路31位的数据,先通到一个mux8_to1用sel(sel值由32发送过来)选择哪路进入到din[31:0]中,然后这个数据可以进入din_reg中再通过spi_sdo发送到stm32,32收到这个数据信号后就可以进行各种处理,如显示在屏幕上等。然后32那边发送过来的数据或命令进入spi_sdi口,这个串行数据可以通过移位寄存器一个个移入dout[31:0]中从而传给FPGA其他模块

关键字:stm32  FPGA  通信代码实  spi 引用地址:stm32与FPGA通信代码实现方案spi

上一篇:两块STM32之间的SPI通信
下一篇:STM32之SPIFLASH W24Q64的结构

推荐阅读最新更新时间:2024-11-12 22:38

STM32使用CubeMAX配置的串口中断接收方法
STM32使用cubeMAX可以快速建立工程模板,但是默认使用的是Hal库构成的工程,对于习惯使用了ST标准库的同学来说,灵活调用HAL库可能会比较生疏,我也是这么觉得的,但是还是要逐步去接触学习它,毕竟这个hal库的封装还是相当好的,有好多先进的思想和用法。 在学习过程中,我遇到了一个问题,之前也遇到过,但是没时间去研究,就是串口在CUBUMAX上配置好后,如何实现串口中断接收,接下来就来记录一下我学习到的知识: 1.定位串口中断发生的地方 HAL库的中断处理还是和标准库一样的,在stm32xxxx_it.c中定义我们定位到如下函数: HAL_UART_IRQHandler(&huart1); 再往下定位,我们找
[单片机]
一文了解SPI总线工作原理、优缺点和应用案例
将微控制器连接到传感器,显示器或其他模块时,您是否考虑过两个设备之间如何通信?他们到底在说什么?他们如何能够相互理解? 电子设备之间的通信就像人类之间的通信,双方都需要说同一种语言。在电子学中,这些语言称为通信协议。幸运的是,在构建大多数DIY电子项目时,我们只需要了解一些通信协议。在本系列文章中,我们将讨论三种最常见协议的基础知识:串行外设接口(SPI),内部集成电路(I2C)和通用异步接收器/发送器(UART)驱动通信。 首先,我们将从一些关于电子通信的基本概念开始,然后详细解释SPI的工作原理。 SPI,I2C和UART比USB,以太网,蓝牙和WiFi等协议慢得多,但它们更简单,使用的硬件和系统资源也更少。 SPI,I2C和
[嵌入式]
一文了解<font color='red'>SPI</font>总线工作原理、优缺点和应用案例
高云半导体推出I3C高速串行接口解决方案
山东高云半导体科技有限公司(以下简称“山东高云半导体”)近日宣布推出基于低密度小蜜蜂Ⓡ家族的GW1N-9 FPGA芯片的SDR-模式I3C IP (Master-Slave-Combined )高速串行接口解决方案,包括相关IP软核、参考设计及开发板等完整解决方案。 I3C 是MIPI联盟一个新的通讯协议,该协议兼容并扩展了传统I2C通讯协议,其总线为两线式串行总线。 高云I3C IP遵循MIPI联盟I3C总线的通讯协议,集I3C Master和Slave于一体,是一个参数可配置、基于高云半导体FPGA芯片的IP设计。该IP可动态地配置成I3C Master或 Slave,实现I3C Master与I3C Slave或I2C
[嵌入式]
STM32开发笔记38: 单片机内部Flash的读写
单片机型号:STM32F070F6P6 本文介绍应用C语言进行单片机内部Flash的读写技巧,将从查看文档开始,到最终完成完整的程序。 单片机型号:STM32F070F6P6 步骤如下: 1、查看文档《STM32F030x4/x6/x8/xC and STM32F070x6/xB advanced ARM®-based 32-bit MCUs》确认其Flash的内部结构。 2、查看文档确认STM32F070F6P6内部存储器地址分配。从下表中得到的主要信息是Main Flash memory的起始地址是0x08000000,长度是32KB,到0x08017FFF结束(结束值可不关心)。 3、继续
[单片机]
<font color='red'>STM32</font>开发笔记38: 单片机内部Flash的读写
STM32几种IO设置模式
在 STM32中选用 IO 模式 (1) 浮空输入 _IN_FLOATING —— 浮空输入,可以做 KEY 识别, RX (2)带上拉输入 _IPU—— IO 内部上拉电阻输入 (3)带下拉输入 _IPD—— IO内部下拉电阻输入 (4) 模拟输入 _AIN —— 应用 ADC 模拟输入,或者低功耗下省电 (5)开漏输出 _OUT_OD —— IO 输出 0接 GND , IO 输出 1,悬空,需要外接上拉电阻,才能 实现输出高电平。当输出为 1时, IO 口的状态由上拉电阻拉高电平,但由于是开漏输出模式, 这样 IO 口也就可以由外部电路改变为低电平或不变。 可以读 IO 输入电平变化, 实现 C51的 IO 双向功能 (6)
[单片机]
下一代MachXO3D FPGA 让汽车更安全
我们生活在一个高度互连的世界,很容易受到各种来源的网络攻击。仅2018年,硬件攻击让超过30亿系 统暴露在数据盗窃、非法操作和其它安全隐患中1。 在汽车领域,如今的智能联网汽车则加剧了这类安全问题。若网络攻击造成汽车失控不仅会对目标车辆中 的人员造成伤害,更有可能危及附近的车辆、行人和财产。 因此,汽车的设计人员和厂商正极力寻找保障系统安全之道。正如本文所述,解决方法之一是采用莱迪思 半导体的MachXO3D™ FPGA。 老式汽车时代已经过去 汽车市场在不断演变,近些年来的变化尤其剧烈,变化速度极快。 以微处理器单元(MPU)和微控制器单元(MCU)为主的计算器件在20世纪七八十年代晚期开始应用于汽 车。起初,这些
[嵌入式]
下一代MachXO3D <font color='red'>FPGA</font> 让汽车更安全
51单片机 | SPI协议与应用实例
简介: 串行外围设备接口 全双工三线同步,可以同时发出和接收串行数据 采用主从(Master Slave)架构,支持多Slave模式应用,一般仅支持单Slave 时钟由Master控制,在时钟移位脉冲下,数据按位传输,高位在前,低位在后 目前应用中可以达到几Mbps的水平 优点:与普通的串行设备相比,可以按位传输,甚至可以暂停。当没有时钟跳变时,从设备不采集和传送数据。不需要寻址操作。全双工通信。 缺点:没有应答机制确认。 特点: 提供频率可编程时钟 发送结束、中断标志;写冲突保护 总线竞争保护 SPI总线工作的4种工作方式中,使用最广泛的是SPI0和SPI3方式 - - - - - - - - - -
[单片机]
51单片机 | <font color='red'>SPI</font>协议与应用实例
STM32 CAN 波特率的确定
先看两份资料: (1),STM32 得到500Kb/s的波特率 CAN_InitStructure.CAN_SJW=CAN_SJW_1tq; CAN_InitStructure.CAN_BS1=CAN_BS1_8tq; CAN_InitStructure.CAN_BS2=CAN_BS2_7tq; CAN_InitStructure.CAN_Prescaler=1; 每一位的Tq数目 = 1 (固定SYNC_SEG) + 8 (BS1) + 7 (BS2) = 16 如果CAN时钟是 8 MHz : (8M / 1 ) / 16 = 500K 其中: 1 为分频系数 16 为每一位的Tq数目 为了设置为 100K,
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved