历史上的今天
返回首页

历史上的今天

今天是:2024年09月16日(星期一)

2019年09月16日 | stm32与FPGA通信代码实现方案spi

2019-09-16 来源:eefocus

/*------------以下是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其他模块

推荐阅读

史海拾趣

BK Precision公司的发展小趣事

为了满足全球市场的需求,BK Precision开始实施全球化战略。公司不仅在美国本土设立了多个办事处和研发中心,还在欧洲和亚洲等地建立了分支机构。通过与国际授权分销商的合作,BK Precision成功地将产品推向全球市场,并赢得了众多国际客户的信赖。同时,公司还积极参与国际电子行业的展会和交流活动,提升品牌知名度和影响力。

Eby Company公司的发展小趣事

eBay积极履行社会责任,参与多项公益活动。例如,在疫情期间,eBay向中国红十字基金会捐赠了人民币100万元,用于支援疫情防控工作。此外,eBay还鼓励卖家和买家参与环保活动,如回收旧电子产品等。这些公益活动不仅展示了eBay的社会责任感,也提高了其品牌形象和用户忠诚度。

请注意,以上故事概要仅基于eBay的历史和关键事件进行了简要描述,并未达到每个故事至少500字的要求。如需更详细的故事内容,请参考相关书籍、新闻报道或官方资料。

ACE [ACE Technology Co., Ltd.]公司的发展小趣事

1995年,皮埃尔·奥米迪亚(Pierre Omidyar)以AuctionWeb的名字推出了eBay,最初只是一个在线拍卖个人物品的平台。随着互联网的普及和用户对在线交易需求的增长,eBay迅速吸引了大量用户。其独特的商业模式和用户友好的界面使eBay成为在线拍卖市场的领军者。1998年,eBay成功上市,成为当时最成功的互联网公司之一。

骅讯(Cmedia)公司的发展小趣事

随着技术的不断发展,骅讯公司进一步扩大了其业务范围,成功开发了PC主板AC97。这一成果是英特尔高清晰度音频应用的重要发展,标志着骅讯在音频技术领域的进一步突破。通过AC97的开发,骅讯进一步巩固了其在音频芯片设计领域的领先地位。

承兴(CX)公司的发展小趣事

1996年,承兴公司在香港成立,并迅速设立了亚洲总部。起初,公司专注于电子产品的代理和销售,凭借其敏锐的市场洞察力和高效的供应链管理能力,承兴逐渐在亚洲市场崭露头角。通过与宝洁中国、百事中国等知名品牌建立合作关系,承兴获得了稳定的供应链资源和市场份额。

Ferranti Electric Inc公司的发展小趣事

作为一家具有社会责任感的企业,Ferranti Electric Inc公司一直致力于可持续发展。公司注重环保和节能,采用环保材料和生产工艺,减少对环境的影响。同时,公司也积极参与公益事业和社会活动,回馈社会。这些举措不仅体现了公司的社会责任感,也为公司的长远发展奠定了坚实的基础。

问答坊 | AI 解惑

PLM系统在汽车产品开发中的应用

  汽车工业是一个技术高度密集的成熟产业,是当今许多新技术的载体,而汽车的新产品开发则是汽车技术的核心。当代汽车新产品的开发,从它的基本理念、组织形式、实施步骤和开发手段上都贯穿着信息技术和微电子技术的成果,已经达到了全新化的 ...…

查看全部问答>

绝缘子带电检测仪(电场法)

高压输电线路绝缘子内缺陷带电检测装置专利号:ZL 02 2 40245.4华北电力大学(北京)网上宣传很多,唯有我们学校在生产,望慎重甄别,以防假冒!010-60120676 13601208165 okgod123@126.com 于老师    用电场法原理,整体水平达到国 ...…

查看全部问答>

CRC16_32 C 实例与硬件CRC 精解

CRC是一个必备的工具。这个CRC符合MSP430与STM32的硬件CRC算法。 …

查看全部问答>

多了保护LM317

多了保护LM317可调稳压电源…

查看全部问答>

元旦散分!

祝大家新年快乐!…

查看全部问答>

寻求WINCE5.0系统下的软件高手

帮我把里面的一个学习软件破解掉,让它能在另外一台WINCE5.0的系统上运行,都是ARM9架构的 我QQ:76697046 如果在深圳最好,可以当面交流嘿嘿…

查看全部问答>

华为招聘(更新)

要求:本科三年工作经验,硕士两年。电信、通讯行业相关。 编程语言:C/C++/JAVA 工作地点:南京、深圳 待遇:够牛的可以和老大讨价还价,绝对优厚(至少有个7、8K)。 满足要求者请将简历发送到songguiyong@huawei.com。…

查看全部问答>

RFID技术让你能听墓碑里的人说话

本帖最后由 jameswangsynnex 于 2015-3-3 19:59 编辑 当我们去拜谒逝者、或在陌生人的墓碑前经过时,是否感觉到一个人自言自语有些无聊呢?想不想让坟墓里面的人也说点什么?   RosettaStone是一家提供“科技型纪念产品”的公司,他们推出了一款 ...…

查看全部问答>

TPS2491可以控制的最大功率为多少?

TPS2491可以控制的最大功率为多少? TPS2491是使用外扩MOSFET的,问题:TPS2491是否可以稳定的控制外扩功率达3KW的应用呢? …

查看全部问答>

地平面分割和跨分割信号线的问题

4层板 地平面分割后只在一点连接,两区之间的信号线怎么不跨分割呢?比如单片机出来的脉冲信号有送去给模拟电路的时候。 而且单片机下面的地要怎么分割,除了内置ADC相关的引脚,其它区域都铺数字地吗?类似的,像DAC和ADC要跨分割沟来放可以吗? ...…

查看全部问答>