|
这里仅仅是一个实例程序。用计数值填充LGT的整个FLASH空间的程序。现在已经做好串口ISP,可以上马/自制脱机编程器了。只是熔丝会有点稍稍的麻烦。
这个是51代码。但是事实上只要更换IO操作函数是可以在别的机器上用的。
Test函数中有说明如何写入。
感谢bbsniua网友和goodcode的ISP(反汇编+逻辑分析仪发现退出编程的命令有点问题)以及官方ISP程序。
等到下次回家以后搞定熔丝位。毕竟现在熔丝位看起来很奇怪。貌似不是以明文形式表示的OSCCAL。
OK废话少说上代码:- #include <hwconfig.h>//包含硬件配置
- #include <type-def.h>//包含一些定义
- BYTE OutBuf[5];//发送命令缓冲
- BYTE InBuf[5];//接收缓冲
- //BYTE ComBuf[36];// |SOT|CMD|Data(32bytes)|ChkSum|EOT|
- void SendSPI(BYTE nByte)//用MOSI串行发送命令的同时用MISO接收相关数据
- {
- BYTE n;
- for(n=0;n<nByte;n++)//发送nByte个字节
- {
- //RESET=0;
- ACC=OutBuf[n];
- SCLK=0;
- MOSI=A_7;//低电平时输出一位
- SCLK=1;
- B_7=MISO;//高电平时接收一位
- SCLK=0;
- MOSI=A_6;
- SCLK=1;
- B_6=MISO;
- SCLK=0;
- MOSI=A_5;
- SCLK=1;
- B_5=MISO;
- SCLK=0;
- MOSI=A_4;
- SCLK=1;
- B_4=MISO;
- SCLK=0;
- MOSI=A_3;
- SCLK=1;
- B_3=MISO;
- SCLK=0;
- MOSI=A_2;
- SCLK=1;
- B_2=MISO;
- SCLK=0;
- MOSI=A_1;
- SCLK=1;
- B_1=MISO;
- SCLK=0;
- MOSI=A_0;
- SCLK=1;
- B_0=MISO;
- SCLK=0;
- InBuf[n]=B;
- //RESET=1;
- }
- }
- void Delay(BYTE n)
- {//不精确延时
- while(n--);
- }
- BOOL CheckAck() //检查
- {
- if(InBuf[3]!=0x55) return FALSE;
- if(InBuf[4]!=0xAA) return FALSE;
- return TRUE;
- }
- BOOL Reset_Target()
- {//重启目标
- SCLK=0;
- MOSI=0;
- MISO=1;
- Delay(1);
- RESET=0;
- Delay(255);
- OutBuf[0]=0xE0;//开启编程
- OutBuf[1]=0x5A;
- OutBuf[2]=0xA5;
- OutBuf[3]=0xAA;
- OutBuf[4]=0x00;
- SendSPI(5);//发送数据
- if(InBuf[4]!=0x5A) return FALSE;
- return TRUE;
- }
- void Read_8F08(BYTE Bank,BYTE Addr)
- {
- OutBuf[0]=0xB8;
- OutBuf[1]=Addr;
- OutBuf[2]=Bank;
- OutBuf[3]=0x00;
- OutBuf[4]=0x00;
- SendSPI(5);
- OutBuf[0]=0xBC;
- SendSPI(5);
- //And you got it in InBuf[3],InBuf[4]
- }
- BOOL Write_8F08(BYTE Bank,BYTE Addr)
- {
- OutBuf[0]=0x90;
- OutBuf[1]=0xC0 | Addr ;//B1000 0000 Or Addr
- OutBuf[2]=Bank;
- //OutBuf[3]
- //OutBuf[4]//送入数据
- SendSPI(5);
- if(!CheckAck()) return FALSE;
- OutBuf[0]=0x98;
- SendSPI(5);
- if(!CheckAck()) return FALSE;
- OutBuf[0]=0x90;
- SendSPI(5);
- if(!CheckAck()) return FALSE;
- return TRUE;
- }
- BOOL Erase_8F08()
- {
-
- OutBuf[0]=0xB8;
- OutBuf[1]=0x3F;
- OutBuf[2]=0x07;
- OutBuf[3]=0x00;
- OutBuf[4]=0x00;
- SendSPI(5);
-
- OutBuf[0]=0xBC;
- SendSPI(5);
-
- OutBuf[0]=0xA0;
- OutBuf[1]=0x00;
- OutBuf[2]=0x00;
- SendSPI(5);
- Delay(10);
- //清除标志位,RDY
-
- //----EARSE
- OutBuf[0]=0x93;
- OutBuf[1]=0x00;
- OutBuf[2]=0x00;
- OutBuf[3]=0x00;
- OutBuf[4]=0x00;
- SendSPI(5);
- if(!CheckAck()) return FALSE;
- OutBuf[1]=0x40;
- SendSPI(5);
- if(!CheckAck()) return FALSE;
- Delay(255);Delay(255);Delay(255);Delay(255);
- OutBuf[0]=0x91;
- SendSPI(5);
- if(!CheckAck()) return FALSE;
- OutBuf[1]=0x00;
- SendSPI(5);
- if(!CheckAck()) return FALSE;
- OutBuf[0]=0x80;
- SendSPI(5);
- if(!CheckAck()) return FALSE;
- Delay(255);//保险延时
- return TRUE;
- }
- BOOL Prep_W8F08(BYTE Bank,BYTE Addr)
- {
- /*MOSI 90 80 00 00 00
- MISO AA AA AA 55 AA
- MOSI 90 C0 00 00 00
- MISO AA AA AA 55 AA*/
- OutBuf[0]=0x90;
- OutBuf[1]=0x80 | Addr;
- OutBuf[2]=Bank;
- OutBuf[3]=0x00;
- OutBuf[4]=0x00;
- SendSPI(5);
- if(!CheckAck()) return FALSE;
- //OutBuf[0]=0x90;
- OutBuf[1]=0xC0 | Addr;
- SendSPI(5);
- if(!CheckAck()) return FALSE;
- return TRUE;
- }
- BOOL Stop_W8F08(BYTE Bank,BYTE Addr)
- {
- /*MOSI 90 80 00 00 00
- MISO AA AA AA 55 AA
- MOSI 90 C0 00 00 00
- MISO AA AA AA 55 AA*/
- OutBuf[0]=0x90;
- OutBuf[1]=Addr | 0x40;
- OutBuf[2]=Bank;
- //OutBuf[3]=0x00;
- //OutBuf[4]=0x00;
- SendSPI(5);
- if(!CheckAck()) return FALSE;
- //OutBuf[0]=0x90;
- OutBuf[1]=Addr;
- SendSPI(5);
- if(!CheckAck()) return FALSE;
- OutBuf[0]=0x80;
- SendSPI(5);
- if(!CheckAck()) return FALSE;
- return TRUE;
- }
- void Stop_R8F08()
- {
- OutBuf[0]=0xA0;
- OutBuf[1]=0x00;
- OutBuf[2]=0x00;
- OutBuf[3]=0x00;
- OutBuf[4]=0x00;
- SendSPI(5);
- }
- void Test()
- {
- BYTE addr,page,cyc,test=0;
- if(!Reset_Target()) return;
-
- OutBuf[0]=0xE5;
- OutBuf[1]=0x53;
- OutBuf[2]=0x35;
- OutBuf[3]=0x5E;
- OutBuf[4]=0x00;
- SendSPI(5);
- SendSPI(5);
- //写8K
- /*
- if(!Erase_8F08()) return;
- Delay(100);
- for(page=0;page<=0x7F;page++)
- {//
- for(cyc=0;cyc<8;cyc++)
- {
- addr=0;
- if(!Prep_W8F08(page,cyc*4)) return;
- for(;addr<4;addr++)
- {
- OutBuf[3]=test+1;
- OutBuf[4]=test;
- test+=2;
- if(!Write_8F08(page,cyc*4+addr)) return;
- }
- addr--;
- if(!Stop_W8F08(page,cyc*4+addr)) return;
- Delay(255);
- }
- Delay(255);
- }
- Delay(255);
- */
- Delay(255);Delay(255);Delay(255);Delay(255);
- Delay(255);Delay(255);Delay(255);Delay(255);
- Delay(255);Delay(255);Delay(255);Delay(255);
- Delay(255);Delay(255);Delay(255);Delay(255);
- Delay(255);Delay(255);Delay(255);Delay(255);
- //读8K
- for(page=0;page<=0x7F;page++)
- {//
- for(cyc=0;cyc<8;cyc++)
- {
- addr=0;
- for(;addr<4;addr++)
- {
- Read_8F08(page,cyc*4+addr);
- }
- addr--;
- Stop_R8F08();
- Delay(255);
- }
- Delay(255);
- }
- Delay(255);
-
- }
- //=============主函数,无返回值与输入值
- void main()
- {//主函数
- //OutBuf[0]=0x00;
- //OutBuf[1]=0xFF;
- Test();
- RESET=1;
- SCLK=1;
- MOSI=1;
- /*SCLK=0;
- MOSI=0;
- MISO=1;
- //Delay(255);
- RESET=0;
- Delay(255);
- OutBuf[0]=0xE0;
- OutBuf[1]=0x5A;
- OutBuf[2]=0xA5;
- OutBuf[3]=0xAA;
- OutBuf[4]=0x00;
- SendSPI(5);
- RESET=1;
- SCLK=1;
- MOSI=1;*/
- /*OutBuf[0]=0xE5;
- OutBuf[1]=0x53;
- OutBuf[2]=0x35;
- OutBuf[3]=0x5E;
- OutBuf[4]=0x00;*/
- while(1)
- {
- //SendSPI(5);
- //Delay(100);
- }
- }
复制代码 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!
|