51RTOS.com 版权所有 Copyright 20006-2009 我爱嵌入式 ( 51RTOS.com ) All rights reserved 沪ICP备09080633号 |
我爱嵌入式系统
//**********************************************************************************
//杨屹 2002/08/20 第一版
//串行flash操作函数(X5045/93LC66B)
//联系方法:gdtyy@ri.gdt.com.cn(2003/07/31以前有效)
//**********************************************************************************
//使用方法:
// 接口函数屏蔽了底层硬件操作,用户只需给出操作命令、起始地址、数据长度、数据指针
//即可操作硬件。
//**********************************************************************************
#include <general.h>
//#include <myconfig51.h>
//#include <SerEEROM.h>
bit Isbit7(unsigned char x)//内部使用,对用户透明
{
x=x&0x80;
if(x==0) return 0;
else return 1;
}
bit Isbit15(unsigned int x)//内部使用,对用户透明
{
x=x&0x8000;
if(x==0) return 0;
else return 1;
}
//X5045
bit opx5045(unsigned char cmd,unsigned int addr,unsigned int len,unsigned char *dat)//X5045操作函数
{
unsigned char i;
unsigned int j;
unsigned char x;
unsigned char adr,a8;
adr=addr;
a8=(addr>>5)&0x8;
switch(cmd){
case WREN:
case WRDI:{
while(sck==0);
while(sck==1);
xcs=0;
for(i=0;i<8;i++){
si=Isbit7(cmd);
cmd=cmd<<1;
while(sck==0);
while(sck==1);
}
xcs=1;
break;}
// case WRDI:{
// break;}
case RDSR:{
while(sck==0);
while(sck==1);
xcs=0;
for(i=0;i<8;i++){
si=Isbit7(cmd);
cmd=cmd<<1;
while(sck==0);
while(sck==1);
}
for(i=0;i<8;i++){
while(sck==0);
x=x<<1;
x=x|so;
while(sck==1);
}
xcs=1;
*dat=x;
break;}
case WRSR:{
x=*dat;
while(sck==0);
while(sck==1);
xcs=0;
for(i=0;i<8;i++){
si=Isbit7(cmd);
cmd=cmd<<1;
while(sck==0);
while(sck==1);
}
for(i=0;i<8;i++){
si=Isbit7(x);
x=x<<1;
while(sck==0);
while(sck==1);
}
xcs=1;
break;}
case READ:{
cmd=cmd&0xF7;
cmd=cmd|a8;
xcs=1;
while(sck==0);
while(sck==1);
xcs=0;
for(i=0;i<8;i++){
si=Isbit7(cmd);
cmd=cmd<<1;
while(sck==0);
while(sck==1);
}
for(i=0;i<8;i++){
si=Isbit7(adr);
adr=adr<<1;
while(sck==0);
while(sck==1);
}
for(j=0;j<len;j++){
for(i=0;i<8;i++){
while(sck==0);
x=x<<1;
x=x|so;
while(sck==1);
}
*(dat+j)=x;
}
xcs=1;
break;}
case WRITE:{
if(len>4) return 0;
cmd=cmd&0xF7;
cmd=cmd|a8;
while(sck==0);
while(sck==1);
xcs=0;
for(i=0;i<8;i++){
si=Isbit7(cmd);
cmd=cmd<<1;
while(sck==0);
while(sck==1);
}
for(i=0;i<8;i++){
si=Isbit7(adr);
adr=adr<<1;
while(sck==0);
while(sck==1);
}
for(j=0;j<len;j++){
x=*(dat+j);
for(i=0;i<8;i++){
si=Isbit7(x);
x=x<<1;
while(sck==0);
while(sck==1);
}
}
xcs=1;
break;}
default:{
return 0;
break;}
}
return 1;
}
//93LC66B
bit op93LC66B(unsigned char cmd,unsigned int addr,unsigned int len,unsigned int *dat)//93LC66B操作函数
{
unsigned char i;
unsigned int j;
unsigned int x;
unsigned char adr,a8;
adr=addr;
a8=(addr>>1)&0x80;
xcs=0;
switch(cmd){
case ERASE:{
while(sck==0);
while(sck==1);
xcs=1;
for(i=0;i<3;i++){
si=Isbit7(cmd);
cmd=cmd<<1;
while(sck==0);
while(sck==1);
}
//si=Isbit7(a8);//9366A
//while(sck==0);//9366A
//while(sck==1);//9366A
for(i=0;i<8;i++){
si=Isbit7(adr);
adr=adr<<1;
while(sck==0);
while(sck==1);
}
xcs=0;
while(sck==0);
while(sck==1);
xcs=1;
while(sck==0);
while(sck==1);
while(so==0);////////
while(sck==0);
while(sck==1);
xcs=0;
break;}
case ERAL:{
while(sck==0);
while(sck==1);
xcs=1;
for(i=0;i<11;i++){//i<12 for 9366A
si=Isbit7(cmd);
cmd=cmd<<1;
while(sck==0);
while(sck==1);
}
xcs=0;
while(sck==0);
while(sck==1);
xcs=1;
while(sck==0);
while(sck==1);
while(so==0);////////
while(sck==0);
while(sck==1);
xcs=0;
break;}
case EWDS:
case EWEN:{
while(sck==0);
while(sck==1);
xcs=1;
for(i=0;i<11;i++){//i<12 for 9366A
si=Isbit7(cmd);
cmd=cmd<<1;
while(sck==0);
while(sck==1);
}
xcs=0;
break;}
case READB:{
while(sck==0);
while(sck==1);
xcs=1;
for(i=0;i<3;i++){
si=Isbit7(cmd);
cmd=cmd<<1;
while(sck==0);
while(sck==1);
}
//si=Isbit7(a8);//9366A
//while(sck==0);//9366A
//while(sck==1);//9366A
for(i=0;i<8;i++){
si=Isbit7(adr);
adr=adr<<1;
while(sck==0);
while(sck==1);
}
for(j=0;j<len;j++){
for(i=0;i<16;i++){//i<8 for 9366A
while(sck==0);
x=x<<1;
x=x|so;
while(sck==1);
}
*(dat+j)=x;
}
xcs=0;
break;}
case WRITEB:{
x=*dat;
while(sck==0);
while(sck==1);
xcs=1;
for(i=0;i<3;i++){
si=Isbit7(cmd);
cmd=cmd<<1;
while(sck==0);
while(sck==1);
}
//si=Isbit7(a8);//9366A
//while(sck==0);//9366A
//while(sck==1);//9366A
for(i=0;i<8;i++){
si=Isbit7(adr);
adr=adr<<1;
while(sck==0);
while(sck==1);
}
for(i=0;i<16;i++){//i<8 for 9366A
si=Isbit15(x);//Isbit7 for 9366A
x=x<<1;
while(sck==0);
while(sck==1);
}
xcs=0;
while(sck==0);
while(sck==1);
xcs=1;
while(sck==0);
while(sck==1);
while(so==0);////////
while(sck==0);
while(sck==1);
xcs=0;
break;}
case WRAL:{
x=*dat;
while(sck==0);
while(sck==1);
xcs=1;
for(i=0;i<11;i++){//i<12 for 9366A
si=Isbit7(cmd);
cmd=cmd<<1;
while(sck==0);
while(sck==1);
}
for(i=0;i<16;i++){//i<8 for 9366A
si=Isbit15(x);//Isbit7 for 9366A
x=x<<1;
while(sck==0);
while(sck==1);
}
xcs=0;
while(sck==0);
while(sck==1);
xcs=1;
while(sck==0);
while(sck==1);
while(so==0);////////
while(sck==0);
while(sck==1);
xcs=0;
break;}
default:{
return 0;
break;}
}
return 1;
}
//extra:init IO port and convert 1bit to 4bit.
void initport(void)//初始化IO端口
{
isin=1;linkok=1;txspeed=1;pow0=1;pow1=1;
}
void opBoardSel(unsigned char num)//板选输出
{
unsigned char i;
bcs=0;
num=num<<4;
while(sck==0);
while(sck==1);
bcs=1;
for(i=0;i<4;i++){
bas=Isbit7(num);
num=num<<1;
while(sck==0);
while(sck==1);
}
bcs=0;
}
51RTOS.com 版权所有 Copyright 20006-2009 我爱嵌入式 ( 51RTOS.com ) All rights reserved 沪ICP备09080633号 |