📄 int.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 + -