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

📄 isr.c

📁 烧录器的上位机控制程序代码,和下位机程序代码,包括USB通讯固件
💻 C
字号:
#include "define.h"
#include "epphal.h"
#include "d12ci.h"
#include "mainloop.h"
#include "usb100.h"
#include "otp.h"
#include "isr.h"
#include "mainloop.h"
#define VERSION 0x20

unsigned int addr=0;
unsigned char two_ci=0;
unsigned char dir_otp_flash;
bit busb_tx=0;

/*
//*************************************************************************
//  Public static data
//*************************************************************************
*/

EPPFLAGS bEPPflags;

/* Control endpoint TX/RX buffers */
extern CONTROL_XFER ControlData;

/* ISR static vars */
unsigned char idata GenEpBuf[5];
unsigned char idata EpBuf[128];

//USB中断处理
usb_isr() interrupt 0
{
	DISABLE;
	fn_usb_isr();
	ENABLE;

	//==============	自动检测USB设备	
	P3_2=1;
    if (P3_2)
	{
		IT0=0;
	}
	else
	{
		IT0=1;
	}
}

//USB中断服务子程序
void fn_usb_isr()
{
	unsigned int i_st;
    
	bEPPflags.bits.in_isr = 1;
	
	i_st = D12_ReadInterruptRegister();//读取中断寄存器


	if(i_st != 0) {
	
		if(i_st & D12_INT_ENDP0IN)
			ep0_txdone();//端点0IN中断
		
		if(i_st & D12_INT_ENDP0OUT)
			ep0_rxdone();//端点0OUT中断
		if(i_st & D12_INT_ENDP1IN)
			ep1_txdone();//端点1IN中断
		if(i_st & D12_INT_ENDP1OUT)
			ep1_rxdone();//端点1OUT中断
		if(i_st & D12_INT_ENDP2IN)
			main_txdone();//端点2IN中断
		if(i_st & D12_INT_ENDP2OUT)
			main_rxdone();//端点2OUT中断
	}
	
	bEPPflags.bits.in_isr = 0;
	
}


//端点0OUT中断
void ep0_rxdone(void)
{
	unsigned char ep_last, i;
	
	ep_last = D12_ReadLastTransactionStatus(0); //清中断标志
	
	if (ep_last & D12_SETUPPACKET) {
		//接收到SETUP包
		ControlData.wLength = 0;
		ControlData.wCount = 0;
		
		if( D12_ReadEndpoint(0, sizeof(ControlData.DeviceRequest),
			(unsigned char *)(&(ControlData.DeviceRequest))) != sizeof(DEVICE_REQUEST) ) {
			//SETUP包出错,返回
			D12_SetEndpointStatus(0, 1);
			D12_SetEndpointStatus(1, 1);
			bEPPflags.bits.control_state = USB_IDLE;
			return;
		}
		
		ControlData.DeviceRequest.wValue = SWAP(ControlData.DeviceRequest.wValue);
		ControlData.DeviceRequest.wIndex = SWAP(ControlData.DeviceRequest.wIndex);
		ControlData.DeviceRequest.wLength = SWAP(ControlData.DeviceRequest.wLength);
		
		//对控制端点的输入/输出进行应答
		D12_AcknowledgeEndpoint(0);
		D12_AcknowledgeEndpoint(1);
		
		ControlData.wLength = ControlData.DeviceRequest.wLength;
		ControlData.wCount = 0;
		
		if (ControlData.DeviceRequest.bmRequestType & (unsigned char)USB_ENDPOINT_DIRECTION_MASK) {
			//从主机传输数据
			bEPPflags.bits.setup_packet = 1;
			bEPPflags.bits.control_state = USB_TRANSMIT;		/* get command */
		}
		else {
			if (ControlData.DeviceRequest.wLength == 0) {
				bEPPflags.bits.setup_packet = 1;
				bEPPflags.bits.control_state = USB_IDLE;		/* set command */
			}
			else {
				if(ControlData.DeviceRequest.wLength > MAX_CONTROLDATA_SIZE) {
					//接收数据长度为0
					bEPPflags.bits.control_state = USB_IDLE;
					D12_SetEndpointStatus(0, 1);
					D12_SetEndpointStatus(1, 1);
				}
				else {
					bEPPflags.bits.control_state = USB_RECEIVE;	//设置接收状态
				}
			} // set command with data
		} // else set command
	} // if setup packet
	
	else if (bEPPflags.bits.control_state == 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) {
			//数据接收完毕
			bEPPflags.bits.setup_packet = 1;
			bEPPflags.bits.control_state = USB_IDLE;
		}
	}
	else {
		bEPPflags.bits.control_state = USB_IDLE;//进入等待状态
	}
}

//端点0IN处理
void ep0_txdone(void)
{
	short i = ControlData.wLength - ControlData.wCount;
	D12_ReadLastTransactionStatus(1); //清中断标志位
	if (bEPPflags.bits.control_state != USB_TRANSMIT) 
		return;//非发送状态,返回
	
	if( i >= EP0_PACKET_SIZE) {
		//剩下数据大于16字节,发送16字节
		D12_WriteEndpoint(1, EP0_PACKET_SIZE, ControlData.pData + ControlData.wCount);
		ControlData.wCount += EP0_PACKET_SIZE;
		bEPPflags.bits.control_state = USB_TRANSMIT;
	}
	else if( i != 0) {
		//发送剩下数据
		D12_WriteEndpoint(1, i, ControlData.pData + ControlData.wCount);
		ControlData.wCount += i;
		bEPPflags.bits.control_state = USB_IDLE;
	}
	else if (i == 0){
		D12_WriteEndpoint(1, 0, 0); //发送完毕,发送0字节
		bEPPflags.bits.control_state = USB_IDLE;
	}
}

//端点1OUT处理
void ep1_txdone(void)
{
	D12_ReadLastTransactionStatus(3); //清中断标志位

}







//端点1IN处理
void ep1_rxdone(void)
{
	unsigned char len;
    
	D12_ReadLastTransactionStatus(2); //表示清除端点1接收中断标志位
	len = D12_ReadEndpoint(2, sizeof(GenEpBuf), GenEpBuf);//读取数据
	//	if(len != 0)		//???
	//		bEPPflags.bits.ep1_rxdone = 1;//标志接收到数据
    switch (GenEpBuf[0])
	{
	   
	  case 0xa0://下载FILE-->FLASH
		   {
			   addr =0;two_ci =0;
			   dir_otp_flash =1;		//数据在端点2里面接收
		   }
		   break;
	
 		case 0xa1:	//上传OTP-->PC
		   {
			   if(addr==0)
					pulse_read();
			   otp_read_usb(addr);
				P1=P1^0x01;
			   addr++;
			   D12_WriteEndpoint(5, 64, EpBuf);
		   }
		   break;
		   case 0xa3:///读OTP_CONFIG
		   {
			   pulse_read();
			   read_configue();
			   GenEpBuf[1] = EpBuf[0];
			   GenEpBuf[2] = EpBuf[1];
			   D12_WriteEndpoint(3, 3, GenEpBuf);
		   }
		   break;
	   case 0xa4:///写CONFIG(FILE)->OTP及读出回送
		   {
			   EpBuf[0] = GenEpBuf[1];
			   EpBuf[1] = GenEpBuf[2];
			   write_configue(); 
			   pulse_read();
			   read_configue();
			   GenEpBuf[1] = EpBuf[0];
			   GenEpBuf[2] = EpBuf[1];
			   D12_WriteEndpoint(3, 3, GenEpBuf);

		   }
		   break;
	 case 0xa5://表示读FLASH程序   
		   {

				   CE_FLS = 0;//选中FLASH IC
				   for(len=0;len<128;len++)
				   {
					   EpBuf[len] = XBYTE[len+addr*128];
				   }
					P1=P1^0x01;
				   addr++;
				   D12_WriteEndpoint(5, 64, EpBuf);
				   busb_tx=1;
	
		   }
		   break;
		case 0xaa:		//FILE->OTP
		   { 
			   addr =0;two_ci=0;
			   dir_otp_flash = 0;
		   }
		   break;
		  
	   case 0xab://表示加密IC
		   {
			   GenEpBuf[1]=(unsigned char)write_protect();
			   D12_WriteEndpoint(3, 2, GenEpBuf);
		   }
		   break;

	  case 0xac:	//读FLASH的CONFIG
		   {
			   CE_FLS =0;//选中FLASH IC
			   GenEpBuf[1]=XBYTE[0X8000];
			   GenEpBuf[2]=XBYTE[0x8001];
			   GenEpBuf[3]=XBYTE[0X8002];
			   GenEpBuf[4]=XBYTE[0x8003];
			   D12_WriteEndpoint(3, 5, GenEpBuf);
		   }
		   break;
	  
	   case 0xad:		//写FLASH的CONFIG
		   {
			   	  CE_FLS =0;//选中FLASH IC
	              XBYTE[0x5555]=0xaa;
				  XBYTE[0x2aaa]=0x55;
				  XBYTE[0x5555]=0xa0;
				  XBYTE[0x8000]=GenEpBuf[1];
				  XBYTE[0x8001]=GenEpBuf[2];
			 	  XBYTE[0x8002]=GenEpBuf[3];
				  XBYTE[0x8003]=GenEpBuf[4];
				  otp_type=GenEpBuf[4];	//更新otp_type
				  for (len=0;len<124;len++)
				  {
					  XBYTE[0x8004+len]=0xff;
				  }
				  DelayNms(20);
				 GenEpBuf[1]=XBYTE[0X8000];
			  	 GenEpBuf[2]=XBYTE[0x8001];
				GenEpBuf[3]=cal_checksum()/0x100;
				GenEpBuf[4]=cal_checksum()%0x100;
			   D12_WriteEndpoint(3, 5, GenEpBuf);
		
		   }
		   break;

	   case 0x00:		//复位
		   {
			   addr=0;addr=0;two_ci=0;two_ci=0;busb_tx=0;
				D12_WriteEndpoint(3, 1, GenEpBuf);
		   }
		   break;
	   case 0x01:		//收到连机信号,然后初始划
		   {
			   //初始化
			   addr=0;addr=0;two_ci=0;two_ci=0;busb_tx=0;
			   reconnect_USB();
				
		   }
		   break;
	   case 0x02:		//收到buzzer_1信号,然后初始划
		   {
			   //初始化
			   addr=0;two_ci=0;busb_tx=0;
			   D12_WriteEndpoint(3, 1, GenEpBuf);
			   buzzer_1();
		   }
		   break;
	   case 0x03:		//收到buzzer_3信号,然后初始划
		   {
			   //初始化
			   addr=0;two_ci=0;busb_tx=0;
			   D12_WriteEndpoint(3, 1, GenEpBuf);
			   buzzer_3();
		   }
		   break;
		
	   case 0xb0://表示烧录IC,把EE512的程序烧录到PM10P40中
		   {
			   unsigned int adr;
			   unsigned char i;
			   CE_FLS = 0;			//选中FLASH IC	
			   adr=128*GenEpBuf[1];		//start address
			   for(i=0; i<128; i++)
			   {	
				   EpBuf[i]=XBYTE[adr];
				   adr++;		
			   }
			   otp_write(GenEpBuf[1]);
			   P1=P1^0x01;
		   }
		   break;
	   case 0xb1://表示verify_otp(to flash)
		   {
			   unsigned int adr;
			   unsigned char iv;
			   iv=GenEpBuf[1];
			   pulse_read();			//???改善挑片的毛病
			   otp_read(iv);
			   P1=P1^0x01;
			   adr=128*iv;
			  	CE_FLS =0;//选中FLASH IC	
			   for(iv=0; iv<128; iv++)
			   {
				   if(EpBuf[iv]!=XBYTE[adr++])
				   {
					   GenEpBuf[2] = 0x80|iv;
					   D12_WriteEndpoint(3, 3, GenEpBuf);
					   return;
				   }			
			   }			
			   GenEpBuf[2] = 0x00;
			   D12_WriteEndpoint(3, 3, GenEpBuf);
			   return;													
		   }
		   break;
		case 0xb4:
				CE_FLS =0;//选中FLASH IC
				EpBuf[0]=XBYTE[0x8000];
				EpBuf[1]=XBYTE[0x8001];
				nop; nop;				
			   write_configue(); 
			   CE_FLS =0;//选中FLASH IC
			   GenEpBuf[1]=XBYTE[0X8000];
			   GenEpBuf[2]=XBYTE[0x8001];
				D12_WriteEndpoint(3, 3, GenEpBuf);
			break;

	   case 0xb5://VERIFY_OTPconfig(to flash)
		   {
			   EpBuf[0] =0;EpBuf[1] =0;//???
				CE_FLS = 0;			//选中FLASH IC
			   pulse_read();
			   read_configue();
			if (((EpBuf[0]&0xdf)!=(XBYTE[0X8000]&0xdf))||((EpBuf[1]&0xdf)!=(XBYTE[0X8001]&0xdf)))
				GenEpBuf[1]=0xff;
			else
				GenEpBuf[1]=0x00;				
			   D12_WriteEndpoint(3, 2, GenEpBuf);
		   }
		   break;
	   case 0xc0://pin_test
		   {	
			   if (PIN_TEST())
			   {
				   GenEpBuf[1]=1;
			   }
			   else
			   {
				   GenEpBuf[1] = 0;
			   }
			   D12_WriteEndpoint(3, 2, GenEpBuf);
		   }
		   break;
		case 0xc1:
			{
			  GenEpBuf[1] = VERSION;
			   D12_WriteEndpoint(3, 2, GenEpBuf);
			}
			break;
      }
}

//主端点OUT控制
void main_txdone(void)
{
	//	unsigned char len,epstatus;
	D12_ReadLastTransactionStatus(5); //清中断标志

⌨️ 快捷键说明

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