📄 main.c
字号:
{
Tiny_SendByte(0x50);
Tiny_SendByte(0);
Tiny_SendByte(0);
*fusebit = Tiny_SendByte(0); //send low byte
fusebit ++;
Tiny_SendByte(0x58);
Tiny_SendByte(0x08);
Tiny_SendByte(0);
*fusebit = Tiny_SendByte(0); //send low byte
}
////////////////////////////////////////////////////////////////
void Tiny_WriteLockBit(uchar lockdata)
{
Tiny_SendByte(0xac);
Tiny_SendByte(0xe0);
Tiny_SendByte(0);
Tiny_SendByte(/*0xc0 & */lockdata); //send low byte
// clock_vDelay(200); //delay
}
////////////////////////////////////////////////////////////////
void Tiny_WriteFuseBit(uchar* fusedata)
{
Tiny_SendByte(0xac);
Tiny_SendByte(0xa0);
Tiny_SendByte(0);
Tiny_SendByte(*fusedata++); //send low byte
clock_vDelay(300); //delay
Tiny_SendByte(0xac);
Tiny_SendByte(0xa8);
Tiny_SendByte(0);
Tiny_SendByte(*fusedata); //send low byte
}
////////////////////////////////////////////////////////////////
void Tiny_PowerUp()
{
RST_SET();
PW5V_OFF();
clock_vDelay(50);
SCK_CLR();
RST_CLR();
clock_vDelay(50);
PW5V_ON();
clock_vDelay(200); //20ms
}
//////////////////////////////////////////////////////////////////////////
void main (void)
{
uchar i,j;
uint progdata;
uchar Pack[2];
uchar k,RetValue;
uint m;
uint ReadAddr,ReadCounter;
uint times = 0;
uchar idata buffer[90];
uint ProgStatus = PROGSTATUS_NONE;
uint progcount = 0;
uchar ChipType;
uint PicOscCal;
uint PicConfig[8];
uint PicBandgap;
uint PicOffset;
uchar BufOffset;
uint PackType, PackLen;
uint Tiny_Offset;
uchar TinyLockBit;
uchar TinyFuse[2];
serial_init();
while(1)
{
for(i=0; i<128;i++) //get the package until end
{
while(!RI); //no data receive
buffer[i] = SBUF;
RI = 0;
if( (buffer[i] == '*') &&
(buffer[i - 1] == 'D') &&
(buffer[i - 2] == 'N') &&
(buffer[i - 3] == 'E') )
{
break;
}
}
for(i=0; i<128; i++) //decode the package
{
if( (buffer[i] == 'S') &&
(buffer[i + 1] == 'E') &&
(buffer[i + 2] == 'M') &&
(buffer[i + 3] == 'I') &&
(buffer[i + 4] == 'C') &&
(buffer[i + 5] == 'O') )
{
j = BufOffset = i;
break;
}
}
Pack[0] = buffer[BufOffset + 6];
Pack[1] = buffer[BufOffset + 7];
PackType = Mult(Pack[0], Pack[1]);
switch(PackType)
{
case OPERATE_OK:
ProgStatus = PROGSTATUS_NONE;
if(ChipType == CHIP_PIC16F676)
{
ProgModeCancle();
progcount = 0;
}
break;
case NEED_MCURET:
ProgStatus = PROGSTATUS_NONE;
if(ChipType == CHIP_PIC16F676)
{
ProgModeCancle();
progcount = 0;
}
SendPackage(RETURN_MCURET, 0, NULL);
break;
case TEST_CHIP:
ChipType = CHIP_NONE;
ProgStatus = PROGSTATUS_NONE;
/////////////tiny test handler///////////////////////
if (ChipType == CHIP_NONE)
{
Tiny_PowerUp();
for(i=0; i<3; i++)
{
Tiny_SendByte(0xAC);
Tiny_SendByte(0x53);
RetValue = Tiny_SendByte(0); //if RetValue=0x53
Tiny_SendByte(0);
if(RetValue == 0x53)
{
ChipType = CHIP_ATTINY;
SendPackage(RETURN_CHIP_ATTINY, 12, "Atmel Tiny13");
break;
}
}
}
///////////////pic test handler////////////////////
if (ChipType == CHIP_NONE)
{
for(k=0; k<3; k++)
{
ProgModeSet();
for(m=0; m<0x3ff; m++) //move pointer to 0x3fff
{
ProgIncAddr();
}
PicOscCal = ProgReadCode(); //read the osccal value
ProgCommandSet(PICCMD_LDCONFIG); //send command,move pointer to 0x2000
clock_vDelay(1); //delay
for(i=0; i<16; i++)
{
PGDCLR(); //dat = 0
PGCSET(); //clk = 1
nop();
nop();
PGCCLR(); //clk = 0
}
for(i=0; i<8; i++) ///read 8 words config
{
PicConfig[i] = ProgReadCode();
ProgIncAddr();
}
PicBandgap = PicConfig[7] & 0x3000;
ProgModeCancle();
if(PicConfig[6] == 0x10e0)
{
ChipType = CHIP_PIC16F676;
SendPackage(RETURN_CHIP_PIC, 9, "PIC16F676");
break;
}
}
}
///////////////no chip tested//////////////////////////
if(ChipType == CHIP_NONE)
{
//SendPackage(RETURN_CHIP_NONE, 16, "No Chip Detected");
ChipType = CHIP_PIC16F676;
SendPackage(RETURN_CHIP_PIC, 9, "PIC16F676");
}
break;
case WRITE_CONFIG:
/////////////after finish the program memory write////////////
if(ProgStatus != PackType)
{
ProgStatus = PackType;
ProgModeCancle();
progcount = 0;
ProgModeSet();
}
PackLen = Mult(buffer[BufOffset + 8], buffer[BufOffset + 9]);
progdata = buffer[BufOffset + 10 + 15]; //msb
progdata <<= 8;
progdata += buffer[BufOffset + 10 + 14]; //lsb
ProgWriteConfig(progdata);
for(i=0; i<7; i++)
{
ProgCommandSet(PICCMD_INCADDR);
}
ProgCommandSet(PICCMD_PROGRAM);
clock_vDelay(50); //delay
//////////return status////////////////////
SendPackage(RETURN_WRITE_CONFIG, 0, NULL);
break;
//////////////////////////////////////////////////////////
//tiny handler
//
//////////////////////////////////////////////////////////
case TINY_READ_LOCK:
case TINY_VERIFY_LOCK:
TinyLockBit = Tiny_ReadLockBit();
SendPackage(PackType-1, 1, &TinyLockBit);
break;
case TINY_READ_FUSE:
case TINY_VERIFY_FUSE:
Tiny_ReadFuseBit(TinyFuse);
SendPackage(PackType-1, 2, TinyFuse);
break;
case TINY_PROG_LOCK:
TinyLockBit = buffer[j + 10];
Tiny_WriteLockBit(TinyLockBit);
SendPackage(PackType-1, 0, NULL);
break;
case TINY_PROG_FUSE:
TinyFuse[0] = buffer[j + 10];
TinyFuse[1] = buffer[j + 11];
Tiny_WriteFuseBit(TinyFuse);
SendPackage(PackType-1, 0, NULL);
break;
///////////////////////////////////////////////////////////////
case READ_CONFIG:
if(ProgStatus != PackType)
{
ProgStatus = PackType;
ProgModeCancle();
progcount = 0;
ProgModeSet();
}
PackLen = Mult(buffer[j + 8], buffer[j + 9]); //packlen
ReadAddr = Mult(buffer[j + 10], buffer[j + 11]); //addr to be read
ReadCounter = Mult(buffer[j + 12], buffer[j + 13]); //bytes to be read
buffer[0] = buffer[j + 10];
buffer[1] = buffer[j + 11]; //address to be read
ProgCommandSet(PICCMD_LDCONFIG); //send command.pointer to 0x2000
clock_vDelay(1); //delay
for(i=0; i<16; i++)
{
PGDCLR(); //dat = 0
PGCSET(); //clk = 1
nop();
nop();
nop();
PGCCLR(); //clk = 0
}
for(i=2; i<ReadCounter + 2;)
{
progdata = ProgReadCode();
buffer[i++] = (uchar)(progdata & 0x00ff);//LSB first////////get memory value
buffer[i++] = (uchar)(progdata >> 8);//MSB last////////get memory value
ProgIncAddr();
}
SendPackage(PackType-1, ReadCounter + 2, buffer);
break;
///////////////////////////////////////////////////////////////
case READ_PROGRAM:
case VERIFY_PROGRAM:
if(ProgStatus != PackType)
{
ProgStatus = PackType;
ProgModeCancle();
progcount = 0;
ProgModeSet();
}
PackLen = Mult(buffer[j + 8], buffer[j + 9]);
ReadAddr = Mult(buffer[j + 10], buffer[j + 11]);
ReadCounter = Mult(buffer[j + 12], buffer[j + 13]);
buffer[0] = buffer[j + 10];
buffer[1] = buffer[j + 11]; //address to be read
for(i=2; i<ReadCounter + 2;)
{
////////get 2 byte/////////////////
progdata = ProgReadCode();
buffer[i++] = (uchar)(progdata & 0x00ff);//LSB first////////get memory value
buffer[i++] = (uchar)(progdata >> 8);//MSB last////////get memory value
ProgIncAddr();
}
SendPackage(PackType-1, ReadCounter + 2, buffer);
break;
case READ_EEPROM:
case VERIFY_EEPROM:
if(ProgStatus != PackType)
{
ProgStatus = PackType;
ProgModeCancle();
progcount = 0;
ProgModeSet();
}
PackLen = Mult(buffer[j + 8], buffer[j + 9]);
ReadAddr = Mult(buffer[j + 10], buffer[j + 11]);
ReadCounter = Mult(buffer[j + 12], buffer[j + 13]);
buffer[0] = buffer[j + 10];
buffer[1] = buffer[j + 11]; //address to be read
for(i=2; i<ReadCounter + 2;)
{
////////get 2 byte/////////////////
buffer[i++] = ProgReadEEP();//(uchar)(progdata & 0x00ff);//LSB first////////get memory value
ProgIncAddr();
buffer[i++] = ProgReadEEP();//(uchar)(progdata >> 8);//MSB last////////get memory value
ProgIncAddr();
///////inc address////////////
}
SendPackage(PackType-1, ReadCounter + 2, buffer);
break;
case WRITE_PROGRAM:
if(ProgStatus != PackType)
{
ProgStatus = PackType;
ProgModeCancle();
progcount = 0;
ProgModeSet();
ProgCommandSet(PICCMD_ERASEPM);
clock_vDelay(100); //delay
PicOffset = 0;
}
PackLen = Mult(buffer[j + 8], buffer[j + 9]);
for(i=(j+10); i<(PackLen+j+10); i+=2)//////data to be write to the pm area
{
if(PicOffset == 0x3ff) //OscCal Addr = 0x3ff
{
ProgWriteCode(PicOscCal); //program the OscCal bits
ProgStatus = PROGSTATUS_NONE;
}
else
{
progdata = buffer[i+1]; //msb
progdata <<= 8;
progdata += buffer[i]; //lsb
ProgWriteCode(progdata);
ProgCommandSet(PICCMD_INCADDR);
PicOffset ++;
}
}
//////////return status///////////////////
SendPackage(RETURN_WRITE_PROGRAM, 0, NULL);
break;
case WRITE_EEPROM:
if(ProgStatus != PackType)
{
ProgStatus = PackType;
ProgModeCancle();
progcount = 0;
ProgModeSet();
ProgCommandSet(PICCMD_ERASEEEPROM);
clock_vDelay(100); //delay
}
PackLen = Mult(buffer[j + 8], buffer[j + 9]);
for(i=(j+10); i<(PackLen+j+10);)//////data to be write to the pm area
{
ProgWriteEEProm(buffer[i]);
i++;
ProgCommandSet(PICCMD_INCADDR);
ProgWriteEEProm(buffer[i]);
i++;
ProgCommandSet(PICCMD_INCADDR);
}
//////////return status///////////////////
SendPackage(RETURN_WRITE_EEPROM, 0, NULL);
break;
case TINY_READ_PROGRAM:
case TINY_VERIFY_PROGRAM:
PackLen = Mult(buffer[j + 8], buffer[j + 9]);
ReadAddr = Mult(buffer[j + 10], buffer[j + 11]);
ReadCounter = Mult(buffer[j + 12], buffer[j + 13]);
buffer[0] = buffer[j + 10];
buffer[1] = buffer[j + 11]; //address to be read
ReadAddr >>= 1; // add/2
for(i=2; i<ReadCounter + 2;)
{
buffer[i++] = Tiny_ReadProgram(0, ReadAddr); //////Low Byte
buffer[i++] = Tiny_ReadProgram(1, ReadAddr); //////High Byte
ReadAddr ++;
}
SendPackage(PackType-1, ReadCounter+2, buffer);
break;
case TINY_READ_EEPROM:
case TINY_VERIFY_EEPROM:
PackLen = Mult(buffer[j + 8], buffer[j + 9]);
ReadAddr = Mult(buffer[j + 10], buffer[j + 11]);
ReadCounter = Mult(buffer[j + 12], buffer[j + 13]);
buffer[0] = buffer[j + 10];
buffer[1] = buffer[j + 11]; //address to be read
for(i=2; i<ReadCounter + 2;)
{
buffer[i++] = Tiny_ReadEepRom(ReadAddr ++);
buffer[i++] = Tiny_ReadEepRom(ReadAddr ++);
}
SendPackage(PackType-1, ReadCounter + 2, buffer);
break;
case TINY_PROG_EEPROM:
if(ProgStatus != PackType)
{
Tiny_Offset = 0;
ProgStatus = PackType;
}
PackLen = Mult(buffer[j + 8], buffer[j + 9]);
for(i=(j+10); i<(PackLen+j+10); i+=2)//////data to be write to the pm area
{
uchar temp;
uchar try;
Tiny_WriteEepRom(Tiny_Offset++, buffer[i]);
try = 0;
do
{
temp = Tiny_TestBusy();
try ++;
}while( (temp & 0x01) && (try < 50) ); //wait no busy
Tiny_WriteEepRom(Tiny_Offset++, buffer[i+1]);
try = 0;
do
{
temp = Tiny_TestBusy();
try ++;
}while( (temp & 0x01) && (try < 50) ); //wait no busy
}
SendPackage(RETURN_TINY_PROG_EEPROM, 0, NULL);
break;
case TINY_WRITE_PROGRAM:
if(ProgStatus != PackType)
{
uchar temp;
uchar try = 0;
Tiny_Offset = 0;
ProgStatus = PackType;
Tiny_Erase();
do
{
temp = Tiny_TestBusy();
try ++;
}while( (temp & 0x01) && (try < 50) ); //wait no busy
}
PackLen = Mult(buffer[j + 8], buffer[j + 9]);
for(i=(j+10); i<(PackLen+j+10); i+=2)//////data to be write to the pm area
{
uchar temp;
uchar try = 0;
Tiny_WriteProgram(Tiny_Offset ++, buffer + i); //2 byte
do
{
temp = Tiny_TestBusy();
try ++;
}while( (temp & 0x01) && (try < 50) ); //wait no busy
}
//////////return status///////////////////
SendPackage(RETURN_TINY_WRITE_PROGRAM, 0, NULL);
break;
default:
// lcd_print_string(0x40,"failed ");
break;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -