?? isp.c
字號:
#ifdef __C51__
#include <reg51.h> /* special function register declarations */#endif
#include "ISP.h"
#include "MAINLOOP.H"
#include <intrins.h>
unsigned char OutBuf[4],InBuf[4];
sbit RST=P1^4;
sbit MISO=P1^5;
sbit MOSI=P1^0;
sbit SCK=P1^1;
sbit LE=P3^2;
sbit OE=P3^1;
void Delay(int time)//Delay(1)延時54us,time每加1則16us
{
int n;
for(n=0;n<=time;n++)//延時
{}
}
void Nop()
{
_nop_();
_nop_();
_nop_();
_nop_();
}
void SetSck(BOOL bLogic)
{
if(bLogic)
SCK=1;
else
SCK=0;
LE=0;
Nop();
LE=1;
}
void SetRst(BOOL bLogic)
{
if(bLogic)
RST=1;
else
RST=0;
LE=0;
Nop();
LE=1;
}
void SetMosi(BOOL bLogic)
{
if(bLogic)
MOSI=1;
else
MOSI=0;
LE=0;
Nop();
LE=1;
}
BOOL GetMiso()//得到MISO引腳的電平
{
LE=0;
Nop();
LE=1;
return MISO;
}
void SckBytes(BYTE nBytes)//通過下載線與器件通信
{
BYTE n;
for(n=0;n<nBytes;n++)
{
SetSck(0);
SetMosi((OutBuf[n] & 0x80));//SCK為低電平時,發送一位
SetSck(1);
if(GetMiso())//SCK為搞電平時,接收一位
{
InBuf[n]=InBuf[n] | 0x80;
}
else
{
InBuf[n]=InBuf[n] & 0x7f;
}
SetSck(0);
SetMosi((OutBuf[n] & 0x40));
SetSck(1);
if(GetMiso())
{
InBuf[n]=InBuf[n] | 0x40;
}
else
{
InBuf[n]=InBuf[n] & 0xbf;
}
SetSck(0);
SetMosi((OutBuf[n] & 0x20));
SetSck(1);
if(GetMiso())
{
InBuf[n]=InBuf[n] | 0x20;
}
else
{
InBuf[n]=InBuf[n] & 0xdf;
}
SetSck(0);
SetMosi((OutBuf[n] & 0x10));
SetSck(1);
if(GetMiso())
{
InBuf[n]=InBuf[n] | 0x10;
}
else
{
InBuf[n]=InBuf[n] & 0xef;
}
SetSck(0);
SetMosi((OutBuf[n] & 0x08));
SetSck(1);
if(GetMiso())
{
InBuf[n]=InBuf[n] | 0x08;
}
else
{
InBuf[n]=InBuf[n] & 0xf7;
}
SetSck(0);
SetMosi((OutBuf[n] & 0x04));
SetSck(1);
if(GetMiso())
{
InBuf[n]=InBuf[n] | 0x04;
}
else
{
InBuf[n]=InBuf[n] & 0xfb;
}
SetSck(0);
SetMosi((OutBuf[n] & 0x02));
SetSck(1);
if(GetMiso())
{
InBuf[n]=InBuf[n] | 0x02;
}
else
{
InBuf[n]=InBuf[n] & 0xfd;
}
SetSck(0);
SetMosi((OutBuf[n] & 0x01));
SetSck(1);
if(GetMiso())
{
InBuf[n]=InBuf[n] | 0x01;
}
else
{
InBuf[n]=InBuf[n] & 0xfe;
}
SetSck(0);
}
}
void PreparePro()//編程前的準備工作
{
SetRst(0);//RST置低電平
SetMosi(0);//MOSI置低電平
SetSck(0);//SCK置低電平
Delay(10);
SetRst(1);
OE=0;
LE=1;
Delay(1000);
OutBuf[0]=0xac;
OutBuf[1]=0x53;
SckBytes(4);
}
void ProOver()//編程結束后的工作
{
SetRst(0);//RST置低電平,這樣單片機就開始運行了
SetMosi(1);
SetSck(1);
OE=1;
}
void Erase()//擦除器件
{
OutBuf[0]=0xac;//根據器件手冊上規定的命令協議
OutBuf[1]=0x80;
SckBytes(4);//向器件發編程命令
Delay(31247); //擦除器件要500ms
}
void ReadSign(unsigned char *pBuf)//讀特征字
{
OutBuf[0]=0x28;//根據器件手冊上規定的命令協議
OutBuf[1]=0x00;
OutBuf[2]=0x00;
OutBuf[3]=0x00;
SckBytes(4);//向器件發編程命令
pBuf[0]=InBuf[3];//第1個特征字
OutBuf[1]=0x01;
SckBytes(4);
pBuf[1]=InBuf[3];//第2個特征字
OutBuf[1]=0x02;
SckBytes(4);
pBuf[2]=InBuf[3];//第3個特征字
}
unsigned char Read(int nAddr)//讀一個單元
{
OutBuf[0]=0x20;//根據器件手冊上規定的命令協議
OutBuf[1]=nAddr/256;//高地址
OutBuf[2]=nAddr%256;//低地址
OutBuf[3]=0x00;
SckBytes(4);//向器件發編程命令
return InBuf[3];
}
BOOL Write(BYTE Data,int nAddr)//寫一個單元
{
// int nTimeOut=0;
OutBuf[0]=0x40;//根據器件手冊上規定的命令協議
OutBuf[1]=nAddr/256;//高地址
OutBuf[2]=nAddr%256;//低地址
OutBuf[3]=Data;
SckBytes(4);//向器件發編程命令
/* while(Read(nAddr)!=Data)//效驗:循環讀,直到讀出與寫入相同的數
{
nTimeOut++;
if(nTimeOut>=1000)//如果超時了,寫入失敗
return FALSE;
}*/
return TRUE;
}
BOOL LockBit(UCHAR nBit)
{
if(nBit>=1)//ComBuf[2]為鎖定位
{
OutBuf[0]=0xac;//根據器件手冊上規定的命令協議
OutBuf[1]=0xe1;
SckBytes(4);
Delay(60);
}
if(nBit>=2)
{
PreparePro();
OutBuf[0]=0xac;//根據器件手冊上規定的命令協議
OutBuf[1]=0xe2;
SckBytes(4);
Delay(60);
}
if(nBit==3)
{
PreparePro();
OutBuf[0]=0xac;//根據器件手冊上規定的命令協議
OutBuf[1]=0xe3;
SckBytes(4);
Delay(60);
}
return TRUE;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -