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

📄 int.c

📁 一种通过USB将显示数据送入NAND FLASH中
💻 C
字号:
#include <reg53.h>
#include <string.h>
#include <INTRINS.H>
#include "macro.h"
#include "varmain.h"
#include "varint.h"

void P_InterruptInt0(void) interrupt 0   	//调用D12中断服务子程序
{
  unsigned int W_Reg=0;
  Usb_flag=1;
//  MCU_D12CS=0;
  CS_oled=1;                                 //进中断关OLED片选
  SETBIT(B_D12_Lb,INT_ISR);
  W_Reg = D12_ReadInterruptRegister();

  if(W_Reg != 0)
  {
    if(W_Reg & D12_INT_BUSRESET)  bus_reset();

    if(W_Reg & D12_INT_EOT)  dma_eot();

    if(W_Reg & D12_INT_SUSPENDCHANGE)  supend_change();

    if(W_Reg & D12_INT_ENDP0IN)   ep0_txdone();

    if(W_Reg & D12_INT_ENDP0OUT)  ep0_rxdone();

    if(W_Reg & D12_INT_ENDP1IN)   ep1_txdone();

    if(W_Reg & D12_INT_ENDP1OUT)  ep1_rxdone();

    if(W_Reg & D12_INT_ENDP2IN)   ep2_txdone();

    if(W_Reg & D12_INT_ENDP2OUT)  ep2_rxdone();
  }  
  CLRBIT(B_D12_Lb,INT_ISR);
}


//总线复位中断服务子程序
void bus_reset(void)
{
  D12SUSPD = 1;
//可添加用户代码(进行检测到总线复位的操作)
}

//DMA操作结束中断服务子程序
void dma_eot(void)
{
//可添加用户代码(进行检测DMA操作结束的操作)
}

//设备挂起改变
void supend_change(void)
{

}

//端点1输出中断操作
void ep1_txdone(void)
{
  D12_ReadLastTransactionStatus(3);//复位中断寄存器,改为2  05.1.10
  //可添加用户代码(进行检测端点号3IN令牌的操作)
}

//端点1输入中断操作
void ep1_rxdone(void)
{
  unsigned char len;
//  unsigned int temp_t1,temp_t2;
  D12_ReadLastTransactionStatus(2);//复位中断寄存器
  len = D12_ReadEndpoint(2, sizeof(B_BufRdEnd1), &B_BufRdEnd1[0]);//读取端点1接收数据
  if ((len != 0)&&(B_BufRdEnd1[0]=0x55)) 
    {
      SETBIT(B_CommFlg,B_ReceEP1);//标志端点1接收到数据
      switch(B_BufRdEnd1[1])
	    {
			case 0xA1:                              //0XA1 传输开始
			{
				if(B_BufRdEnd1[3]==0xAA) 
				   {
					  Usbpoint1command=1;
					  transmit_begin=1;
					  transmit_over=0;
					  transmit_num=0;
					  Picture_num=0;
//					  Display_pic=0;
					  D12_WriteEndpoint(3,5,A1_flash_cap);
				   }
				break;
			}
			case 0xA2:
			{
                if(B_BufRdEnd1[3]==0xAA)			//0XA2 传输结束
				   {
                      Usbpoint1command=1;
					  transmit_over=1;
					  transmit_num=0;
//					  Picture_num=Display_pic;
//					  Display_pic=0;
					  D12_WriteEndpoint(3,4,A2_flash_cap);
				   }
				break;
			}
			case 0xb1:								//查询FLASH容量
			{
                if(B_BufRdEnd1[3]==0xBB)
				   {
                      Usbpoint1command=1;
					  ask_flash_cap=1;
				   }
				break;
			}
			case 0xc1:
			{
                if(B_BufRdEnd1[6]==0xCC)                           //确定 05.9.6
				   {
					  Usbpoint1command=1;
//                    temp_char[5]=B_BufRdEnd1[2];               //删除
//					  temp_char[4]=B_BufRdEnd1[1];
//					  Nand_save_block_add=temp_int;
                      temp_char[5]=B_BufRdEnd1[5];
					  temp_char[4]=B_BufRdEnd1[4];
					  Nand_save_page_add=temp_int;
                      start_page_point=temp_int;
					  D12_WriteEndpoint(3,5,C1_flash_cap);
				   }
				break;
			}
			case 0xd1:                                        //下载图片总数
			{
                if(B_BufRdEnd1[4]==0xDD)
				   {
					  Usbpoint1command=1;
                      temp_char[5]=B_BufRdEnd1[3];
					  temp_char[4]=B_BufRdEnd1[2];
					  Display_pic=temp_int;
					  D12_WriteEndpoint(3,5,D1_flash_cap);
				   }
				break;
			}
			case 0xd2:                                        //显示幕数
			{
                if(B_BufRdEnd1[4]==0xDD)
				   {
					  Usbpoint1command=1;
                      temp_char[5]=B_BufRdEnd1[3];
					  temp_char[4]=B_BufRdEnd1[2];
					  Picture_num=temp_int;
					  D12_WriteEndpoint(3,5,D2_flash_cap);
				   }
				break;
			}
			case 0xd3:                                        //图片格式 X*Y
			{
                if(B_BufRdEnd1[6]==0xDD)
				   {
					  Usbpoint1command=1;
                      temp_char[5]=B_BufRdEnd1[5];
					  temp_char[4]=B_BufRdEnd1[4];
					  col_x=temp_int;

                      temp_char[5]=B_BufRdEnd1[3];
					  temp_char[4]=B_BufRdEnd1[2];
					  seg_y=temp_int;
					  D12_WriteEndpoint(3,5,D3_flash_cap);
				   }
				break;
			}
			case 0xd4:                                        //图片显示间隔
			{
                if(B_BufRdEnd1[5]==0xDD)
				   {
					  Usbpoint1command=1;
                      temp_char[5]=B_BufRdEnd1[3];
					  temp_char[4]=B_BufRdEnd1[2];
					  if(B_BufRdEnd1[4]==0xff)
					    ms_delay_flag=0;
					  else
					    ms_delay_flag=1;
					  display_delay=temp_int;
					  D12_WriteEndpoint(3,5,D4_flash_cap);
				   }
				break;
			}
			case 0xe1:											//erase flash page
			{
                if(B_BufRdEnd1[6]==0xee)
				   {
					  Usbpoint1command=1;
                      temp_char[5]=B_BufRdEnd1[5];
					  temp_char[4]=B_BufRdEnd1[4];
					  erase_page_add=temp_int;
					  MCU_D12CS=1;
					  Nf_Block_Erase(erase_page_add);
					  MCU_D12CS=0;
					  D12_WriteEndpoint(3,5,E1_flash_cap);
				   }
				break;				
			}
			case 0xe2:											//erase flash chip
			{
                if(B_BufRdEnd1[3]==0xee)
				   {
					  D12_WriteEndpoint(3,5,E2_flash_cap);
                         //檫除FLASH,待添加
				   }
				break;				
			}
			default: break;
		}
    }
  else
    return ;

}

//端点2输出中断操作
void ep2_txdone(void)
{
  D12_ReadLastTransactionStatus(5);//复位中断寄存器
  //可添加用户代码(进行检测端点号5IN令牌的操作)
}

//端点2输入中断操作
void ep2_rxdone(void)
{
  unsigned char len,i,epstatus;
//  SerialTran(0x11);
//  delay(2);
//  SerialTran(USBTESTN);
//  delay(2);
  EA=0;
  D12_ReadLastTransactionStatus(4);//复位中断寄存器
  epstatus=D12_ReadEndpointStatus(4);
  epstatus&=0x60;
  len = D12_ReadEndpoint(4, sizeof(B_BufRdEnd2), &B_BufRdEnd2[0]);//读取端点2接收数据
  if (len != 0)  SETBIT(B_CommFlg,B_ReceEP2);//标志端点2接收到数据
  if(transmit_begin)
    { 
	  for(i=0;i<64;i++)   
	  {
	    DataBuff[transmit_num++]=B_BufRdEnd2[i];
	  }
      if(epstatus==0x60)                                         //读双缓冲区
	    {
		  len = D12_ReadEndpoint(4, sizeof(B_BufRdEnd2), &B_BufRdEnd2[0]);
		  for(i=0;i<64;i++)   
	      {
	       DataBuff[transmit_num++]=B_BufRdEnd2[i];
	      }
		}

      if(transmit_num==512)
	    {
		  MCU_D12CS=1;
		  RES_oled=0;
		  i++;
		  i--;
		  i++;
		  i--;
          RES_oled=1;
		  transmit_num=0;
//		  save_to_nand=1;
		  Usbpoint2command=1;
//          SerialTrans(512);
	  	  Nf_Write_Page(Nand_save_page_add,512);
		  MCU_D12CS=0;
		  Nand_save_page_add++;
		  
	    }
	}   
  EA=1;
}

