📄 main.c
字号:
/*************************************************************************************************
说明;SPI使用EEPROM存储芯片93C56A,256X8bit=2K的存储空间.在使用SPI通讯时通常使用端口进行仿真,为了符合
使用需要,本程序同样使用了端口进行仿真,当然也可以直接使用88F516自带的SPI总线进行通讯.
串口1用于观测93C56A的读写数据正确与否?写入成功接收到数据R,写入失败接收到数据E,读取成功接收到数据r,
读取失败接收到数据e.
要求:打开拨码开关J6的5,6,7,8,打开拨码开关J4
*************************************************************************************************/
#include <sh88f516.h>
#include <INTRINS.H> //for use 51 instruction
sbit cs_93=P1^4;
sbit di_93=P1^5;
sbit do_93=P1^6;
sbit sk_93=P1^7;
void UART1SendChar(unsigned char value)
{
IEN1 &= 0xFB; //ES1=0;
SBUF1=value; //写SBUF1,激活发送
while(TI1==0); //等待转换结束
TI1=0; //清除发送标志位
IEN1 = 0x04; //ES1=1;
}
/*-----------------------------------------------------
SPI93cXX系列函数调用
void high56(void)--------发送1
void low56(void) --------发送0
void wd56(unsigned char dd) --------写8位数据,输入参数address or data
unsigned char rd56(void) --------读8位数据,返回值data
-----------------------------------------------------*/
void high56(void)
{
di_93=1;
sk_93=1; _nop_();
sk_93=0; _nop_();
}
void low56(void)
{
di_93=0;
sk_93=1;_nop_();
sk_93=0;_nop_();
}
void wd56(unsigned char dd)
{
unsigned char i;
for (i=0;i<8;i++)
{
if (dd>=0x80) high56();
else low56();
dd=dd<<1;
}
}
unsigned char rd56(void)
{
unsigned char i,dd=0;
do_93=1;
for (i=0;i<8;i++)
{
dd<<=1;
sk_93=1;_nop_();
sk_93=0;_nop_();
if (do_93) dd|=1;
}
return(dd);
}
/*-----------------------------------------------------
SPI93c56系列函数调用
void ewen56(void)-----------写使能
unsigned char read93c56_word(unsigned char address) ------------SPI读函数,输入参数为address,返回dat
bit write93c56_word(unsigned char address,unsigned char dat)----SPI写函数,输入参数为address,dat,写入成功返回0,失败返回1
-----------------------------------------------------*/
void ewen56(void)
{
_nop_();
cs_93=1;
high56();
low56();
low56();
//low56();
high56();//add
wd56(0xc0);
//wd56(0x00);
cs_93=0;
}
unsigned char read93c56_word(unsigned char address)
{
unsigned char dat;
cs_93=sk_93=0;
cs_93=1;
high56(); //1 --start
high56(); //1
low56(); //0 --10 read
low56(); //X --A8,
wd56(address); //A7--A0
dat=rd56(); //data
cs_93=0;
return(dat);
}
bit write93c56_word(unsigned char address,unsigned char dat)
{
unsigned char e;
unsigned char temp=address;
e=0;
while (e<3)
{
cs_93=sk_93=0;
cs_93=1;
ewen56();
_nop_();
cs_93=1;
_nop_();
high56(); //1 --start
low56(); //0
high56(); //1 --01 write
low56(); //X --A8,
wd56(address); //A7--A0
wd56(dat); //data
cs_93=0;
_nop_();
cs_93=1;
do_93=1;
while (1)
{
if (do_93==1) break;
}
cs_93=0;
if (read93c56_word(temp)==dat)
{
return(0);
}
e++;
}
return(1);
}
main()
{
unsigned char i;
CLKCON = 0x60; //f=osc/12
SCON1 = 0x50; //工作方式选择,此处为工作方式1
SBRT1 = 0xFF; //波特率设置.工作在方式1时,BAUDRATE=(1/16)*Fsys/(32768-SBRT[1:0]) Fsys=16M
SBRT0 = 0xF7; //Fsys=16M/12
IEN1 = 0x04;
EA = 1;
for(i=0;i<200;i++)
{
if(write93c56_word(i,i)==0)
UART1SendChar('R');
else
UART1SendChar('E');
}
while(1)
{
for(i=0;i<200;i++)
{
if(read93c56_word(i)==i)
UART1SendChar('r');
else
UART1SendChar('e');
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -