我想写个C51与FPGA的SPI接口的C程序,我知道51要用模拟的SPI,哪位大贤能帮帮忙,让我学习一下。

希望有具体的程序和详解,先拜谢了。有点想法的随便说说也行... 希望有具体的程序和详解,先拜谢了。
有点想法的随便说说也行
展开
 我来答
百度网友41d469f
2011-07-12
知道答主
回答量:11
采纳率:0%
帮助的人:5.6万
展开全部
这是 读写pcf2127a的程序。用spi接口。
cpu 是51兼容系列 cy7c68013
#define spi_read 0x20
#define spi_write 0xa0

void spi_start(void)
{ OEE|=spi_ce+spi_di+spi_clk;
OEE &= ~spi_do;
SYNCDELAY;

IOE&=~(spi_ce|spi_clk);
SYNCDELAY;
}
void spi_stop(void)
{
IOE |=spi_ce;
SYNCDELAY;
}
void spi_wr(unsigned char command)
{
char i;
for (i=0;i<8;i++)
{
if((command&0x80)==0x80) {IOE |=spi_di;}else {IOE &=~spi_di;}
command<<=1;
SYNCDELAY;
IOE |=spi_clk;
SYNCDELAY;
IOE &=~spi_clk;
SYNCDELAY;
SYNCDELAY;
}
}
unsigned char spi_rd(void)
{
unsigned char bret;
char i;
bret=0;
for (i=0;i<8;i++)
{IOE |=spi_clk;
bret<<=1;
SYNCDELAY;
SYNCDELAY;
if((IOE&spi_do)==spi_do){ bret++;}
IOE &= ~spi_clk;
SYNCDELAY;
SYNCDELAY;
}
return bret;
}

void spi_writedata(unsigned char address,unsigned char command)
{
address&=0x1f;
address|=0x20;
spi_start();
spi_wr(address);
SYNCDELAY;
spi_wr(command);
spi_stop();
}

unsigned char spi_readdata(unsigned char address)
{unsigned char bret;

address&=0x1f;
address |=0xa0;
spi_start();
spi_wr(address);
SYNCDELAY;
bret=spi_rd();
spi_stop();
return bret;
}
void read_time(unsigned char address)
{spi_start();
spi_wr(address|0xa0);
EP0BUF[8] =spi_rd();//秒
EP0BUF[9]= spi_rd();//分
EP0BUF[10]= spi_rd();//时
EP0BUF[11]= spi_rd();//日
EP0BUF[12]= spi_rd();
hEP0BUF[13]= spi_rd();//月
EP0BUF[14]= spi_rd();//年
spi_stop();
}

void write_ram(unsigned int address,unsigned int command)
{unsigned char addh,addl,commandh,commandl;
addh=(address&0xff00)>>8;
addl=address&0x00ff;
commandh=(command&0xff00)>>8;
commandl=command&0x00ff;
spi_writedata(0x1a,addh);
spi_writedata(0x1b,addl);
spi_writedata(0x1c,commandh);
spi_writedata(0x1c,commandl);
}
unsigned int read_ram(unsigned int address)
{
unsigned char addh,addl,commandh,commandl;
unsigned int command;
addh=(address&0xff00)>>8;
addl=address&0x00ff;
spi_writedata(0x1a,addh);
spi_writedata(0x1b,addl);
commandl=spi_readdata(0x1d);
commandh=spi_readdata(0x1d);
command=(commandh<<8)+commandl;
return command;
}
追问
这也太水了吧,具体解释下,还有点风马牛的感觉,譬如我用的STC89C51,FPGA用的spatran3,都没直接的SPI接口,我自己写了模拟SPI接口,但是时序就是对不上,发送检测没问题,收就收不到,所以想看个具体程序,如果大侠有空,就拜托写个程序看看了,感激!
追答
这就是模拟spi时序的程序,
用四个引脚模拟spi接口,一个时钟spi_clk,一个数据输出spi_do,一个数据输入spi_di。一个片选spi_ce;
驱动时钟 时钟输出8个脉冲 ,在输出线上输出数据,在输入线上读取数据。最好时钟频率控制在100KHz左右。你用的fpga我不熟悉,但fpga可以用两个移位寄存器模拟spi口。

spi允许
void spi_start(void)
{ OEE|=spi_ce+spi_di+spi_clk;
OEE &= ~spi_do;
SYNCDELAY;

IOE&=~(spi_ce|spi_clk);
SYNCDELAY;//延时
}

void spi_wr(unsigned char command)
{
char i;
for (i=0;i<8;i++)//8个脉冲
{
if((command&0x80)==0x80) {IOE |=spi_di;}else {IOE &=~spi_di;}//写入数据
command<<=1;
SYNCDELAY;
IOE |=spi_clk;
SYNCDELAY;
IOE &=~spi_clk;
SYNCDELAY;
SYNCDELAY;
}
}
unsigned char spi_rd(void)//发送8个脉冲,读取数据

{
unsigned char bret;
char i;
bret=0;
for (i=0;i<8;i++)
{IOE |=spi_clk;
bret<<=1;
SYNCDELAY;
SYNCDELAY;
if((IOE&spi_do)==spi_do){ bret++;}
IOE &= ~spi_clk;
SYNCDELAY;
SYNCDELAY;
}
return bret;
}

void spi_writedata(unsigned char address,unsigned char command)//写入数据。
{
address&=0x1f;//命令
address|=0x20;
spi_start();
spi_wr(address);写入8字节命令
SYNCDELAY;
spi_wr(command);//写入8字节数据。
spi_stop();
}
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式