📄 usbmainold.c
字号:
if(i_st & 0x10) // 端点2输入 //0x10
main_rxdone();
}
bEPPflags.bits.in_isr = 0;
}
//端点0 out中断;
void ep0_rxdone(void)
{
unsigned char xdata ep_last, i;
unsigned char size_tmp=0,size_cnt;
unsigned int xdata dq_tmp=0,dq_tmp2;
unsigned char type, req;
Clr_WDog(); //清w-dog
usbclk_cnt=0;
ep_last = D12_ReadLastTransactionStatus(0); // Clear interrupt flag 清端点0中断标志;
MainEpBuf4[last_cnt]=ep_last;
last_cnt++;
MainEpBuf4[last_cnt]=last_cnt;
last_cnt++;
if (ep_last & D12_SETUPPACKET) //0x20收到setup包;
{
ControlData.wLength = 0;
ControlData.wCount = 0;
size_cnt=sizeof(ControlData.DeviceRequest);
size_tmp=D12_ReadEndpoint(0, sizeof(ControlData.DeviceRequest), MainEpBuf3);
if( size_tmp != sizeof(DEVICE_REQUEST) )
{
D12_SetEndpointStatus(0, 1);
D12_SetEndpointStatus(1, 1);
bEPPflags.bits.control_state = USB_IDLE;
return;
}
ControlData.DeviceRequest.bmRequestType=MainEpBuf3[0];
ControlData.DeviceRequest.bRequest=MainEpBuf3[1];
dq_tmp2=MainEpBuf3[3];
dq_tmp=(dq_tmp2<<8);
dq_tmp2= MainEpBuf3[2]+dq_tmp;
ControlData.DeviceRequest.wValue=dq_tmp2;
dq_tmp2=MainEpBuf3[5];
dq_tmp=(dq_tmp2<<8);
dq_tmp2= MainEpBuf3[4]+dq_tmp;
ControlData.DeviceRequest.wIndex=dq_tmp2;
dq_tmp2=MainEpBuf3[7];
dq_tmp=(dq_tmp2<<8);
dq_tmp= MainEpBuf3[6]+dq_tmp2;
ControlData.DeviceRequest.wLength=dq_tmp;
//控制输出端点发送应答建立命令以重新使能下一个建立阶段
D12_AcknowledgeEndpoint(0); //应答控制端点输入输出;
D12_AcknowledgeEndpoint(1);
ControlData.wLength = ControlData.DeviceRequest.wLength;
ControlData.wCount = 0;
//需要证实控制传输是控制读还是写,如果是读:
//如果控制传输是一个控制读类型那就是说器件需要在下一个数据阶段向
//主机发回数据包.MCU需要设置一个标志以指示USB 设备现在正处于传输
//模式即准备在主机发送请求时发送数据
if (ControlData.DeviceRequest.bmRequestType & 0x80)
{
bEPPflags.bits.setup_packet = 1;
bEPPflags.bits.control_state = USB_TRANSMIT; // get command 书中为USB_TRANSMIT;
}
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)
{
bEPPflags.bits.control_state = USB_IDLE;
D12_SetEndpointStatus(0, 1);
D12_SetEndpointStatus(1, 1);
}
else
{
bEPPflags.bits.control_state = USB_RECEIVE; /* set command with OUT token */
}
} // 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;
}
if (bEPPflags.bits.setup_packet)
{
bEPPflags.bits.setup_packet = 0;
type = ControlData.DeviceRequest.bmRequestType & USB_REQUEST_TYPE_MASK; //0x60 usb请求类型
req = ControlData.DeviceRequest.bRequest & USB_REQUEST_MASK; //0x0F
if (type == 0x00) //USB_STANDARD_REQUEST) //标准请求0x00
(*StandardDeviceRequest[req])();
else
stall_ep0();
//移植到中断中
} // if setup_packet
}
void ep0_txdone(void)
{
short i=0;
Clr_WDog(); //清w-dog
usbclk_cnt=0;
i = ControlData.wLength - ControlData.wCount;
D12_ReadLastTransactionStatus(1); // Clear interrupt flag
if (bEPPflags.bits.control_state != USB_TRANSMIT)
{
return;
}
if( i >= EP0_PACKET_SIZE)
{
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); // Send zero packet at the end ???
bEPPflags.bits.control_state = USB_IDLE;
}
}
//端点1IN处理
void ep1_txdone(void)
{
unsigned char xdata len;
Clr_WDog(); //清w-dog
usbclk_cnt=0;
D12_ReadLastTransactionStatus(3); /* Clear interrupt flag */
len = D12_WriteEndpoint(3, 3, MainEpBuf4);
}
//端点1OUT处理
void ep1_rxdone(void)
{
unsigned char xdata len;
Clr_WDog(); //清w-dog
usbclk_cnt=0;
flag_trans=1;
D12_ReadLastTransactionStatus(2); /* Clear interrupt flag */
len = D12_ReadEndpoint(2, 16, MainEpBuf4);
if(len != 0)
bEPPflags.bits.ep1_rxdone = 1;
}
//端点2IN处理
void main_txdone(void)
{ Clr_WDog(); //清w-dog
flag_trans=1;
usbclk_cnt=0;
D12_ReadLastTransactionStatus(5); /* Clear interrupt flag */
bEPPflags.bits.ep2_txdone = 1;
}
//端点2OUT处理
void main_rxdone(void)
{
unsigned char xdata len,len1;
Clr_WDog(); //清w-dog
usbclk_cnt=0;
flag_trans=1;
D12_ReadLastTransactionStatus(4); /* Clear interrupt flag */
len = D12_ReadEndpoint(4, 64, MainEpBuf );
if(len != 0)
{
len1 = D12_ReadEndpoint(4, 64, MainEpBuf+0x40);
bEPPflags.bits.ep2_rxdone = 1;
len++;
}
}
//*********************************************************************//
//**************************** ****************************//
//**************************** 数据整理 ****************************//
//**************************** ****************************//
//*********************************************************************//
void unpack(void)
{
Clr_WDog(); //清w-dog
recv_beg1 =MainEpBuf[0];
recv_beg2 =MainEpBuf[1];
recv_cmd =MainEpBuf[2];
recv_size =MainEpBuf[4];
recv_baoliu=MainEpBuf[5];
}
void check_pack(void)
{
unsigned char xdata len,i,j;
Clr_WDog(); //清w-dog
len=recv_size+6;
j=0;
if(recv_beg1!=0xaa)
{
error=1;
return;
}
if(recv_beg2!=0x75)
{
error=1;
return;
}
for(i=0;i<len;i++)
{ Clr_WDog(); //清w-dog
j=j^MainEpBuf[i];
}
if(j!=MainEpBuf[len])
{
error=1;
}
}
//--------------------------------------------------------------------------------------------上载速度数据
void trsusb_rate(unsigned int xiaoshi)
{
//由于速度数据太大,一次难以传送完全,所以分次打包上传,1次传1个小时
unsigned char xdata k,ind_buf2;
unsigned char j;
Clr_WDog(); //清w-dog
if(trs_cnt_size==0) return;
if(trs_cnt_tot)
{
trs_cnt_tot=0;
if(trs_fst_time) //第1次调,计算出共有多少条记录
{
ptr_temp=ptr_stp_min;
if(flag_wr_empty==0) //数据区为空,则发空数据包
{
trs_jy=packdata(0);
MainEpBuf2[6]=trs_jy; //发1个空数据包,立即返回
k= D12_WriteEndpoint5(64); //发送
trs_cnt_size=0;
return;
}
if(flag_wr_full==1) //已写满数据区
{
if(xiaoshi==360) trstimes_temp=360;
else
{
//先指向48小时前的数据
if(ptr_temp>=0x1c30) //已超过48小时记录
ptr_temp-=0xc30;
else
{
temp1_all=ptr_temp;
ptr_temp=0x4F38+temp1_all; //ptr_temp=0x6b68-(0xc30-(temp1_all-0x1000))=0x4F38+temp1_all
}
trstimes_temp=48;
}
}
else //未写满数据区
{
if(xiaoshi==360)
{
temp1_all=ptr_temp;
trstimes_temp=(temp1_all-0X1000)/65;
ptr_temp=0x1000;
}
else
{
if(ptr_temp>=0x1c30) //已超过48小时记录
{
//先指向48小时前的数据
ptr_temp-=0xc30;
trstimes_temp=48;
}
else
{
temp1_all=ptr_temp;
trstimes_temp=(temp1_all-0X1000)/65;
ptr_temp=0x1000;
}
}
}
trs_cnt_size=65*trstimes_temp;//共有trstimes_temp条记录,字节数为trs_cnt_size
trs_fst_time=0;
}
trs_jy=packdata(65); //每次传1个小时的数据,共65个字节
for(ind_buf2=6;ind_buf2<64;ind_buf2++)
{ Clr_WDog(); //清w-dog
P11=0;
P10=0;
j=*ptr_temp;
ptr_temp++;
P11=1;
P10=1;
MainEpBuf2[ind_buf2]=j;
trs_jy^=j;
}
k = D12_WriteEndpoint5(64); //发送
}
else //发送剩下的数据
{
for(ind_buf2=0;ind_buf2<7;ind_buf2++)
{ Clr_WDog(); //清w-dog
P11=0;
P10=0;
j=*ptr_temp;
ptr_temp++;
P11=1;
P10=1;
MainEpBuf2[ind_buf2]=j;
trs_jy^=j;
}
Clr_WDog();//喂狗
trs_cnt_tot=1;
if(ptr_temp>=0X6B68) ptr_temp=0X1000;
trs_cnt_size-=65;
MainEpBuf2[7]=trs_jy;
k = D12_WriteEndpoint5(64); //发送
}
}
//--------------------------------------------------------------------------------上载驾驶员的流水记录
void trsusb_num_rate(unsigned int xiaoshi)
{
unsigned char xdata k,ind_buf2;
Clr_WDog(); //清w-dog
if(FL_RECORDER) //已经发送过流水记录
{
trs_cnt_size=1;
trs_fst_time=1;
trs_cnt_tot=1;
switch(xiaoshi)
{
case 360:
recv_cmd=0X05;
trsusb_rate(360); //上载360小时速度
break;
case 48:
recv_cmd=0X09;
trsusb_rate(48); //上载48小时速度
break;
}
return;
}
else
{
if(trs_cnt_size>=8400)
{
FL_RECORDER=1;
return;//流水记录发送完毕
}
//发驾驶员的流水记录,流水记录共8400个字节,分30次发完
if(trs_cnt_tot) //开始发280个字节
{
trs_cnt_tot=0;
trs_cnt_byte=0;
if(trs_fst_time) //第1次发数据
{
trs_fst_time=0;
trs_hang=(index_drv_time+1)%300; //指向最老的记录
}
trs_jy=packdata(280); //每次传280个字节
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -