📄 main.c
字号:
/*
文件名:main.c
功 能:AT89S52 isp 程序
硬件 : CA-M8(ChipArt-Mega8)
编 译: WinAVR-20040404
时 钟:外部4MHz
更改记录:
2004-11-20
*/
#include <avr/io.h>
#include <avr/delay.h>
#include <avr/signal.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include "usart.h"
#include "lp2004.h"
#define FREQ 4 //系统时钟(MHz)
#define DEVICE_ID 0X69 //器件ID
#define RST PC2
#define SCK PC4
#define MISO PC3
#define MOSI PC5
#define PROGPORT PORTC
#define PROGDDR DDRC
#define PROGPIN PINC
#define SET_RED_LED PORTB&=~_BV(PB1)
#define CLR_RED_LED PORTB|=_BV(PB1)
#define SET_YEL_LED PORTB&=~_BV(PB0)
#define CLR_YEL_LED PORTB|=_BV(PB0)
#define SET_BEEP PORTB|=_BV(PB2)
#define CLR_BEEP PORTB&=~_BV(PB2)
uchar g_aCommand[5]; //接收命令缓冲区
//固件信息数据(至少24字节)
const char g_firmmsg[] PROGMEM = "芯 艺 QQ:27796915 ";
//延时 t ms
void DelayMs(uint t)
{
uint i;
for(i=0;i<t;i++)
_delay_loop_2(FREQ * 250);
}
void DelayBus(void)
{
_delay_loop_1(4);
}
void Beep(uchar n)
{
uchar i;
for(i=0;i<n;i++)
{
DelayMs(200);
SET_BEEP;
DelayMs(200);
CLR_BEEP;
}
}
void ISP_WriteByte(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
if(dat&0x80)
PROGPORT|=_BV(MOSI);
else
PROGPORT&=~_BV(MOSI);
PROGPORT|=_BV(SCK);
DelayBus();
PROGPORT&=~_BV(SCK);
DelayBus();
dat<<=1;
}
}
uchar ISP_ReadByte(void)
{
uchar ret=0;
uchar i;
for(i=0;i<8;i++)
{
ret<<=1;
PROGPORT|=_BV(SCK);
DelayBus();
if(PROGPIN&_BV(MISO))
ret|=1;
PROGPORT&=~_BV(SCK);
DelayBus();
}
return ret;
}//S52编程允许
uchar ProgEnable(void)
{
//MOSI、SCK设为输出
PROGPORT&=~_BV(SCK);
PROGPORT&=~_BV(MOSI);
PROGDDR|=_BV(MOSI);
PROGDDR|=_BV(SCK);
PROGPORT&=~_BV(RST);//RST拉高
DelayMs(100);
ISP_WriteByte(0xac);
ISP_WriteByte(0x53);
ISP_WriteByte(0);
if(ISP_ReadByte()==0x69)
return 1;
else
return 0;
}
//S52复位
void ProgDisable(void)
{
//MOSI、SCK设为输入高阻
PROGPORT&=~_BV(SCK);
PROGPORT&=~_BV(MOSI);
PROGDDR&=~_BV(MOSI);
PROGDDR&=~_BV(SCK);
PROGPORT&=~_BV(RST);//RST拉高
DelayMs(500);
PROGPORT|=_BV(RST);//RST拉低
}
//发送应答命令
void ack(void)
{
uchar *p=UartGetBuffer();
p[0]=LP_ACK;
UartSend(1);
}
//超时检测功能的UART接收例程
uchar UartRecvEx(uint len,uint timeout)
{
uint count=0;
UartRecv(len,UART_NO_WAIT);
while(1)
{
count++;
DelayMs(1);
if(UartIsRecvComplate())
return 1;
if(count>=timeout)
return 0;
}
}
//处理LP_WRITE_FLASH命令例程
void WriteFlash(void)
{
uint i;
uchar j;
uint PacketCount=g_aCommand[1]+(g_aCommand[2]<<8);
uchar *p=UartGetBuffer();
if(!ProgEnable())
{
Beep(2);
return ;
}
for(i=0;i<PacketCount;i+=2)
{
ISP_WriteByte(0x50);
ISP_WriteByte((uchar)(i/2)); //Write address
ack();
if(!UartRecvEx(LP_PACKET_SIZE,2000))
break;
for(j=0;j<LP_PACKET_SIZE;j++)
{
ISP_WriteByte(p[j]);
DelayMs(1);
}
ack();
if(!UartRecvEx(LP_PACKET_SIZE,2000))
break;
for(j=0;j<LP_PACKET_SIZE;j++)
{
ISP_WriteByte(p[j]);
DelayMs(1);
}
}
ack();
DelayMs(300);
ProgDisable();
Beep(1);
}
//处理LP_READ_FLASH命令例程
void ReadFlash(void)
{
uint i;
uchar j,*p;
uint PacketCount=g_aCommand[1]+(g_aCommand[2]<<8);
p=UartGetBuffer();
if(!ProgEnable())
{
Beep(2);
return ;
}
ack();
for(i=0;i<PacketCount;i+=2)
{
ISP_WriteByte(0x30);
ISP_WriteByte(i/2);//Write address
if(!UartRecvEx(1,2000))
break;
for(j=0;j<LP_PACKET_SIZE;j++)
p[j]=ISP_ReadByte();
UartSend(LP_PACKET_SIZE);
if(!UartRecvEx(1,2000))
break;
for(j=0;j<LP_PACKET_SIZE;j++)
p[j]=ISP_ReadByte();
UartSend(LP_PACKET_SIZE);
}
ProgDisable();
Beep(1);
}
//处理LP_WRITE_EEPROM命令例程
void WriteEeprom(void)
{
uint i;
uint PacketCount=g_aCommand[1]+(g_aCommand[2]<<8);
for(i=0;i<PacketCount;i++)
{
ack();
if(!UartRecvEx(LP_PACKET_SIZE,2000))
break;
//请将以下语句替换为写EEPROM的代码
DelayMs(100);
}
ack();
}
//处理LP_READ_EEPROM命令例程
void ReadEeprom(void)
{
uint i;
uchar j,*p;
uint PacketCount=g_aCommand[1]+(g_aCommand[2]<<8);
p=UartGetBuffer();
ack();
for(i=0;i<PacketCount;i++)
{
if(!UartRecvEx(1,2000))
break;
//请将以下语句替换为读EEPROM的代码
for(j=0;j<LP_PACKET_SIZE;j++)
p[j]=0xFF;
UartSend(LP_PACKET_SIZE);
}
}
//处理LP_WRITE_BITS命令例程
void WriteBits(void)
{
uchar tmp;
uchar *p=UartGetBuffer();
if(!ProgEnable())
{
Beep(2);
return ;
}
tmp=0xe0;
if(p[1]&0x01)
tmp|=0x02;
if(p[1]&0x02)
tmp|=0x01;
ISP_WriteByte(0xac);
ISP_WriteByte(tmp);
ISP_WriteByte(0);
ISP_WriteByte(0);
ProgDisable();
ack();
Beep(1);
}
//处理LP_READ_BITS命令例程
void ReadBits(void)
{
uchar c,*p;
p=UartGetBuffer();
if(!ProgEnable())
{
Beep(2);
return ;
}
ISP_WriteByte(0x24);
ISP_WriteByte(0);
ISP_WriteByte(0);
c=ISP_ReadByte();
ProgDisable();
c&=0x1c;
if(c&0x10)
p[1]=0x03;
else if(c&0x08)
p[1]=0x01;
else if(c&0x04)
p[1]=0x02;
else
p[1]=0;
p[0]=LP_READ_BITS;
p[2]=0;
p[3]=0;
p[4]=0;
UartSend(5);
Beep(1);
}
//处理LP_ERASE_DEVICE命令例程
void EraseDevice(void)
{
if(!ProgEnable())
return ;
ISP_WriteByte(0xac);
ISP_WriteByte(0x80);
ISP_WriteByte(0x0);
ISP_WriteByte(0x0);
DelayMs(1000);
ProgDisable();
ack();
Beep(1);
}
//处理LP_RESET_DEVICE命令例程
void ResetDevice(void)
{
ProgDisable();
ack();
Beep(1);
}
//处理LP_READ_FIRMWARE_MSG命令例程
void ReadFirmwareMsg(void)
{
uchar i;
uchar *p=UartGetBuffer();
for(i=0;i<24;i++)
p[i]=pgm_read_byte(g_firmmsg+i);
UartSend(24);
Beep(1);
}
//入口函数
int main(void)
{
uchar i;
uchar *p=UartGetBuffer();
DDRB=_BV(PB0)|_BV(PB1)|_BV(PB2);
PORTB=0X03;
PROGPORT=_BV(RST);
PROGDDR=_BV(RST);
UartInit();
sei();
while(1)
{
CLR_RED_LED;
SET_YEL_LED;
//接收器件ID 或回复器件检测命令
UartRecv(1,UART_WAIT);
CLR_YEL_LED;
SET_RED_LED;
if(p[0]==DEVICE_ID)
{
ack();
}
else if(p[0]==LP_ACK)//LP_SCAN_HARDWAR
{
ack();
continue;
}
else
{
continue;
}
//接收命令
if(!UartRecvEx(5,2000))
continue;
for(i=0;i<5;i++)
g_aCommand[i]=p[i];
switch(g_aCommand[0])
{
case LP_WRITE_FLASH:
WriteFlash();
break;
case LP_READ_FLASH:
ReadFlash();
break;
case LP_WRITE_EEPROM:
WriteEeprom();
break;
case LP_READ_EEPROM :
ReadEeprom();
break;
case LP_ERASE_DEVICE:
EraseDevice();
break;
case LP_WRITE_BITS :
WriteBits();
break;
case LP_READ_BITS:
ReadBits();
break;
case LP_RESET_DEVICE:
ResetDevice();
break;
case LP_READ_FIRMWARE_MSG:
ReadFirmwareMsg();
break;
default:
break;
}//switch
}//while(1)
}//main
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -