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

📄 usbmainold.c

📁 记录仪
💻 C
📖 第 1 页 / 共 5 页
字号:
#include <reg52.h>
#include <absacc.h>
#include "usbmain.h"
#include "USB100.h"
#include "trans232.h"

extern unsigned char xdata KGL[4000][7];   //开关量数组
extern unsigned int xdata index_KGL;       //开关量数组行下标
extern unsigned char xdata pljssj;           //疲劳驾驶时间
extern unsigned char xdata tcxxsj;           //停车休息时间
/*

extern unsigned char xdata KGL0[400][12];   //开关量0数组
extern unsigned int xdata index_KGL0;       //开关量0数组行下标
extern unsigned char xdata KGL1[400][12];   //开关量1数组
extern unsigned int xdata index_KGL1;       //开关量1数组行下标
extern unsigned char xdata KGL2[400][12];   //开关量2数组
extern unsigned int xdata index_KGL2;       //开关量2数组行下标
extern unsigned char xdata KGL3[400][12];   //开关量3数组
extern unsigned int xdata index_KGL3;       //开关量3数组行下标
extern unsigned char xdata KGL4[400][12];   //开关量4数组
extern unsigned int xdata index_KGL4;       //开关量4数组行下标
extern unsigned char xdata KGL5[400][12];   //开关量5数组
extern unsigned int xdata index_KGL5;       //开关量5数组行下标
*/


extern unsigned char xdata flag_wr_full,flag_wr_empty;
extern unsigned char xdata FLAG_INIT;
extern unsigned char xdata down_time[10][5];
extern unsigned char xdata drvr_drv_time[300][28];
extern unsigned char xdata num_10[10][18];
extern unsigned int xdata index_drv_time,trstimes_temp;   //上一数组的行下标
extern unsigned char xdata index_dw_tm;
extern unsigned char xdata ini_info[5];
unsigned char xdata verify=0;
extern unsigned char xdata tzxs[3];
extern unsigned long int xdata CANSHU;
extern unsigned char xdata MAXSPEED;
extern unsigned long xdata temp_long;
extern unsigned char xdata vin[41];
extern unsigned char xdata ID_product[20];         //产品ID号
extern void Clr_WDog();
extern void Delay(unsigned int c);

extern unsigned char xdata cur_id[25];
extern unsigned char xdata id1[11][25];
extern unsigned char xdata index_id1; //上一数组的行下标
extern bit FL_RUN;
extern bit FL_RECORDER;

extern unsigned char xdata sec_data[10][326];
extern unsigned char xdata sec_hang;


extern unsigned char xdata overtime_rec[21][28] ;
extern unsigned char xdata num_ovrec;

extern unsigned char xdata stop_3day[11] ;

extern unsigned char xdata day_three[3][3] ;
extern unsigned char xdata index_threeday;


sbit P11=P1^1;
sbit P10=P1^0;

extern unsigned char xdata lichen_360h[3] ;
extern unsigned char xdata lichen_2d[3] ;



extern unsigned char xdata MainEpBuf[128] ;                             //接收数据

extern unsigned char xdata MainEpBuf2[512] ;                            //发送数据
extern unsigned char xdata MainEpBuf3[8] ;                               //枚举

extern unsigned char xdata MainEpBuf4[16] ;                              //EP1传送





extern unsigned char xdata OLD_YEAR;
extern unsigned char xdata OLD_MONTH;
extern unsigned char xdata OLD_DAY;
extern unsigned char xdata OLD_HOUR;
extern unsigned char xdata OLD_MIN;
extern unsigned char xdata OLD_SEC;



#define TMIAO XBYTE[0X8000]
#define TFEN XBYTE[0X8002]
#define TSHI XBYTE[0X8004]
#define TRI XBYTE[0X8007]
#define TYUE XBYTE[0X8008]
#define TNIAN XBYTE[0X8009]
#define TCLKA XBYTE[0X800A]
#define TCLKB XBYTE[0X800B]


sbit WDI = P1^2 ;      //看门狗

extern unsigned char xdata * xdata ptr_minaero;
extern unsigned char xdata * xdata ptr_stp_min;
extern unsigned char xdata * xdata ptr_temp;
extern unsigned int  xdata addr_ptr_minaero;
extern unsigned int xdata times_num;

extern unsigned char xdata j_temp,k_temp,l_temp;
extern unsigned int  xdata temp1_all;
extern unsigned int  xdata tmpadd_start_rec;
extern unsigned char xdata temp_date[5];



extern void Clr_WDog();




//usb设备请求

unsigned char xdata trs_cnt_tot _at_ 0x6510;
unsigned char xdata trs_cnt _at_ 0x6511;
unsigned int  xdata trs_cnt_byte _at_ 0x6512;         //分次传速度数据时,计算每次传的字节数
unsigned int  xdata trs_fst_time _at_ 0x6514;
unsigned int  xdata trs_hang _at_ 0x6516;             //传流水记录时的行下标
unsigned int  xdata trs_cnt_size _at_ 0x8017 ;              // usb大数据量传输计算桢数用;  占用8000资源
unsigned int  xdata len_tmp_rec _at_ 0x8019 ;                   //当前桢纪录长度;   在传输时复用记录当前数据个数;
unsigned int  xdata len_tmp_data _at_ 0x801b ;                   //当前桢数据长度
unsigned char xdata trs_jy _at_ 0x805d;                     //校样位;

unsigned char   last_cnt=0;                       //枚举延时用


extern unsigned char xdata flag_trans ;


CONTROL_XFER xdata  ControlData;

EPPFLAGS xdata bEPPflags;



     /*####################################################################################//
     #//////////////////////////////////////////////////////////////////////////////////////#
     #/////////////////////////                              ///////////////////////////////#
     #/////////////////////////             USB              ///////////////////////////////#
     #/////////////////////////                              ///////////////////////////////#
     #//////////////////////////////////////////////////////////////////////////////////////#
     //####################################################################################*/

/**********************************************/
/*****************          *******************/
/***************    描述符    *****************/
/******************         *******************/
/**********************************************/
//设备描述符
code USB_DEVICE_DESCRIPTOR DeviceDescr =
{
    sizeof(USB_DEVICE_DESCRIPTOR),
    USB_DEVICE_DESCRIPTOR_TYPE,
    SWAP(0x0110),
    USB_CLASS_CODE_TEST_CLASS_DEVICE,
    0,
    0,
    EP0_PACKET_SIZE,
    SWAP(0x0471),	//VID
    SWAP(0x0666),	//PID
    SWAP(0x0100),
    0, 			//Manufactory
    0,			//Product
    0,			//Serial Number
    1			//Number of possible configurations     《数据改动》
};

//配置描述符
code USB_CONFIGURATION_DESCRIPTOR ConfigDescr =
{
    sizeof(USB_CONFIGURATION_DESCRIPTOR),
    USB_CONFIGURATION_DESCRIPTOR_TYPE,
    SWAP(CONFIG_DESCRIPTOR_LENGTH),
    1,
    1,
    0,                                                    //《数据改动》!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    0x60,                                                 //《数据改动》!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    0xf0
};

//接口描述符;
code USB_INTERFACE_DESCRIPTOR InterfaceDescr =
{
    sizeof(USB_INTERFACE_DESCRIPTOR),
    USB_INTERFACE_DESCRIPTOR_TYPE,
    0,
    0,
    NUM_ENDPOINTS,
    USB_CLASS_CODE_TEST_CLASS_DEVICE,
    USB_SUBCLASS_CODE_TEST_CLASS_D12,
    USB_PROTOCOL_CODE_TEST_CLASS_D12,
    0
};

//端点描述符---端点1输入;
code USB_ENDPOINT_DESCRIPTOR EP1_TXDescr =
{
	sizeof(USB_ENDPOINT_DESCRIPTOR),
	USB_ENDPOINT_DESCRIPTOR_TYPE,
	0x81,
	USB_ENDPOINT_TYPE_INTERRUPT,
	SWAP(16),                          //《数据改动》!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
	10
};

//端点描述符---端点1输出;
code USB_ENDPOINT_DESCRIPTOR EP1_RXDescr =
{
	sizeof(USB_ENDPOINT_DESCRIPTOR),
	USB_ENDPOINT_DESCRIPTOR_TYPE,
	0x1,
	USB_ENDPOINT_TYPE_INTERRUPT,
	SWAP(16),                         //《数据改动》!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
	10
};

//端点描述符---端点2输入;
code USB_ENDPOINT_DESCRIPTOR EP2_TXDescr =
{
	sizeof(USB_ENDPOINT_DESCRIPTOR),
	USB_ENDPOINT_DESCRIPTOR_TYPE,
	0x82,
	USB_ENDPOINT_TYPE_BULK,
	SWAP(EP2_PACKET_SIZE),
	10
};

//端点描述符---端点2输出;
code USB_ENDPOINT_DESCRIPTOR EP2_RXDescr =
{
	sizeof(USB_ENDPOINT_DESCRIPTOR),
	USB_ENDPOINT_DESCRIPTOR_TYPE,
	0x2,
	USB_ENDPOINT_TYPE_BULK,
	SWAP(EP2_PACKET_SIZE),
	10
};

//USB标准设备请求入口地址指针表
code void (*StandardDeviceRequest[])(void) =
{
	get_status,
	clear_feature,
	reserved,
	set_feature,
	reserved,
	set_address,
	get_descriptor,
	reserved,
	get_configuration,
	set_configuration,
	get_interface,
	set_interface,
	reserved,
	reserved,
	reserved,
	reserved
};

/**********************************************/
/*****************          *******************/
/***************   设备请求   *****************/
/******************         *******************/
/**********************************************/
/*标准设备请求共11个命令,此处只用到其中9个,分别是:get_status,clear_feature,set_feature,set_address,
get_descriptor,get_configuration,set_configuration,get_interface,set_interface, */
/*
typedef union _epp_flags
{
	struct _flags
	{
		unsigned char timer               	: 1;
		unsigned char bus_reset           	: 1;
		unsigned char suspend             	: 1;
		unsigned char setup_packet  	  	: 1;
		unsigned char remote_wakeup		   	: 1;
		unsigned char in_isr		      	: 1;
		unsigned char control_state			: 1;

		unsigned char configuration			: 1;
		unsigned char verbose				: 2;
		unsigned char ep1_rxdone			: 1;
                unsigned char ep2_rxdone                        : 1;
                unsigned char ep2_txdone                        : 1;
		unsigned char dma_state      		: 2;
		unsigned char power_down			: 1; // Smart Board
	} bits;
	unsigned short value;
} EPPFLAGS;
typedef struct _device_request
{
	unsigned char bmRequestType ;
	unsigned char bRequest;
	unsigned short wValue;
	unsigned short wIndex;
	unsigned short wLength;
} DEVICE_REQUEST;

typedef struct _control_xfer
{
	DEVICE_REQUEST DeviceRequest;
	unsigned short wLength;
	unsigned short wCount;
	unsigned char * pData;
	unsigned char dataBuffer[MAX_CONTROLDATA_SIZE];
} CONTROL_XFER;
*/

//-------------------------------------------------------------------------------------------get_status()获取状态
void get_status(void)
{
	unsigned char endp, txdat[2];
        //ControlData.DeviceRequest.bmRequestType为请求类型,USB_RECIPIENT定义为:0x1F
	unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType&USB_RECIPIENT;
        //从bRecipient的低5个位可得出接收方
	unsigned char c;
        Clr_WDog();       //清w-dog
                          //USB_RECIPIENT_DEVICE定义为0X00
	if (bRecipient == USB_RECIPIENT_DEVICE)
        {                                                                       //返回设备状态;
		if(bEPPflags.bits.remote_wakeup == 1)
			txdat[0] = 3;                                           //支持远程唤醒和自供电;
		else
			txdat[0] = 1;                                           //不支持远程唤醒,自供电;
		txdat[1]=0;
		single_transmit(txdat, 2);                                      //发送数据;
	}
        else if (bRecipient == USB_RECIPIENT_INTERFACE)
        {                                                                       //返回接口状态;
		txdat[0]=0;
		txdat[1]=0;
		single_transmit(txdat, 2);                                      //发送数据;
	}
        else if (bRecipient == USB_RECIPIENT_ENDPOINT)
        {                                                                       //返回端点状态;
		endp = (unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
		if (ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
			c = D12_SelectEndpoint(endp*2 + 1);   ///* Control-out */     读取输入端点状态;

		else
			c = D12_SelectEndpoint(endp*2);	      ///* Control-out */     读取输出端点状态;
		if(c & D12_STALL)
			txdat[0] = 1;                         //端点禁止;
		else
			txdat[0] = 0;                         //端点有效;
		txdat[1] = 0;
		single_transmit(txdat, 2);                    //发送数据;
	} else
		stall_ep0();                                  //非标准请求,发STALL;
}

//-----------------------------------------------------------------------------------clear_feature()清除特性
void clear_feature(void)
{
	unsigned char endp;                                                                 //读取请求类型中的接受方;
	unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
        Clr_WDog();       //清w-dog
	if (bRecipient == USB_RECIPIENT_DEVICE
		&& ControlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP)
        {                                                                                   //清除远程唤醒特性;
		DISABLE;
		bEPPflags.bits.remote_wakeup = 0;
		ENABLE;
		single_transmit(0, 0);                                                      //返回应答;
	}
	else if (bRecipient == USB_RECIPIENT_ENDPOINT
		&& ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT_STALL)
        {                                                                                   //清除端点禁止特性,恢复其使用;
		endp = (unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
		if (ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
			// clear TX stall for IN on EPn.   清除输入端点STALL特性;
			D12_SetEndpointStatus(endp*2 + 1, 0);
		else
			// clear RX stall for OUT on EPn.  清除输出端点STALL特性;
			D12_SetEndpointStatus(endp*2, 0);
		single_transmit(0, 0);                    //发送响应;
	}
        else
		stall_ep0();                              //没有该请求,返回STALL;
}

//-----------------------------------------------------------------------------------------set_feature()设置特性
void set_feature(void)
{
	unsigned char endp;                                                                 //读取请求类型中的接受方;
	unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
        Clr_WDog();       //清w-dog
	if (bRecipient == USB_RECIPIENT_DEVICE
		&& ControlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP)
        {                                                                                   //设置远程唤醒特性;
		DISABLE;
		bEPPflags.bits.remote_wakeup = 1;
		ENABLE;
		single_transmit(0, 0);                                                      //发送响应;
	}
	else if (bRecipient == USB_RECIPIENT_ENDPOINT
		&& ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT_STALL)
        {
		endp = (unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
		if (ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
			// clear TX stall for IN on EPn.    设置输入端禁止;
			D12_SetEndpointStatus(endp*2 + 1, 1);
		else
			// clear RX stall for OUT on EPn.   设置输出端禁止;
			D12_SetEndpointStatus(endp*2, 1);
		single_transmit(0, 0);                                                      //发送响应;
	}

⌨️ 快捷键说明

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