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

📄 uart-io.c

📁 通过io模拟spi对avr进行编程、 通过io模拟spi对avr进行编程 通过io模拟spi对avr进行编程
💻 C
📖 第 1 页 / 共 4 页
字号:
                 adh++;
                 adl=0x00;
               }
          }
       else if (y==1)
          {
            as=0x28;
            IO_SPI();
            as=adh;
            IO_SPI();
            as=adl;
            IO_SPI();
            as=0x00;
            IO_SPI_READSP();
            //ws[z]=rs;
            /*
            as=0x4C;
            IO_SPI();
            as=adh;
            IO_SPI();
            as=adl;
            IO_SPI();
            as=0x00;
            IO_SPI();
            */
            y=0;
            if (adl==0xFF)
               {                 
                 adh++;
                 adl=0x00;
               }
            else
               { 
                 adl++;
               }
          }
  /*if (rs==0xFF)
  {_NOP();}
  else
  {_NOP();}*/
}


void Read_EEPROM(void)
{
              uiA = 0x0000;
              EEPROM_read(uiA);
              delay1(10);
              DataFlashstate=EEDR;
              
              if (DataFlashstate==0x07)    //判断数据状态
                 {
                   prof=1;
                   proe=1;
                   temp2=1;
                   pror=1;
                   temp3=1;
                 }
              else if (DataFlashstate==0x06)
                 {
                   prof=1;
                   proe=1;
                   temp2=1;
                   pror=0;
                   temp3=0;
                 }
              else if (DataFlashstate==0x05)
                 {
                   prof=1;
                   proe=0;
                   temp2=0;
                   pror=1;
                   temp3=1;
                 }
              else if (DataFlashstate==0x04)
                 {
                   prof=1;
                   proe=0;
                   temp2=0;
                   pror=0;
                   temp3=0;
                 }
              else if (DataFlashstate==0x03)
                 {
                   prof=0;
                   proe=1;
                   temp2=1;
                   pror=1;
                   temp3=1;
                 }
              else if (DataFlashstate==0x02)
                 {
                   prof=0;
                   proe=1;
                   temp2=1;
                   pror=0;
                   temp3=0;
                 }
              else if (DataFlashstate==0x01)
                 {
                   prof=0;
                   proe=0;
                   temp2=0;
                   pror=1;
                   temp3=1;
                 }
              else if (DataFlashstate==0x00)
                 {
                   prof=0;
                   proe=0;
                   temp2=0;
                   pror=0;
                   temp3=0;
                 }
}


void Read_ros(void)
{
  as=0x58;  //读高熔丝位
  IO_SPI();
  as=0x08;
  IO_SPI();
  as=0x00;
  IO_SPI();     
  as=0x00;
  IO_SPI_READSP();
  rosh=rs;
  rs=0;
  
  delay1(10);
  
  as=0x50;  //读熔丝位
  IO_SPI();
  as=0x00;
  IO_SPI();
  as=0x00;
  IO_SPI();     
  as=0x00;
  IO_SPI_READSP();
  rosl=rs;
  rs=0;
  
  delay1(10);
  
  as=0x58;  //读锁定位
  IO_SPI();
  as=0x00;
  IO_SPI();
  as=0x00;
  IO_SPI();     
  as=0x00;
  IO_SPI_READSP();
  lock=rs;
  rs=0;
}




//call this routine to initialize all peripherals
void init_devices(void)
{
 //stop errant interrupts until set up
 _CLI(); //disable all interrupts
 port_init();      //端口初始化
 uart0_init();     //串口初始化
 timer0_init();    //定时/计数器0初始化,键盘采样
 timer2_init();    //定时/计数器2初始化,延时函数
 SPI_init();       //SPI初始化
 ADC1_init();      //ADC初始化(键值读取)

 MCUCR = 0x00;
 GICR  = 0x00;
 TIMSK = 0x41; //timer interrupt sources
 _SEI(); //re-enable interrupts
 //all peripherals are now initialized
}


void setzero(void)
{
   upordown=0; //工作状态。1:下载flash;2:下载eeprom;3:下载熔丝位;4:读取DataFlash;5:编程
  state=0;    //状态参数
  page=0;     //下一页码
  number=0;   //下一字节数
  i=0;        //循环参数
  j=0;        //循环参数
  x=0;        //循环参数
  y=0;        //循环参数
  ts=0;       //判断hex文件开始,结束等信息的参数位
  rxtxend=0;    //发送,接收状态参数
  DataFlashstate=0;    //DataFlash内容状态
  rxpage=0;
 m=0;        //延时计数参数
 temp1=0;
 temp2=0;
 temp3=0;
 temp4=0;
 prof=0;     //Flash编程完毕
 proe=0;     //EEPROM编程完毕
 pror=0;     //熔丝位编程完毕
 adh=0;      //编程地址高字节
 adl=0;      //编程地址低字节
 fadl=0;     //编程地址低字节后七位
 tadl=0;     //编程地址低暂存
 tadh=0;     //编程地址高暂存
 tadl1=0;     //编程地址低暂存
 eadl=0;
 eadh=0;
 tempadh=0;
 tempadl=0;
 trueadr=0;
//uint tempadr=0;
 beg=0;      //编程开始状态变量
 cc=0;       //编程长度变量
 ci=0;       //编程长度判断变量
 as=0;                             
 bs=0;
 cs=0;       //反馈数据暂存
 ds=0;       //接收编程数据暂存
 rs=0;       //读出数据暂存
 ads=0;       //Hex地址判断状态
 uiA=0;
 ucD=0;
 xs=0;
 ys=0;
 Syn=0;
 rosl=0;     //读出熔丝位暂存
 rosh=0;
 lock=0;    //读出锁定位暂存
}

