搜索
bottom↓
回复: 19

给大家发个自己写的fpga和单片机spi通信程序(大鸟飞过)

[复制链接]

出0入0汤圆

发表于 2011-10-16 15:45:54 | 显示全部楼层 |阅读模式
/*==============================================
*        描    述:SPI总线接收--一次接收n位的数据
*        开始时间:2011-04-16
*        完成时间:2011-04-16
*        最后修改:2011-07-21
*        版    本: V7.2
*        作    者:林鸿
*        说        明:        MCU发送数据,PFGA接收,时钟上升沿接收数据
                        每次接收的数据为n位
*        备        注:  parameter        Wei=n;  n为自己要改的位数 一般为2的整数倍,比较好操作       
//==============================================*/
module SPI_Receive_n(D_out,Clk,Sdi,Cs);
parameter        Wei=n;

output reg[(Wei-1):0] D_out;         //数据输出                                                               
input Sdi;                           //数据输入                                                                                       
input Clk;                                 //时钟信号                                       
input Cs;                                  //片选                                       
reg[(Wei-1):0] Date_in;
integer i;

always@(posedge Clk)        //在上升沿的时候接收来自MCU的数据                               
begin
  if(Cs==0)                                                
          begin
                   Date_in[0] <= Sdi;
                   for(i=0;i<(Wei-1);i=i+1)
                        begin
                                Date_in[i+1] <= Date_in;
                        end
        end
  else if(Cs==1)
        begin
                D_out[(Wei-1):0]<= Date_in[(Wei-1):0];                                 
        end
end
endmodule



/*==============================================
*        描    述:SPI总线发送n位的数据
*        开始时间:2011-4-1
*        完成时间:2011-4-1
*        最后修改:2011-08-30
*        版    本: V7.4
*        作    者:林鸿
*        说        明:        MCU接收来自FPGA的数据,下降沿的时候FPGA发送数据
*        备        注:parameter        Wei=n;  n为自己要改的位数 一般为2的整数倍,比较好操作       
//==============================================*/

module SPI_send_n(Cs,Clk,D_in,Sdo);
parameter Wei=32;

input Cs;                                                                                                                                 
input Clk;
input [(Wei-1):0]        D_in;       
output reg Sdo;                                                                
                                                                             
reg[Wei:0] Date_in;

always@(negedge Clk)
begin
        if (Cs)
                begin
                    Date_in[Wei:0]=D_in[(Wei-1):0];
                        Date_in[Wei]=1'b0;
                        Sdo=1'b0;
                end
    else if(Cs==0)
             begin  
                        Date_in=Date_in<<1;
                        Sdo=Date_in[Wei];
                        Date_in[0]=0;                       
                  end
end
endmodule








以下是单片机部分
/*==============================================
*        描    述:SPI总线
*        开始时间:2011-3-30
*        完成时间:2011-3-30
*        最后修改:2011-07-22
*        版    本: V7.3
*        作    者:林鸿
*        说        明:
*        备        注:       
//==============================================*/
#include        <c8051f020.h>
#include         <intrins.h>/*包含含有_nop_()函数的头文件*/
#include        "delay_020.h"
#include        "SPI.h"

/*-----------------------------------------------------------------
*         函数功能: 发送一个字节的数据
*         入口参数: 待发的数据
*         返回参数: 无
*        全局变量: 无
*         调用模块: 无     
*         注意事项:时钟是上升沿的时候发送数据,片选低电平有效有效
//------------------------------------------------------------------*/
void Send_char(uchar Date_Send)
{       
        uchar        i=8;
        Cs_out=1;
        nop;
        nop;
        nop;
        Cs_out=0;
        Clk=0;
   while(i)
   {
                   Clk=0;
                   Mosi=(Date_Send&0x80);
                Date_Send<<=1;  
                   Clk=1;
                i--;                       
        }       
        Cs_out=1;

        Clk=0;                                //先给一个上升沿来更新FPGA里面的值
        nop;
        nop;
        Clk=1;
}

/*-----------------------------------------------------------------
*         函数功能: 接收一个字节的数据
*         入口参数: 无
*         返回参数: 接收一个字节的数据
*        全局变量: 无
*         调用模块: 无     
*         注意事项:时钟是下降接收数据,片选下降沿有效
//------------------------------------------------------------------*/
uchar        Recive_char()
{
        uchar        i=8;
        uchar        Date;
        Clk=1;                                //先给一个下降沿来更新FPGA里面的值
        nop;
        nop;
        Clk=0;
        Cs_in=1;
        nop;
        nop;
        nop;
        Cs_in=0;
        Clk=1;
        while(i)   //下降沿的时候采集数据
        {
                Clk=0;        //FPGA的数据发送到MISO总线上
                nop;
                nop;
                Date<<=1;
                if(Miso)
                        Date=Date|1;
                i--;
                Clk=1;
        }
        Cs_in=1;
        return Date;
}



