⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uart-spi-730.c

📁 通过io模拟spi对avr进行编程、 通过io模拟spi对avr进行编程 通过io模拟spi对avr进行编程
💻 C
📖 第 1 页 / 共 5 页
字号:
      chip_1_page++;
      delay(10);
      PORTB &= ~0x10;//PB4(DF_CS)=0
      
      write_SPI(MM_PAGE_TO_B1_XFER);//将第一页装入buffer1
      write_SPI((uchar)(chip_1_page>>7));
      write_SPI((uchar)(chip_1_page<<1));
      write_SPI(0x00);
      
      PORTB |= 0x10;//PB4(DF_CS)=1
      chip_1_page++;
      delay(10);
      PORTB &= ~0x10;//PB4(DF_CS)=0
      
      write_SPI(BUFFER_2_READ);//准备好从buffer2读取数据
      write_SPI(0x00);
      write_SPI(0x01);
      write_SPI(0x00);
  }
  else if ( (chip_1_number>256)&&(chip_1_number<512) )
  {
      chip_1_page = chip_1_page-2;
      write_SPI(MM_PAGE_TO_B2_XFER);//将第二页装入buffer2
      write_SPI((uchar)(chip_1_page>>7));
      write_SPI((uchar)(chip_1_page<<1));
      write_SPI(0x00);
      
      PORTB |= 0x10;//PB4(DF_CS)=1
      chip_1_page++;
      delay(10);
      PORTB &= ~0x10;//PB4(DF_CS)=0
      
      write_SPI(MM_PAGE_TO_B1_XFER);//将第一页装入buffer1
      write_SPI((uchar)(chip_1_page>>7));
      write_SPI((uchar)(chip_1_page<<1));
      write_SPI(0x00);
      
      PORTB |= 0x10;//PB4(DF_CS)=1
      chip_1_page++;
      delay(10);
      PORTB &= ~0x10;//PB4(DF_CS)=0
      
      write_SPI(BUFFER_2_READ);//准备好从buffer2读取数据
      write_SPI(0x00);
      write_SPI(0x01);
      write_SPI( (char)(number) );
  }
  else if (chip_1_number==512)
  {
      chip_1_page = chip_1_page-2;
      write_SPI(MM_PAGE_TO_B1_XFER);//将第一页装入buffer1
      write_SPI((uchar)(chip_1_page>>7));
      write_SPI((uchar)(chip_1_page<<1));
      write_SPI(0x00);
      
      PORTB |= 0x10;//PB4(DF_CS)=1
      chip_1_page++;
      number=0; 
      delay(10);
      PORTB &= ~0x10;//PB4(DF_CS)=0
      
      write_SPI(MM_PAGE_TO_B2_XFER);//将第二页装入buffer2
      write_SPI((uchar)(chip_1_page>>7));
      write_SPI((uchar)(chip_1_page<<1));
      write_SPI(0x00);
      
      PORTB |= 0x10;//PB4(DF_CS)=1
      chip_1_page++;
      delay(10);
      PORTB &= ~0x10;//PB4(DF_CS)=0
      
      write_SPI(BUFFER_1_READ);//准备好从buffer1读取数据
      write_SPI(0x00);
      write_SPI(0x00);
      write_SPI(0x00);
  }
}

//~~~~~~~~~~~~~~~~补零~~~~~~~~~~~~~~~~//

void zero(void)
{
  if (tadl!=adl)
     {
       while(tadl!=adl)
       {
         /*as=0x40;
         IO_SPI();
         as=tadh;
         IO_SPI();
         as=tadl;
         IO_SPI();
         as=0x00;
         IO_SPI();
         
         as=0x48;
         IO_SPI();
         as=tadh;
         IO_SPI();
         as=tadl;
         IO_SPI();
         as=0x00;
         IO_SPI();*/
         datacache[z]=0x00;
         z++;
         datacache[z]=0x00;
         z++;
                           
         if (tadl==0xFF)
               {
                 tadl=adl;
                 adh--;
                 adl=0xFF;
                 ProgrammingFlash();
                 adh++;
                 adl=tadl;
                 tadh++;
               }
            else
               {                 
                 fadl=tadl&0x3F;              //取LSB后六位
                 if (fadl==0x3F)
                    {                      
                      tadl1=adl;                 
                      adl=tadl;
                      ProgrammingFlash();
                      adl=tadl1;
                    }                 
               }            
         tadl++;         
       }     
       ads--;
     }
  beg=1;
}

void end(void)
    {
      if (rxtxend==0&&temp==':')
          { 
            ts=0;
            rxtxend=1;
          }
       if (rxtxend==1)
          {
            if (ts<7)
               {
                 ts++;
               }
            else if (ts==7)
               {
                 if (temp=='0')
                    {
                      ts++;
                    }
                 else
                    {
                      rxtxend=0;
                      ts=0;
                    }
               }
            else if (ts==8)
               {
                 if (temp=='1')
                    {
                      rxtxend=2;
                      ts=0;
                    }
                 else
                    {
                      rxtxend=0;
                      ts=0;
                    }
               }
          }
       if (rxtxend==2&&temp==0x0A)
          {
            rxtxend++;
          }
    }


//~~~~~~~~~~~~~~~~判断下载或编程是否结束并发送地址和长度~~~~~~~~~~~~~~~~//

void jud(void)
    {
      if (rxtxend==0&&temp==':')
          { 
            ts=0;
            rxtxend=1; 
            beg=0;
            //tempadr=trueadr;
          }
       if (rxtxend==1)
          {
            if (ts==0)
               {
                 ts++;
               }
            else if (ts==1)
               {
                 xs=ds;
                 xs=xs-0x30;
                 xs=xs<<4;
                 ts++;
               }
            else if (ts==2)
               {
                 ys=ds;
                 ys=ys-0x30;
                 cc=xs|ys;
                 ts++;
                 if (cc!=0x14)
                    {
                      ads++;
                    }
               }
            else if (ts==3)
               {
                 xs=ds;
                 xs=xs-0x30;
                 xs=xs<<4;
                 ts++;
               }
            else if (ts==4)
               {
                 ys=ds;
                 ys=ys-0x30;
                 trueadr=xs|ys;
                 trueadr=trueadr<<8;
                 ts++;
               }
            else if (ts==5)
               {
                 xs=ds;
                 xs=xs-0x30;
                 xs=xs<<4;
                 ts++;
               }
            else if (ts==6)
               {
                 ys=ds;
                 ys=ys-0x30;
                 trueadr=trueadr|(xs|ys);
                 adl=(char)((trueadr>>1)&0x00FF);
                 adh=(char)((trueadr>>9)&0x00FF);
                 ts++;                 
               }
            else if (ts==7)
               {
                 if (temp=='0')
                    {
                      ts++;
                    }
                 else
                    {
                      rxtxend=0;
                      ts=0;
                    }
               }
            else if (ts==8)
               {
                 if (temp=='1')
                    {
                      rxtxend=2;
                      ts=0;
                      ci=0;
                      ads=0;
                      fadl=tempadl&0xC0;
                      if (fadl==0xC0)
                         {
                           while(z<128)
                           {
                             datacache[z]=0xFF;
                             z++;
                           }
                           tempadh++;
                           tempadl=0x00;
                           adh=tempadh;
                           adl=tempadl;
                           ProgrammingFlash();
                         }
                      else
                         {
                           while(z<128)
                           {
                             datacache[z]=0xFF;
                             z++;
                           }
                           //tempadl++;
                           adh=tempadh;
                           adl=tempadl;
                           ProgrammingFlash();
                         }
                    }
                 else if (temp=='0'&&ads==0)
                    {
                      if (prof==1)
                         {
                           if (DataFlashstate==0x05||DataFlashstate==0x04||(proe==1&&temp2==1))
                              {
                                beg=1;
                              }
                           else if ((proe==1&&temp2==0))
                              {
                                beg=2;
                              }
                         }
                      else if (prof==0)
                         {
                           if (proe==1&&temp2==1)
                              {
                                beg=2;
                              }                         
                         }                   
                      rxtxend=0;
                      ts=0;
                    }
                 else if (temp=='0'&&ads!=0)
                    {
                      if (prof==1)
                         {
                           if (DataFlashstate==0x05||DataFlashstate==0x04||(proe==1&&temp2==1))
                              {
                                beg=1;
                                zero();
                              }
                           else if ((proe==1&&temp2==0))
                              {
                                beg=2;
                                ads=0;
                              }
                         }
                      else if (prof==0)
                         {
                           if (proe==1&&temp2==1)
                              {
                                beg=2;
                                ads=0;
                              }                         
                         }                   
                      rxtxend=0;
                      ts=0;
                    }
                 else
                    {
                      rxtxend=0;
                      ts=0;
                    }
               }
          }
       if (rxtxend==2&&temp==0x0A)
          {
            rxtxend++;
          }
    }

//~~~~~~~~~~~~~~~~开始编程Flash并校验~~~~~~~~~~~~~~~~//

void Programme(void)
{
  if (ci==0)
     {
       x=0;
       y=0;
       ci=1;
     }
  else if (ci==1)
     {
       xs=ds;
       xs=xs-0x30;
       xs=xs<<4;
       ci++;
       //i++;
     }
  else if (ci==2)
     {
       ys=ds;
       ys=ys-0x30;
       ds=xs|ys;
       ci--;
       x++;
       if (y==0)
          { 
            /*as=0x40;
            IO_SPI();
            as=adh;
            IO_SPI();
            as=adl;
            IO_SPI();
            as=ds;
            IO_SPI();*/
            datacache[z]=ds;
            z++;
            y=1;            
          }
       else if (y==1)
          {
            /*as=0x48;
            IO_SPI();
            as=adh;
            IO_SPI();
            as=adl;
            IO_SPI();
            as=ds;
            IO_SPI();*/
            datacache[z]=ds;
            z++;
            /*
            as=0x4C;
            IO_SPI();
            as=adh;
            IO_SPI();
            as=adl;
            IO_SPI();
            as=0x00;
            IO_SPI();
            */
            y=0;
            if (adl==0xFF)
               {
                 ProgrammingFlash();
                 adh++;
                 adl=0x00;                 
               }
            else
               {                 
                 fadl=adl&0x3F;              //取LSB后六位
                 if (fadl==0x3F)
                    {                      
                      _NOP();
                      _NOP();
                      ProgrammingFlash();
                    }  
                 adl++;
               }              
          }
     }
  if (x==cc)
     {
       tadl=adl;
       tadh=adh;
       cc=0;
       as=0;
       ci=0;
     }
}

//~~~~~~~~~~~~~~~~开始编程EEPROM并校验~~~~~~~~~~~~~~~~//

void Programmeeprom(void)
{
  if (ci==0)
     {
       x=0;
       y=0;
       ci=1;
     }
  else if (ci==1)
     {
       xs=ds;
       xs=xs-0x30;
       xs=xs<<4;
       ci++;
     }
  else if (ci==2)
     {
       ys=ds;
       ys=ys-0x30;
       ds=xs|ys;
       ci--;
       x++;
       
       as=0xC0;
       IO_SPI();
       as=eadh&0x3F;
       IO_SPI();
       as=eadl;
       IO_SPI();

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -