#include "reg51.h"
sbit SPICS = P1^0 ;
sbit SPISK = P1^1 ;
sbit SPIDI = P1^2 ;
sbit SPIDO = P1^3 ; //定义IO
void delay ( unsigned int timeM ) //延时子程序(ms)
{ unsigned int count;
TH0 = 0x06 ;
TL0 = 0x06 ;
TMOD = 0x02 ;
TF0 = 0 ;
TR0 = 1 ;
for ( ; timeM > 0 ; timeM-- )
{ for ( count=4 ; count>0 ; )
if ( TF0 ) { count-- ;
TF0 = 0;
}
}
}
void SPIstart ( void ) //初始化SPI总线
{ SPICS = 0 ; SPISK = 0 ;
SPIDI = 1 ;
SPIDO = 1 ;
delay ( 10 ) ; //延时10MS
return ;
}
void SPIewen ( void ) //写允许
{ unsigned char command , count;
SPIstart () ; //初始化SPI总线
SPICS = 1 ; //片选
SPISK = 1 ; // DI=1 ,SK= 1 ,总线开始位为高电平
someNOP() ; //等待稳定
SPISK = 0 ;
SPIDI = 0 ;
SPISK = 1 ; // 输入数据0
someNOP() ;
SPISK = 0 ;
SPISK = 1 ; //输入数据0
someNOP() ;
SPISK = 0 ; // 写允许命令高三位输入完毕,100
command = 0xC0 ; // 低七位 11*****
for ( count = 0 ; count < 7 ; count ++ ) //输入低7位
{ if ( command & 0x80 ) SPIDI = 1 ;
else SPIDI = 0 ;
command <<= 1 ;
SPISK = 1 ;
someNOP() ;
SPISK = 0 ;
}
SPICS = 0 ; // 片选下拉
delay ( 10 ) ; //延时10MS
return ;
}
void SPIwrite ( unsigned char address , unsigned int wdata )//写SPI总线
{ unsigned char count , waddress ;
unsigned int databuf ;
waddress = address , databuf = wdata ;
SPIewen () ; //写允许
SPIstart () ; //重新初始化SPI总线
SPICS = 1 ; //片选
SPISK = 1 ; //开始位1 ,DI= 1
someNOP() ;
SPISK = 0 ;
SPIDI = 0 ;
SPISK = 1 ; //输入数据0
someNOP() ;
SPISK = 0 ;
SPIDI = 1 ;
SPISK = 1 ; //输入数据1
someNOP() ;
SPISK = 0 ; //命令高三位101输入完毕
for ( count = 0 ; count < 7 ; count ++ ) //输入低7位地址
{ if ( waddress & 0x80 ) SPIDI = 1 ;
else SPIDI = 0 ;
waddress <<= 1 ;
SPISK = 1 ;
someNOP() ;
SPISK = 0 ;
}
for ( count = 0 ; count < 8 ; count ++ ) //输入8位数据
{ if ( databuf & 0x80 ) SPIDI = 1 ;
else SPIDI = 0 ;
databuf <<= 1 ;
SPISK = 1 ;
someNOP() ;
SPISK = 0 ;
}
SPICS = 0 ; //片选下拉
delay ( 10 ) ; //延时10MS
return ;
}
unsigned char SPIread ( unsigned char address ) //读SPI总线
{ unsigned char count , waddress ;
unsigned int wdata ;
waddress = address ;
SPIstart () ; //初始化SPI总线
SPICS = 1 ; //片选
SPISK = 1 ; //输入开始位1
someNOP() ;
SPISK = 0 ;
SPISK = 1 ; //输入1
someNOP() ;
SPISK = 0 ;
SPIDI = 0 ; SPISK = 1 ; //输入0
someNOP() ;
SPISK = 0 ; //读命令高三位110输入完毕
for ( count = 0 ; count < 7 ; count ++ ) //输入低7位地址
{ if ( waddress & 0x80 ) SPIDI = 1 ;
else SPIDI = 0 ;
waddress <<= 1 ;
SPISK = 1 ;
someNOP() ;
SPISK = 0 ;
}
SPIDO = 1 ; // 地址输入完毕,准备接收数据
someNOP () ;
for ( count = 0 ; count < 8 ; count ++ ) //开始接收数据
{ SPISK = 1 ;
someNOP() ;
SPISK = 0 ;
wdata <<= 1 ;
if ( SPIDO == 1 ) wdata = wdata + 1 ;
}
SPICS = 0 ;
return ( wdata );
} void main()
{ unsigned char buf [ 8 ] ;
SPIwrite ( 0x00 , 0x00 ) ; //写地址0X00,数据为0X00
buf [ 0 ] = SPIread ( 0x00 ) ; // 读地址0X00,结果读出的数据却不是0X00,却是0XFF???????why??why??why??why??why??why??
}
读了N多次DATASHEET 没有发现我哪有做错啊?只得前来请大虾指点!!!
|