打印

用51单片机软件模拟SPI通信

[复制链接]
6589|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
enjier|  楼主 | 2011-6-13 07:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
程序如下:程序运行时,对25c040不能写入,更别说读出啦。基于Protues仿真的,请各位高手不吝赐教...
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint  unsigned int
sbit SPI_SCK = P2^3;
sbit SPI_SI = P2^4;
sbit SPI_SO = P2^5;
sbit SPI_CS = P2^6;
sbit SPI_LED = P2^7;
void Data_Send(uchar Sdata);//数据传送函数,方便调用
uchar Data_Rece(void);//数据接收函数,方便调用
void Write_Enable(void);//写使能函数
void Write_Disable(void);//写禁止函数
void Byte_Write(uchar Addr,uchar Wdata);//字节写函数
void Page_Write(uchar Addr,uchar *s);//页写函数
uchar Byte_Read(uchar Addr);//读数据函数
void main(void)
{
SPI_CS = 0;
_nop_();
SPI_LED = 0;
Write_Enable();//写使能函数
_nop_();
_nop_();
// Write_Disable();//写禁止函数
Byte_Write(0xaa,0xaa);//字节写函数
SPI_LED = 1;
// while(1);
// Byte_Read(0x00);//读数据函数
// while(1);
}
void Data_Send(uchar Sdata)//数据传送函数,方便调用
{
uint i;
for(i=8; i>0; i--)
{
  SPI_SCK = 0;
  _nop_();
  _nop_();
  _nop_();
  if(Sdata&0x80)//判断高位是否为1
   SPI_SO = 1;
  else
   SPI_SO = 0;
  _nop_();
  _nop_();
  SPI_SCK = 1;
  Sdata <<= 1;   
}
}
uchar Data_Rece(void)//数据接收函数,方便调用
{
uint i;
uchar Temp_data;
for(i=8; i>0; i--)
{
  SPI_SCK = 1;
  _nop_();
     _nop_();
  _nop_();
  if(SPI_SI)
   Temp_data |= 0x01;
  _nop_();
  _nop_();
    _nop_();
  SPI_SCK = 0;
  Temp_data <<= 1;
}
return Temp_data;
}
void Write_Enable(void)//写使能函数
{
SPI_CS = 0;
_nop_();
Data_Send(0x06);//发送写使能指令
_nop_();
SPI_CS = 1;
}
void Write_Disable(void)//写禁止函数
{
SPI_CS = 0;
_nop_();
Data_Send(0x04);//发送写禁指令
_nop_();
SPI_CS = 1;
}
void Byte_Write(uchar Addr,uchar Wdata)//字节写函数
{
SPI_CS = 0;
_nop_();
Data_Send(0x02);//发送写数据止指令
Data_Send(Addr);
Data_Send(Wdata);
_nop_();
SPI_CS = 1;
}
void Page_Write(uchar Addr,uchar *s)//页写函数
{
SPI_CS = 0;
_nop_();
Data_Send(0x02);//发送写数据指令
Data_Send(Addr);
Data_Send(*s++);
_nop_();
SPI_CS = 1;
}
uchar Byte_Read(uchar Addr)//读数据函数
{
uchar Rdata;
SPI_CS = 0;
_nop_();
Data_Send(0x03);//发送读数据指令
Data_Send(Addr);
Rdata = Data_Rece();
_nop_();
SPI_CS = 1;

return Rdata;
}

25C040_www.ic37.com.pdf

233.6 KB

相关帖子

沙发
NE5532| | 2011-6-13 07:50 | 只看该作者
拿示波器看过波形没?

使用特权

评论回复
板凳
enjier|  楼主 | 2011-6-13 08:39 | 只看该作者
多谢您啦!,刚我又调试了,才发现是电路接错了,不过只能写入不能读出.......正在找问题.

使用特权

评论回复
地板
NE5532| | 2011-6-13 14:33 | 只看该作者
呃,你读不出来怎么知道写入是正确的呢?怀疑中。还是建议示波器。

使用特权

评论回复
5
enjier|  楼主 | 2011-6-13 14:56 | 只看该作者
能够看到的,当在仿真时,按下哲停,然后找到观察窗口,就能看到25c040里面有写入的数据........

使用特权

评论回复
6
NE5532| | 2011-6-13 16:40 | 只看该作者
能够看到的,当在仿真时,按下哲停,然后找到观察窗口,就能看到25c040里面有写入的数据........
enjier 发表于 2011-6-13 14:56


你啥仿真器那么厉害,可以看到外部FLASH里的数据哟?

使用特权

评论回复
7
ic_ic| | 2011-6-13 16:44 | 只看该作者
看看时序,看看是否保护?

使用特权

评论回复
8
zjping0815| | 2013-6-9 17:49 | 只看该作者
IO口模拟3线制SPI有实例不
QQ879733025

使用特权

评论回复
9
浅唱246| | 2014-2-28 11:59 | 只看该作者
zjping0815 发表于 2013-6-9 17:49
IO口模拟3线制SPI有实例不
QQ879733025

把CS硬件接地不就行了嘛

使用特权

评论回复
10
crazy2012| | 2014-2-28 12:39 | 只看该作者
NE5532 发表于 2011-6-13 16:40
你啥仿真器那么厉害,可以看到外部FLASH里的数据哟?

Protues纯软件仿真。玩玩还行。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

4

帖子

1

粉丝