|
/******************************************************************
AT93C56程序的读写测试 ,此程序是以8位结构的存储器为例
PIN1 = CS
PIN2 = SK
PIN3 = DI 主设备数据输入,从设备数据输出
PIN4 = DO 主设备数据输出,从设备数据输入
PIN5 = GND
PIN6 = ORG
PIN7 = NC
PIN8 = VCC
VCC NC ORG GND
__|______|______|_____|_
| |
| |
| AT93C56 |
| . |
|________________________|
| | | |
CS SK DI DO
ORG=1 内部是16位结构的存储器 128*16
ORG=0 内部是8位结构的存储器 256*8
本实验已经将ORG硬件接地了,即选择芯片内部是8位结构的存储器,256*8
2K容量
******************************************************************/
sbit SPI_CS = P2^4;
sbit SPI_CK = P2^5;
sbit SPI_DI = P2^6;
sbit SPI_DO = P2^7;
/******************************************
名称:START_93cxx()
说明:用于93CXX的启动,防止由于CS的改动而引起的时序混乱
起始条件:SC与DI在CK首个上升沿的时候,且SC与DI都为高,器件视之为起始位
*********************************************/
void START_93cxx_SWS()
{
SPI_DO = 1; //防止DO 由于是低电平而无法输入//
SPI_CS = 1;
Delay_us(1);
SPI_CS = 0;
SPI_DI = 0;
SPI_CK = 0;
SPI_CS = 1;
Delay_us(2);
}
/******************************************
名称:END_93cxx()
说明:用于93CXX的停止,防止由于CS的改动而引起的时序混乱
*********************************************/
void END_93cxx_SWS()
{
SPI_CS = 0;
SPI_DI = 1;
SPI_CK = 1;
}
void SEND_DATA_93cxx_SWS(uchar Op_data,numbyte)
{
unsigned char temp;
for(temp=0;temp<numbyte;temp++)
{
if((Op_data & 0x80))
SPI_DI = 1;
else SPI_DI = 0;
SPI_CK = 1;
SPI_CK = 0;
Op_data <<= 1;
}
}
/******************************************
名称:EWEN_93cxx()
说明:93CXX的编程启动,操作码(100 11XXXXXXX)
送入的操作码及控制码的总共位数一位也不能少,切忌
*********************************************/
void EWEN_93cxx_SWS()
{
START_93cxx_SWS();
SEND_DATA_93cxx_SWS(0X98,8); //送入3 位操作码+11// ok
SEND_DATA_93cxx_SWS(0X00,4); //送入操作码的扩展码
END_93cxx_SWS();
}
/******************************************
名称:EWDS_93cxx()
说明:93CXX的编程关闭,操作码(100 00XXXXXXX) ,操作码与控制码的总共位数不能够少
*********************************************/
void EWDS_93cxx_SWS()
{
START_93cxx_SWS();
SEND_DATA_93cxx_SWS(0X80,8); //送入三位操作码/扩展码
SEND_DATA_93cxx_SWS(0X00,4); //送入操作码的扩展码
END_93cxx_SWS();
}
/******************************************
名称:Write_Eeprom(unsigned char addr,unsigned char dat)
说明:addr是要写入的地址,dat是要写入的数据,操作码(101 xxxxxxxx)
*********************************************/
T_Bit Write_Eeprom_SWS(unsigned char addr,unsigned char dat)
{
unsigned char Eep_data=0;
unsigned int i=0;
EWEN_93cxx_SWS(); //允许写动作开启
START_93cxx_SWS();
SEND_DATA_93cxx_SWS(0xa0,4); //送入三位写操作码 +0 ,只传高4位,
SEND_DATA_93cxx_SWS(addr,8); //送入要写入的地址码
SEND_DATA_93cxx_SWS(dat,0X08); //送入要写入的数据
SPI_CS = 0;
Delay_us(1);
SPI_CS = 1;
i=65000; //设置一个最大延时等待数值
while(!SPI_DO)
{
i = i-1;
if(i==0)
{
return ERROR; //等待最大延时后,说明擦除失败
}
}
END_93cxx_SWS();
EWDS_93cxx_SWS();
return OK;
}
/******************************************
名称:Read_Eeprom(unsigned char addr)
说明:addr是要读取的地址,操作码(110 xxxxxxxxx)
*********************************************/
uchar Read_Eeprom_SWS(unsigned char addr)
{
unsigned char Eep_data=0,i=0;
START_93cxx_SWS();
SEND_DATA_93cxx_SWS(0xc0,4); //送入三位读操作码 +0 ,只传高4位,
SEND_DATA_93cxx_SWS(addr,8); //送入读的地址码
for(i=0;i<8;i++)
{
Eep_data <<= 1;
SPI_CK = 1;
Delay_us(1);
SPI_CK = 0;
if(SPI_DO==1)
Eep_data |= 0X01;
}
END_93cxx_SWS();
return Eep_data;
}
/******************************************
名称:ERASE_ALL_Eeprom()
说明:93CXX的全部擦除程序,操作码(100 10xxxxxxx),操作码与控制码的总共位数不能够少
*********************************************/
T_Bit ERASE_ALL_Eeprom_SWS()
{
unsigned int i=0;
EWEN_93cxx_SWS(); //允许写动作开启
START_93cxx_SWS();
SEND_DATA_93cxx_SWS(0X90,8); //送入三位写操作码及扩展码
SEND_DATA_93cxx_SWS(0X00,4); //送入剩余的扩展码
SPI_CS = 0;
Delay_us(1); //delay 250ns//
SPI_CS = 1;
i=50000;
while(!SPI_DO)
{
i=i-1;
if(i==0)
{
return ERROR;
}
}
END_93cxx_SWS();
EWDS_93cxx_SWS();
return OK;
} |
阿莫论坛20周年了!感谢大家的支持与爱护!!
如果天空是黑暗的,那就摸黑生存;
如果发出声音是危险的,那就保持沉默;
如果自觉无力发光,那就蜷伏于牆角。
但是,不要习惯了黑暗就为黑暗辩护;
也不要为自己的苟且而得意;
不要嘲讽那些比自己更勇敢的人。
我们可以卑微如尘土,但不可扭曲如蛆虫。
|