FPGA部分程序ourdev_685457YVK4DV.txt(文件大小:888字节) (原文件名:SPI_Receive_n.txt)
FPGA部分程序ourdev_685458JLAIN1.txt(文件大小:755字节) (原文件名:SPI_send_n.txt)

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2011-10-16 15:50:27 | 显示全部楼层
c8051fxx单片机SPI程序,其他单片机通用,只需要改下includeourdev_685462EFLX7U.txt(文件大小:2K) (原文件名:SPI.c.txt)
c8051fxx单片机SPI程序,其他单片机通用,只需要改下includeourdev_685463RP91PA.txt(文件大小:368字节) (原文件名:SPI.h.txt)

出0入0汤圆

发表于 2011-12-8 09:30:14 | 显示全部楼层
正在写有关的,不知你这是否正确,不过仍然谢谢楼主,参考参考。呵呵

出0入0汤圆

发表于 2012-2-27 09:23:50 | 显示全部楼层
研究下

出0入0汤圆

发表于 2012-4-7 13:47:29 | 显示全部楼层
正在写有关的,借鉴一下

出0入0汤圆

发表于 2012-4-7 15:13:38 | 显示全部楼层
不久的将来会用到,研究研究

出0入0汤圆

发表于 2012-8-19 20:36:00 | 显示全部楼层
我表示搞不定!

出0入8汤圆

发表于 2012-8-20 11:17:51 | 显示全部楼层
俺也刚写了个  SPI通信的  定义了4个命令   FPGA中总共有230位的 配置寄存器  命令包含读写。

出0入0汤圆

发表于 2012-8-20 12:00:43 | 显示全部楼层
kebaojun305 发表于 2012-8-20 11:17
俺也刚写了个  SPI通信的  定义了4个命令   FPGA中总共有230位的 配置寄存器  命令包含读写。 ...

是跟c8051f020的嘛?

出0入8汤圆

发表于 2012-8-20 18:03:08 | 显示全部楼层
小滑头520 发表于 2012-8-20 12:00
是跟c8051f020的嘛?

FPGA 做的SPI从机     所有的单片机都可以啊。

出0入0汤圆

发表于 2012-8-20 20:14:07 | 显示全部楼层
for循环都用上了,给力……

出0入0汤圆

发表于 2012-8-21 08:51:19 | 显示全部楼层
kebaojun305 发表于 2012-8-20 18:03
FPGA 做的SPI从机     所有的单片机都可以啊。

能分享点资料不? 邮箱是 qzdianzikejixiehui@163.com 谢谢啦!

出0入0汤圆

发表于 2012-8-26 00:13:17 | 显示全部楼层
我以前也做过一个简单的

出0入0汤圆

发表于 2012-9-17 11:13:10 | 显示全部楼层
楼主的程序是不是有点小错误啊?????

出0入0汤圆

发表于 2012-9-17 11:14:42 | 显示全部楼层
   Date_in[i+1] <= Date_in这里需要修改一下,   Date_in[i+1] <= Date_in[i],不然好像不能用啊

出0入22汤圆

发表于 2012-9-17 11:31:41 | 显示全部楼层
就是,楼主,你的fpga程序里面最好别用for,用状态机+变量。

出0入0汤圆

发表于 2012-9-26 10:58:15 | 显示全部楼层
zhoulei123 发表于 2012-9-17 11:14
Date_in

大哥 这样改了 fpga接收到我数据也不对啊?

出0入0汤圆

发表于 2012-9-26 14:04:48 | 显示全部楼层
小滑头520 发表于 2012-9-26 10:58
大哥 这样改了 fpga接收到我数据也不对啊?

我用的是同步时钟检测上升沿和下降沿,兄弟你改一下试试

出0入0汤圆

发表于 2012-9-26 18:17:24 | 显示全部楼层
zhoulei123 发表于 2012-9-26 14:04
我用的是同步时钟检测上升沿和下降沿,兄弟你改一下试试

可以了 谢谢!  

出0入0汤圆

发表于 2014-3-24 13:29:36 | 显示全部楼层
zhoulei123 发表于 2012-9-26 14:04
我用的是同步时钟检测上升沿和下降沿,兄弟你改一下试试

请问下 怎么改 不太清楚  上升沿和下降沿都检测 是单片机还是FPGA
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 11:22

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表