|
最近因需要,51上外挂一块sram,型号23a640 64k,
调试有点小问题,大家一起讨论啊!
先上程序:
//******************************************************
void waite(uint i)
{
uint j;
for(j = 0 ; j < i ; j++);
}
//******************************************************
// 23A640初始化信号
//******************************************************
void SPI_init()
{
CS=1;
SCK=SH;
SI=SH;
SO=SH;
}
//******************************************************
// 23A640开始信号
//******************************************************
void start()
{
CS=0;
}
//*********************************************************
// 23A640停止信号
//*********************************************************
void stop()
{
CS=1;
}
//*********************************************************
// 写一个字节命令程序
//*********************************************************
void W_ORDE(uchar j)
{
uchar i,temp;
temp = j;
for (i = 0 ; i <= 7 ; i++)
{
SCK=SL;
waite(time);
if(temp & 0x80) SI = SH;
else SI = SL;
temp = temp << 1;
waite(time);
SCK=SH;
waite(time);
}
SCK=SL;
waite(time*3);
}
//*********************************************************
// 写一个字节命令程序
//*********************************************************
void W_DATA(uchar j)
{
uchar i,temp;
temp = j;
for (i = 0 ; i <= 7 ; i++)
{
SCK=SL;
waite(time);
if(temp & 0x80 ) SI = SH;
else SI = SL;
temp = temp << 1;
waite(time);
SCK=SH;
waite(time);
}
SCK=SL;
waite(time*3);
}
//*********************************************************
// 读一个字节程序
//*********************************************************
uchar R_DATA()
{
uchar i,j,k=0;
SCK=SL; waite(time);
for (i=0;i<8;i++)
{
waite(time);
SCK=SH;
if (SO==1) j=1;
else j=0;
k=(k<<1)|j;
waite(time);
SCK=SL;
}
waite(time*3);
return(k);
}
//*********************************************************
// 写16位地址程序
//*********************************************************
void W_ADRESS(uint address)
{
uint temp;
uchar i;
temp = address;
for (i = 0 ; i <= 15 ; i++)
{
SCK=SL;
waite(time);
if(temp & 0x8000) SI = SH;
else SI = SH;
temp = temp << 1;
waite(time);
SCK=SH;
waite(time);
}
SCK=SL;
waite(time*3);
}
//********************************************************
// 从23A640的地址address 中读取一个字节数据
//*********************************************************
uchar SPI640_read(uint address)
{
uchar i;
start();
W_ORDE(0x03); //0000 0011读指令
W_ADRESS(address);
i=R_DATA();
stop();
return(i);
}
//*********************************************************
// 向23A640的address地址中写入一字节数据info
//*********************************************************
void SPI640_write(uint address,uchar info)
{
start();
W_ORDE(0x02); //0000 0010写指令
W_ADRESS(address);
W_DATA(info);
stop();
} |
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|