|
/*==============================================
* 描 述: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, 杜汶泽)
|