//
void main(void)
{
    init_devices();   //初始化设备
    PORTB |= 0x10;   //PB4(DF_CS)=1
    //insert your functional code here...

//~~~~~~~~~~~~~~~~~~~~~~~~~判断工作状态~~~~~~~~~~~~~~~~~~~~~~~~~~//

  while(upordown==0)
   { 
    if( ((temp1>=0x79)&&(temp1<=0x8f)) )    
    //下载数据开始
    { 
     delay(50000);  //按下50ms表示进入下载状态
     if( ((temp1>=0x79)&&(temp1<=0x8f)) )
    {
      ucD = 0x00;
      uiA = 0x0000;
      PORTB |= 0x10;   //PB4(DF_CS)=1
      PORTB &= ~0x10; //PB4(DF_CS)=0
      chip_unlock();  //片解锁
      PORTB |= 0x10;  //PB4(DF_CS)=1
      delay(1000);
      PORTB &= ~0x10; //PB4(DF_CS)=0
      chip_erase();   //片擦除
      PORTB |= 0x10;  //PB4(DF_CS)=1
      delay1(10);
      state=2;
      prof=0;     //清除各个参数
      proe=0;
      pror=0;
      temp2=0;
      temp3=0;
      DataFlashstate=0;
      while(state==2)
      {                 
           
     if( ((temp1 >=0x11)&&(temp1<=0x21)) )    
	  //从PC机下载Flash键按下
        { 
          delay(50000);  //按下50ms表示进入从PC机下载状态
	  if( ((temp1 >=0x11)&&(temp1<=0x21)) )     //判断是否进入下载状态
            {
              
                   upordown=1;  //从PC机下载文件
                   prof=1;     //flash内容已下载                   
                   DownFromPC();  //从PC机中下载Flash数据至DataFlash中
                   ucD = BIT(2);  
                   uiA = 0x0001;
                   EEPROM_write(uiA, rxpage);
            }
        }
    
     else if( ((temp1>=0x21)&&(temp1<=0x37)) )    
	  //下载EEPROM数据
        { 
          delay(50000);  //按下50ms表示进入下载状态
	  if( ((temp1>=0x21)&&(temp1<=0x37)) )
            {
              if (ucD==0x04)
                 {
                   uiA = 0x0001;
                   EEPROM_read(uiA);
                   page=EEDR;   //重置page页参数
                   upordown=2;
                   proe=1;
                   temp2=proe;
                   DownFromPC();  //从PC机中下载EEPROM数据至DataFlash中
                   ucD |= BIT(1);
                   uiA = 0x0002;
                   EEPROM_write(uiA, rxpage);
                 }
              else
                 {
                   page=0x00;
                   upordown=2;     //设置工作状态
                   proe=1;     //eeprom内容已下载
                   temp2=proe;     //设置临时参数以备后用
                   DownFromPC();  //从PC机中下载EEPROM数据至DataFlash中
                   ucD = BIT(1);
                   uiA = 0x0002;
                   EEPROM_write(uiA, rxpage);
                 }          
            }
        }
      
      else if( ((temp1 >=0x37)&&(temp1<=0x4d)) )    
	  //下载熔丝位数据
        { 
          delay(50000);  //按下50ms表示进入下载状态
	  if( ((temp1 >=0x37)&&(temp1<=0x4d)) )
            {
              if (ucD==0x04)
                 {
                   uiA = 0x0001;
                   EEPROM_read(uiA);
                   page=EEDR;   //重置page页参数
                   upordown=3;
                   pror=1;
                   temp3=pror;
                   DownFromPC();  //从PC机中下载EEPROM数据至DataFlash中
                   ucD |= BIT(0);
                 }
              else if (ucD==0x06)
                 {
                   uiA = 0x0002;
                   EEPROM_read(uiA);
                   page=EEDR;   //重置page页参数
                   upordown=3;
                   pror=1;
                   temp3=pror;
                   DownFromPC();  //从PC机中下载EEPROM数据至DataFlash中
                   ucD |= BIT(0);
                 }
              else if (ucD==0x02)
                 {
                   uiA = 0x0002;
                   EEPROM_read(uiA);
                   page=EEDR;   //重置page页参数
                   upordown=3;
                   pror=1;
                   temp3=pror;
                   DownFromPC();  //从PC机中下载EEPROM数据至DataFlash中
                   ucD |= BIT(0);
                 }
              else if (ucD==0x00)
                 {
                   page=0x00;   //重置page页参数
                   upordown=3;  //下载熔丝位数据
                   pror=1;      //熔丝位内容已下载
                   temp3=pror;  //设置临时参数以备后用
                   DownFromPC();  //从PC机中下载EEPROM数据至DataFlash中
                   ucD = BIT(0);
                 }
            }
        }     
     
     
     else if( ((temp1>=0x8f)&&(temp1<=0xa5)) )    
	  //下载数据结束
        { 
          delay(50000);  //按下50ms表示进入下载状态
	  if( ((temp1>=0x8f)&&(temp1<=0xa5)) )
            {
              uiA = 0x0000;
              EEPROM_write(uiA, ucD);
              state=0;
            }
        }
       }
      }
     }

      
      else if( ((temp1>=0x4d)&&(temp1<=0x63)) )    
	  //读DataFlash
        { 
          delay(50000);  //按下50ms表示进入读取状态
	  if( ((temp1>=0x4d)&&(temp1<=0x63)) )
            {
              upordown=4;  //读DataFlash
              delay1(1);
              Read_EEPROM();
              delay1(1);
              ReadDataFlash();  //读DataFlash中的数据
            }
        }
      
      
      else if( ((temp1 >=0x63)&&(temp1<=0x79)) )   
	  //编程键按下
        { 
          delay(50000);  //按下50ms表示进入编程状态
	  if( ((temp1 >=0x63)&&(temp1<=0x79)) )
            {
              upordown=5;  //向目标芯片编程
              delay1(1);
              
              Read_EEPROM();
              
              while(Syn==0)   //激活SPI编程状态并判断时钟是否同步
                {
                  STA_SCL_LOW;  //激活SPI编程状态
                  STA_RESET_HIG;
                  _NOP();
                  _NOP();
                  _NOP();
                  STA_RESET_LOW;
                  delay1(20);
                     
                  as=0xAC;  //判断时钟是否同步
                  IO_SPI();
                  as=0x53;
                  IO_SPI();
                  as=0x00;
                  IO_SPI_RESP();
                  as=0x00;
                  IO_SPI();    
                  if(cs==0x53){Syn=1;}  //反馈正确则标志时钟同步成功
                }
              
              if (prof==1)
                 {
                   as=0xAC;  //擦除整个目标芯片
                   IO_SPI();
                   as=0x80;
                   IO_SPI();
                   as=0x00;
                   IO_SPI();       
                   as=0x00;
                   IO_SPI();
                   delay1(5);
                 }
              
                  DownToChip();  //对目标芯片编程
                  /*prof=0;
                  proe=0;
                  pror=0;
                  temp2=0;
                  temp3=0;
                  {ReadFromChip();}*/
                  //while(1);      
              
                  setzero();
            }
        }
    
     else if( ((temp1>=0xa5&&temp1<0xbb)) )    
	  //读熔丝位
        { 
          delay(50000);  //按下50ms表示进入读取状态
	  if( ((temp1>=0xa5&&temp1<0xbb)) )
            {
              while(Syn==0)   //激活SPI编程状态并判断时钟是否同步
                {
                  STA_SCL_LOW;  //激活SPI编程状态
                  STA_RESET_HIG;
                  _NOP();
                  _NOP();
                  _NOP();
                  STA_RESET_LOW;
                  delay1(20);
                     
                  as=0xAC;  //判断时钟是否同步
                  IO_SPI();
                  as=0x53;
                  IO_SPI();
                  as=0x00;
                  IO_SPI_RESP();
                  as=0x00;
                  IO_SPI();    
                  if(cs==0x53){Syn=1;}  //反馈正确则标志时钟同步成功
                }
              
              delay1(1);              
              Read_ros();  //读熔丝位
            }
        }
    
    else if( ((temp1>=0xbb&&temp1<0xd1)) )    
	  //写熔丝位
        { 
          delay(50000);  //按下50ms表示进入读取状态
	  if( ((temp1>=0xbb&&temp1<0xd1)) )
            {
              while(Syn==0)   //激活SPI编程状态并判断时钟是否同步
                {
                  STA_SCL_LOW;  //激活SPI编程状态
                  STA_RESET_HIG;
                  _NOP();
                  _NOP();
                  _NOP();
                  STA_RESET_LOW;
                  delay1(20);
                     
                  as=0xAC;  //判断时钟是否同步
                  IO_SPI();
                  as=0x53;
                  IO_SPI();
                  as=0x00;
                  IO_SPI_RESP();
                  as=0x00;
                  IO_SPI();    
                  if(cs==0x53){Syn=1;}  //反馈正确则标志时钟同步成功
                }
              
              delay1(1);              
              Write_ros();  //写熔丝位
            }
        }
    
    
   }  
   
}



⌨️ 快捷键说明

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