📄 avricp.c
字号:
}
/*--------------------------------------------------------------------------*/
/* turn LED on */
/*--------------------------------------------------------------------------*/
inline void Programer_LED_On(void)
{
PORTA&=_CV(MON_LED);
}
inline void Host_LED_On(void)
{
PORTA&=_CV(HOST_LED);
}
/*--------------------------------------------------------------------------*/
/* turn LED off */
/*--------------------------------------------------------------------------*/
inline void Programer_LED_Off(void)
{
PORTA|=_BV(MON_LED);
}
inline void Host_LED_Off(void)
{
PORTA|=_BV(HOST_LED);
}
/*--------------------------------------------------------------------------*/
/* UART initial setting (19200bps,8,1,N) */
/*--------------------------------------------------------------------------*/
#define VALUE_UBRR (F_CPU/(19200*16L)-1)
void InitUART(void)
{
UBRRH = (unsigned char)(VALUE_UBRR>>8);
UBRRL = (unsigned char)(VALUE_UBRR);
//接收使能、发送使能
UCSRB=(1<<RXEN)|(1<<TXEN);
return;
}
/*--------------------------------------------------------------------------*/
/* delay 128us */
/*--------------------------------------------------------------------------*/
void delay(int t)
{
unsigned int i;
for(i=0;i<t;i++)
{
_delay_loop_2(32 * F_CPU/1000000L);
}
}
/*--------------------------------------------------------------------------*/
/* delay 1us t<=85 */
/*--------------------------------------------------------------------------*/
#define wait_1us(t) _delay_loop_1(((F_CPU/1000000L)/3+1)*t);
/*--------------------------------------------------------------------------*/
/* delay 1ms */
/*--------------------------------------------------------------------------*/
void wait_1ms(int t)
{
unsigned int i;
for(i=0;i<t;i++)
{
_delay_loop_2(250 * F_CPU/1000000L);
}
}
/*--------------------------------------------------------------------------*/
/* delay forAT89C51/52 */
/*--------------------------------------------------------------------------*/
#define F_AT89C51 18432000L
#define Time48Tclcl() wait_1us(48*1000000L/F_AT89C51+1)
void Wait51(unsigned char msecond)
{
//asm("nop");
//asm("nop");
//asm("nop");
//asm("nop");
unsigned char m;
m=msecond;
do{delay(8);m--;}while(!(PINA & _BV(RDY51)) && m);
return;
}
/*--------------------------------------------------------------------------*/
/* UART send a byte */
/*--------------------------------------------------------------------------*/
void putc(uchar c)
{
while( !(UCSRA & (1<<UDRE)) );
UDR=c;
}
/*--------------------------------------------------------------------------*/
/* UART receive a byte */
/*--------------------------------------------------------------------------*/
uchar getc(void)
{
while( !(UCSRA & (1<<RXC)) );
return UDR;
}
/*--------------------------------------------------------------------------*/
/* UART send a memory block */
/*--------------------------------------------------------------------------*/
void putcmem(uchar *mem,uchar length)
{
uchar *pmem,len;
pmem=mem,len=length;
while(len)
{
putc(*pmem++);
len--;
}
}
/*--------------------------------------------------------------------------*/
/* UART send a string */
/*--------------------------------------------------------------------------*/
void putcstr(uchar *str)
{
putcmem(str,strlen(str));
}
/*--------------------------------------------------------------------------*/
/* SPI Clock */
/*--------------------------------------------------------------------------*/
void SPIClock(void)
{
PORTB|=_BV(TARGET_SCK);
asm("nop");
asm("nop");
asm("nop");
PORTB&=_CV(TARGET_SCK);
asm("nop");
asm("nop");
asm("nop");
return;
}
/*--------------------------------------------------------------------------*/
/* SPI write */
/*--------------------------------------------------------------------------*/
unsigned char SPIWrite(unsigned char c)
{
unsigned char i, rx;
Programer_LED_On();
i = 0x80;
rx = 0x00;
do {
if (c & i)
{
PORTB|=_BV(TARGET_MOSI);
}
else
{
PORTB&=_CV(TARGET_MOSI);
}
if ((PINB & _BV(TARGET_MISO))!=0) //if (bit_is_set(PINB, TARGET_MISO))
{
rx |= i;
}
SPIClock();
i >>= 1;
} while (i);
Programer_LED_Off();
return rx;
}
/*--------------------------------------------------------------------------*/
/* SPI read */
/*--------------------------------------------------------------------------*/
inline unsigned char SPIRead(void)
{
return SPIWrite(0x00);
}
/*--------------------------------------------------------------------------*/
/* SPI Init */
/*--------------------------------------------------------------------------*/
void SPIInit(unsigned char device)
{
InitPortForSPI();
PORTB&=_CV(TARGET_SCK);
SetReset();
delay(0xff);
ClrReset();
delay(0xff);
SPIWrite(0xAC);
SPIWrite(0x53);
if (0x20 <= device && device <= 0x7F)
{
unsigned char count;
count=32;
do{
if (SPIRead() == 0x53)
{
break;
}
SPIWrite(0x00);
SPIClock();
SPIWrite(0xAC);
SPIWrite(0x53);
}while(--count);
}
else
{
SPIWrite(0x00);
}
SPIWrite(0x00);
delay(0x10);
return;
}
/*--------------------------------------------------------------------------*/
/* SPI Init FOR AT89C51/52 */
/*--------------------------------------------------------------------------*/
void SPIInitAT89S(unsigned char device)
{
InitPortForSPI();
PORTB&=_CV(TARGET_SCK);
SetReset();
delay(0xff);
//ClrReset();
//delay(0xff);
SPIWrite(0xAC);
SPIWrite(0x53);
if (G_device == AT89S51 || G_device == AT89S52)
{
unsigned char count;
count=32;
do{
if (SPIRead() == 0x69)
{
break;
}
SPIWrite(0x00);
SPIClock();
SPIWrite(0xAC);
SPIWrite(0x53);
}while(--count);
}
else
{
SPIWrite(0x00);
}
SPIWrite(0x00);
delay(0x10);
return;
}
/*--------------------------------------------------------------------------*/
/* Parallel Init */
/*--------------------------------------------------------------------------*/
void ParallelInit(unsigned char device)
{
InitPortForParallel();
if(device == AT89C51)
{
OutP2(0x00);
OutP3(0x00);
OutCON(0x00);
SetVPP5V();
}
//delay(0x10);
return;
}
/*--------------------------------------------------------------------------*/
/* +-------------+------------+------+ */
/* Commands | Host writes | Host reads | | */
/* -------- +-----+-------+------+-----+ | */
/* | ID | data | data | | Note | */
/* +-----------------------------------+-----+-------+------+-----+------+ */
/* | Enter programming mode | 'P' | | | 13d | 1 | */
/* | Report autoincrement address | 'a' | | | 'Y' | | */
/* | Set address | 'A' | ah al | | 13d | 2 | */
/* | Write program memory, low byte | 'c' | dd | | 13d | 3 | */
/* | Write program memory, high byte | 'C' | dd | | 13d | 3 | */
/* | Issue Page Write | 'm' | | | 13d | | */
/* | Read program memory | 'R' | |dd(dd)| | 4 | */
/* | Write data memory | 'D' | dd | | 13d | | */
/* | Read data memory | 'd' | | dd | | | */
/* | Chip erase | 'e' | | | 13d | | */
/* | Write lock bits | 'l' | dd | | 13d | | */
/* | Write fuse bits | 'f' | dd | | 13d | 11 | */
/* | Read fuse bits | 'F' | | dd | | 11 | */
/* | Leave programming mode | 'L' | | | 13d | 5 | */
/* | Select device type | 'T' | dd | | 13d | 6 | */
/* | Read signature bytes | 's' | | 3*dd | | | */
/* | Return supported device codes | 't' | | n*dd | 00d | 7 | */
/* | Return software identifier | 'S' | | s[7] | | 8 | */
/* | Return sofware version | 'V' | |dd dd | | 9 | */
/* | Return hardware version | 'v' | |dd dd | | 9 | */
/* | Return programmer type | 'p' | | dd | | 10 | */
/* | Set LED | 'x' | dd | | 13d | 12 | */
/* | Clear LED | 'y' | dd | | 13d | 12 | */
/* | Universial command | ':' | 3*dd | dd | 13d | | */
/* | New universal command | '.' | 4*dd | dd | 13d | | */
/* | Special test command | 'Z' | 2*dd | dd | | | */
/* +-----------------------------------+-----+-------+------+-----+------+ */
/* | Read lock bits | 'r' | | dd | | | */
/* | Read high fuse bits | 'N' | | dd | | | */
/* | Read extended fuse bits | 'Q' | | dd | | | */
/* | Write high fuse bits | '.' |ACA8 2d| | 13d | | */
/* | Write extended fuse bits | '.' |ACA4 2d| | 13d | | */
/* +-----------------------------------+-----+-------+------+-----+------+ */
/* | Check block support | 'b' | |"Y"2*dd | | */
/* | Start block flash load | 'B' |2*dd"F"| | 13d | | */
/* | | | n*dd | | | | */
/* | Start block eeprom load | 'B' |2*dd"E"| | 13d | | */
/* | | | n*dd | | | | */
/* | Start block flash read | 'g' |2*dd"F"| n*dd | 13d | | */
/* | Start block eeprom read | 'g' |2*dd"E"| n*dd | 13d | | */
/* +-----------------------------------+-----+-------+------+-----+------+ */
/* +-----------------------------------+-----+-------+------+-----+------+ */
/* | ID | host | programer | Note | */
/* | Enter programming mode | 'P' | | | 13d | 1 | */
/* +-----------------------------------+-----+-------+------+-----+------+ */
void Enter_programming_mode(void)
{
if(G_device < 0x80)SPIInit(G_device);
else
if(G_device == AT89C51 || G_device == AT89C52)ParallelInit(G_device);
else
if(G_device == AT89S51 || G_device == AT89S52)SPIInitAT89S(G_device);
G_pgmode = TRUE;
putc(13);
return;
}
/* +-----------------------------------+-----+-------+------+-----+------+ */
/* | | ID | host | programer | Note | */
/* | Report autoincrement address | 'a' | | | 'Y' | | */
/* +-----------------------------------+-----+-------+------+-----+------+ */
void Report_autoincrement_address(void)
{
putc('Y');
return;
}
/* +-----------------------------------+-----+-------+------+-----+------+ */
/* | | ID | host | programer | Note | */
/* | Set address | 'A' | ah al | | 13d | 2 | */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -