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

📄 uart-io.c

📁 通过io模拟spi对avr进行编程、 通过io模拟spi对avr进行编程 通过io模拟spi对avr进行编程
💻 C
📖 第 1 页 / 共 4 页
字号:
                         }                   
                      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();
            y=1;            
          }
       else if (y==1)
          {
            as=0x48;
            IO_SPI();
            as=adh;
            IO_SPI();
            as=adl;
            IO_SPI();
            as=ds;
            IO_SPI();
            /*
            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();
       as=ds;
       IO_SPI();
       //delay1(1);
       
       if (eadl==0xFF)
          {
            eadh++;
            eadl=0x00;
          }
       else
          {
            eadl++;
          }
     }
    
  if (x==cc)
     {
       tadl=adl;
       tadh=adh;
       cc=0;
       as=0;
       ci=0;
     }
}


void Write_ros(void)
{
  as=0xAC;  //写高熔丝位
  IO_SPI();
  as=0xA8;
  IO_SPI();
  as=0x00;
  IO_SPI();     
  as=rosh;
  IO_SPI();
  
  delay1(10);
  
  as=0xAC;  //写熔丝位
  IO_SPI();
  as=0xA0;
  IO_SPI();
  as=0x00;
  IO_SPI();     
  as=rosl;
  IO_SPI();
  
  delay1(10);
  
  as=0xAC;  //写锁定位
  IO_SPI();
  as=0xFF;
  IO_SPI();
  as=0x00;
  IO_SPI();     
  as=0xFF;
  IO_SPI();
}



#pragma vector = USART_RXC_vect
__interrupt void uart0_rx_isr(void)
{
    //uart has received a character in UDR
       temp=read_UART();   //读取UDR
       write_SPI(temp);    //写flash
       number++;
	 
       if (number == 255)  //buffer1写满,存入主存,开始向buffer2写
          {
	     PORTB |= 0x10; //PB4(DF_CS)=1
	     PORTB &= ~0x10;//PB4(DF_CS)=0
		    
	     write_SPI(B1TOMM_WITHOUT_ERASE);//将第一页存入主存
	     write_SPI((char)(page>>7));
	     write_SPI((char)(page<<1));
	     write_SPI(0x00);
		    
	     PORTB |= 0x10; //PB4(DF_CS)=1
	     page++;
	     PORTB &= ~0x10;//PB4(DF_CS)=0
		    
	     write_SPI(BUFFER_2_WRITE);      //开始向buffer2写
   	     write_SPI(0x00);
	     write_SPI(0x00);
	     write_SPI(0x00);
	  }

	 	
       if (number == 510) //buffer2写满,存入主存,开始向buffer1写
          {
	     PORTB |= 0x10; //PB4(DF_CS)=1
	     number = 0;
	     PORTB &= ~0x10;//PB4(DF_CS)=0
		   
	     write_SPI(B2TOMM_WITHOUT_ERASE);//将第二页存入主存
	     write_SPI((char)(page>>7));
	     write_SPI((char)(page<<1));
	     write_SPI(0x00);
		   
	     PORTB |= 0x10; //PB4(DF_CS)=1
	     page++;
	     PORTB &= ~0x10;//PB4(DF_CS)=0
		   
	     write_SPI(BUFFER_1_WRITE);      //开始向buffer1写
   	     write_SPI(0x00);
	     write_SPI(0x00);
	     write_SPI(0x00);
	  }
       
//判断文件是否发送完毕,并将最后一页写入DataFlash
       
       end();
       
       if (rxtxend==3)
          {
            if (number<255)
               {
                 PORTB |= 0x10; //PB4(DF_CS)=1
	         PORTB &= ~0x10;//PB4(DF_CS)=0
		    
	         write_SPI(B1TOMM_WITHOUT_ERASE);//将第一页存入主存
	         write_SPI((char)(page>>7));
	         write_SPI((char)(page<<1));
	         write_SPI(0x00);
               }
            else if (number<510&&number>255)
               {
                 /*for (i=number;i<528;i++)
                     {
                       write_SPI(0xFF);
                       number++;
                     }*/
                 PORTB |= 0x10; //PB4(DF_CS)=1
	         PORTB &= ~0x10;//PB4(DF_CS)=0
		    
	         write_SPI(B2TOMM_WITHOUT_ERASE);//将第二页存入主存
	         write_SPI((char)(page>>7));
	         write_SPI((char)(page<<1));
	         write_SPI(0x00);
               }
          }
//                 
       if (page==2048||rxtxend==3)      //flash写满,停止
          {
	     PORTB |= 0x10;  //PB4(DF_CS)=1
             rxpage=page+1;
	     state=2;        //状态置位
             page=0;
             number=0;
             upordown=0;
	     UCSRB &= ~0x80; //关闭UART接受中断使能
             TCCR0 = 0x05;   //启动定时/计数器0
          }
 
}

#pragma vector = USART_TXC_vect
__interrupt void uart0_tx_isr(void)
{
    //uart has transmit a character in UDR
       temp=read_SPI();   //读取DataFlash
       //delay1(3);
       ds=temp;
       ascii();
       UDR=temp;    //将值赋给UDR
       number++;
           
       if (number == 255)  //buffer1读取完毕,主存转入buffer1,开始读取buffer2
          {
	     PORTB |= 0x10; //PB4(DF_CS)=1
	     PORTB &= ~0x10;//PB4(DF_CS)=0
		    
	     write_SPI(MM_PAGE_TO_B1_XFER);//主存转入buffer1
	     write_SPI((uchar)(page>>7));
	     write_SPI((uchar)(page<<1));
	     write_SPI(0x00);
	          
	     PORTB |= 0x10;  //PB4(DF_CS)=1
	     page++;
	     PORTB &= ~0x10; //PB4(DF_CS)=0
	         
	     write_SPI(BUFFER_2_READ);     //开始读取buffer2
	     write_SPI(0x00);
	     write_SPI(0x00);
	     write_SPI(0x00);
             //write_SPI(0x00);
          }
   
       if (number == 510)//buffer2读取完毕,主存转入buffer2,开始读取buffer1
	  {
	     PORTB |= 0x10;  //PB4(DF_CS)=1
	     number = 0;
	     PORTB &= ~0x10; //PB4(DF_CS)=0
	          
	     write_SPI(MM_PAGE_TO_B2_XFER);//主存转入buffer2
	     write_SPI((uchar)(page>>7));
	     write_SPI((uchar)(page<<1));
	     write_SPI(0x00);
	          
	     PORTB |= 0x10;  //PB4(DF_CS)=1
	     page++;
	     PORTB &= ~0x10; //PB4(DF_CS)=0
	          
	     write_SPI(BUFFER_1_READ);     //开始读取buffer1
	     write_SPI(0x00);
	     write_SPI(0x00);
	     write_SPI(0x00);
             //write_SPI(0x00);
          }
       
       if (upordown==4)
          {
            end();
          }
       else if (upordown==5)
          {
            jud();
          }
       
       if (beg==1)
          {
            Programme();
          }
       else if (beg==2)
          {
            Programmeeprom();
          }
          
       if (page==2048||rxtxend==3)       //flash全部读取完成,停止
	  {
	     if (prof==1)
             {
              if (temp2==1)               //如果有EEPROM数据,则
                {
                  page--;
                  number=0;
                  rxtxend=0;
                  temp2=0;
                  PORTB |= 0x10;//PB4(DF_CS)=1
                  delay1(1);
                  PORTB &= ~0x10;//PB4(DF_CS)=0
      
                  write_SPI(MM_PAGE_TO_B1_XFER);//将第一页装入buffer1
                  write_SPI((uchar)(page>>7));
                  write_SPI((uchar)(page<<1));
                  write_SPI(0x00);
      
                  PORTB |= 0x10;//PB4(DF_CS)=1
                  page++;
                  delay1(1);
                  PORTB &= ~0x10;//PB4(DF_CS)=0
      
                  write_SPI(MM_PAGE_TO_B2_XFER);//将第二页装入buffer2
                  write_SPI((uchar)(page>>7));
                  write_SPI((uchar)(page<<1));
                  write_SPI(0x00);
      
                  PORTB |= 0x10;//PB4(DF_CS)=1
                  page++;
                  delay1(1);
                  PORTB &= ~0x10;//PB4(DF_CS)=0
      
                  write_SPI(BUFFER_1_READ);//准备好从buffer1读取数据
                  write_SPI(0x00);
                  write_SPI(0x00);
                  write_SPI(0x00);                                  
                }
             else
                {
                  if (temp3==1&&pror==1)               //如果有熔丝位数据,则
                     {
                       page--;
                       number=0;
                       rxtxend=3;
                       temp3=0;
                       PORTB |= 0x10;//PB4(DF_CS)=1
                       delay1(1);
                       PORTB &= ~0x10;//PB4(DF_CS)=0
      
                       write_SPI(MM_PAGE_TO_B1_XFER);//将第一页装入buffer1
                       write_SPI((uchar)(page>>7));
                       write_SPI((uchar)(page<<1));
                       write_SPI(0x00);
      
                       PORTB |= 0x10;//PB4(DF_CS)=1
                       page++;
                       delay1(1);
                       PORTB &= ~0x10;//PB4(DF_CS)=0              
      
                       write_SPI(BUFFER_1_READ);//准备好从buffer1读取数据
                       write_SPI(0x00);
                       write_SPI(0x00);
                       write_SPI(0x00);
                     }
                     
                   else if (temp3==0&&pror==1)
                      {                       
                        if (number==3)
                          {
                            PORTB |= 0x10;    //PB4(DF_CS)=1
	                    state =0;         //状态清0
                            page=0;
                            upordown=0;
                            rxtxend=0;
	                    UCSRB &= ~0x40; //关闭UART发送中断使能
                            TCCR0 = 0x05;   //启动定时/计数器0
                            temp2=proe;
                            temp3=pror;
                          }
                      }                     
                  else 
                     {
                       PORTB |= 0x10;    //PB4(DF_CS)=1
	               state =0;         //状态清0
                       page=0;
                       upordown=0;
	               UCSRB &= ~0x40; //关闭UART发送中断使能
                       TCCR0 = 0x05;   //启动定时/计数器0
                       temp2=proe;
                       temp3=pror;
                     }
                }
             }
            else if (prof==0&&proe==1)
                {
                  if (temp3==1&&pror==1)
                     {
                       temp2=0;
                       page--;
                       number=0;
                       rxtxend=3;
                       temp3=0;
                       PORTB |= 0x10;//PB4(DF_CS)=1
                       delay1(1);
                       PORTB &= ~0x10;//PB4(DF_CS)=0
      
                       write_SPI(MM_PAGE_TO_B1_XFER);//将第一页装入buffer1
                       write_SPI((uchar)(page>>7));
                       write_SPI((uchar)(page<<1));
                       write_SPI(0x00);
      
                       PORTB |= 0x10;//PB4(DF_CS)=1
                       page++;
                       delay1(1);
                       PORTB &= ~0x10;//PB4(DF_CS)=0              
      
                       write_SPI(BUFFER_1_READ);//准备好从buffer1读取数据
                       write_SPI(0x00);
                       write_SPI(0x00);
                       write_SPI(0x00);
                     }
                  else if (temp3==0&&pror==1)
                      {                       
                        if (number==3)
                          {
                            PORTB |= 0x10;    //PB4(DF_CS)=1
	                    state =0;         //状态清0
                            page=0;
                            upordown=0;
                            rxtxend=0;
	                    UCSRB &= ~0x40; //关闭UART发送中断使能
                            TCCR0 = 0x05;   //启动定时/计数器0
                            temp2=proe;
                            temp3=pror;
                          }
                      }
                  else 
                     {
                       PORTB |= 0x10;    //PB4(DF_CS)=1
	               state =0;         //状态清0
                       page=0;
                       upordown=0;
	               UCSRB &= ~0x40; //关闭UART发送中断使能
                       TCCR0 = 0x05;   //启动定时/计数器0
                       temp2=proe;
                       temp3=pror;
                     }                  
                }
             else if (prof==0&&proe==0)
                {
                  ;
                }
	  }
 
}



void Programme_Chip(void)
{
  do
  {    
       temp=read_SPI();   //读取DataFlash
       ds=temp;
       ascii();

⌨️ 快捷键说明

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