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

📄 uart-spi-730.c

📁 通过io模拟spi对avr进行编程、 通过io模拟spi对avr进行编程 通过io模拟spi对avr进行编程
💻 C
📖 第 1 页 / 共 5 页
字号:
       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 == 256)  //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 == 512) //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<256)
               {
                 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<512&&number>256)
               {
                 /*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 == 256)  //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 == 512)//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
                  delay(10);
                  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++;
                  delay(10);
                  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++;
                  delay(10);
                  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++;
                       delay(10);
                       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
                       delay(10);
                       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++;
                       delay(10);
                       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)
{
  //z=0;
  
  do
  {    
       temp=read_SPI();   //读取DataFlash
       ds=temp;
       ascii();
       //UCSRA |= 0x40;
       //UDR=temp;
       //while (!(UCSRA & 0x40));
       number++;
       chip_1_number=number;
       
           
       if (number == 256)  //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 == 512)//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

⌨️ 快捷键说明

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