void ep0_rxdone(void)
{
  unsigned char ep_last, i;
//  SerialTran(0x22);
//  delay(2);
//  SerialTran(USBTESTN);
//  delay(2);
  ep_last = D12_ReadLastTransactionStatus(0); // Clear interrupt flag

  if (ep_last & D12_SETUPPACKET)	      //是一个建立包  D12_SETUPPACKET=0x20
  {
    ControlData.wLength = 0;
    ControlData.wCount = 0;
    i = D12_ReadEndpoint(0,sizeof(ControlData.DeviceRequest),(unsigned char *)(&ControlData.DeviceRequest));
    if(i != sizeof(DEVICE_REQUEST))
    {
      D12_SetEndpointStatus(0, 1);
      D12_SetEndpointStatus(1, 1);
      B_Conrol_Stat = USB_IDLE;			
      return;
    }
	ControlData.DeviceRequest.wValue = SWAP(ControlData.DeviceRequest.wValue);
	ControlData.DeviceRequest.wIndex = SWAP(ControlData.DeviceRequest.wIndex);
	ControlData.DeviceRequest.wLength = SWAP(ControlData.DeviceRequest.wLength);
    // Acknowledge setup here to unlock in/out endp   
    D12_AcknowledgeEndpoint(0);
    D12_AcknowledgeEndpoint(1);
    ControlData.wLength = ControlData.DeviceRequest.wLength;
    ControlData.wCount = 0;
    
    if (ControlData.DeviceRequest.bmRequestType & USB_ENDPOINT_DIRECTION_MASK) 
    {
      SETBIT(B_D12_Lb,SETUP);
      B_Conrol_Stat = USB_TRANSMIT;		/* get command */
    }
    else
    {
       if (ControlData.DeviceRequest.wLength == 0) 
       {
	SETBIT(B_D12_Lb,SETUP);			/* set command */
	B_Conrol_Stat = USB_IDLE;
       }
       else
       {
        if(ControlData.DeviceRequest.wLength > MAX_CONTROLDATA_SIZE)  //有问题:应该是EP0_PACKET_SIZE
	     {
	      B_Conrol_Stat = USB_IDLE;
	      D12_SetEndpointStatus(0, 1);
	      D12_SetEndpointStatus(1, 1);
	     }
	    else 
          B_Conrol_Stat = USB_RECEIVE;
       }
     }

  }
  else if(B_Conrol_Stat == USB_RECEIVE)						
  {
    i =	D12_ReadEndpoint(0, EP0_PACKET_SIZE,ControlData.dataBuffer + ControlData.wCount);
    ControlData.wCount += i;
    if( i != EP0_PACKET_SIZE || ControlData.wCount >= ControlData.wLength) 
    {
      SETBIT(B_D12_Lb,SETUP);
      B_Conrol_Stat = USB_IDLE;
    }
  }
  else
    B_Conrol_Stat = USB_IDLE;
}


void ep0_txdone(void)
{
//    send_leave_num=ControlData.wLength - ControlData.wCount;
  short i = ControlData.wLength - ControlData.wCount;
//  SerialTran(0x33);
//  delay(2);
//  SerialTran(USBTESTN);
//  delay(2);
  D12_ReadLastTransactionStatus(1); // Clear interrupt flag

  if (B_Conrol_Stat != USB_TRANSMIT) 
  {
//   single_transmit(0, 0);			
   return;
  }

  if( i >= EP0_PACKET_SIZE) 
  {
    D12_WriteEndpoint(1, EP0_PACKET_SIZE, ControlData.pData + ControlData.wCount);
    ControlData.wCount += EP0_PACKET_SIZE;
    B_Conrol_Stat = USB_TRANSMIT;
  }
  else if( i != 0) 
  {
    D12_WriteEndpoint(1, i, ControlData.pData + ControlData.wCount);
    ControlData.wCount += i;
    B_Conrol_Stat = USB_IDLE;
  }
  else if (i == 0)
  {
    D12_WriteEndpoint(1, 0, 0); // Send zero packet at the end ???
    B_Conrol_Stat = USB_IDLE;
  }

}

⌨️ 快捷键说明

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