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

📄 d12.h

📁 经过改进之后的CAN-USB接口卡固件程序
💻 H
📖 第 1 页 / 共 2 页
字号:
void Output(UINT addr, UCHAR data)
{	
	if(addr == D12_DATA_HARD)
		D12_A0_0;
	else
		D12_A0_1;	
	
	D12_CMD = data;
}

UINT Input()
{
	D12_A0_0;	
	
	return D12_DATA;
}

//设置地址使能
void D12_SetAddressEnable(UINT bAddress, UCHAR bEnable)
{
	Output(D12_CMD_HARD , 0xD0);//输出指令
	if(bEnable)
		bAddress |= 0x80;
	
	Output(D12_DATA_HARD , bAddress);//设置地址
}


//设置端点使能
void D12_SetEndpointEnable(UCHAR bEnable)
{
	Output(D12_CMD_HARD , 0xD8);//输出指令
	
	if(bEnable)
		Output(D12_DATA_HARD , 1);//设置端点允许
	else
		Output(D12_DATA_HARD , 0);//设置端点禁止
}

//模式设置
void D12_SetMode(UCHAR bConfig, UCHAR bClkDiv)
{
	Output(D12_CMD_HARD , 0xF3);//设置模式
	Output(D12_DATA_HARD , bConfig);
	Output(D12_DATA_HARD , bClkDiv);
}

//读取中断寄存器
UCHAR D12_ReadInterruptRegister(void)
{
	unsigned int b1;
	unsigned int j;

	Output(D12_CMD_HARD , 0xF4);//读取中断寄存器
	b1 = Input();
	j = Input();

	j <<= 8; 
	j = j & 0xFF00;
	b1 = b1 & 0x00FF;
	j += b1;

	return j;
}

//端点选择
UCHAR D12_SelectEndpoint(UCHAR bEndp)
{
	UCHAR c;

	Output(D12_CMD_HARD , bEndp);//端点选择
	c = Input();

	return c;
}
    
//读取最后传输状态
UCHAR D12_ReadLastTransactionStatus(UCHAR bEndp)
{
	Output(D12_CMD_HARD , 0x40 + bEndp);//返回最后传输状态
	return Input();
}


//读取端点状态
UCHAR D12_ReadEndpointStatus(UCHAR bEndp)
{
	UCHAR c;

	Output(D12_CMD_HARD , 0x80 + bEndp);//读取端点状态
	c = Input();

	return c;
}    

//设置端点状态
void D12_SetEndpointStatus(UCHAR bEndp, UCHAR bStalled)
{
	Output(D12_CMD_HARD , 0x40 + bEndp);//设置端点状态
	Output(D12_DATA_HARD , bStalled);
}

//读取端点数据
UINT D12_ReadEndpoint(UCHAR endp, UINT len, UCHAR * buf)
{
	UINT i, j;

	Output(D12_CMD_HARD , endp);
	if((Input() & 0x01) == 0)
		return 0;

	Output(D12_CMD_HARD , 0xF0);
	j = Input();
	j = Input();

	if(j > len)
		j = len;

	for(i=0; i<j; i++)
    {
		*(buf+i) = Input();
    }    	
	
	Output(D12_CMD_HARD , 0xF2);

	return j;
}


//写端点
UINT D12_WriteEndpoint(UCHAR endp, UINT len, UCHAR * buf)//
{
	UCHAR i;

	Output(D12_CMD_HARD , endp);
	i = Input();

	Output(D12_CMD_HARD , 0xF0);
	Output(D12_DATA_HARD , 0);
	Output(D12_DATA_HARD , len);


	for(i=0; i<len; i++){
		Output(D12_DATA_HARD , *(buf+i));
        }

	Output(D12_CMD_HARD , 0xFA);

	return len;
}

//设置端点应答
void D12_AcknowledgeEndpoint(UCHAR endp)
{
	Output(D12_CMD_HARD , endp);
	Output(D12_CMD_HARD , 0xF1);
	if(endp == 0)
		Output(D12_CMD_HARD , 0xF2);
}

UINT D12_ReadChipID()
{
	UINT i,j;
	Output(D12_CMD_HARD , 0xFD);
	i=Input();
	j=Input();
	i = (0x00FF & i) + (0xFF00 & (j<<8));
	
	return i;
}

//////////////////////

//发送端点号1建立代码
void code_transmit(UCHAR * pRomData, UINT len)
{
	EP0_Request_wCount = 0;
	if(EP0_Request_wLength > len)
		EP0_Request_wLength = len;

	EP0_Request_PData = pRomData;
	if( EP0_Request_wLength >= 16)
    {
		D12_WriteEndpoint(1, 16, EP0_Request_PData);//发送16字节数据
		EP0_Request_wCount += 16;
	    EP0_state = TRANSMIT;
	}
	else
    {
		D12_WriteEndpoint(1, EP0_Request_wLength, pRomData);//发送16字节内数据
		EP0_Request_wCount += EP0_Request_wLength;
        EP0_state = IDLE;
	}
}

//返回stall应答
void stall_ep0(void)
{
	D12_SetEndpointStatus(0, 1);
	D12_SetEndpointStatus(1, 1);
}

//从端点号1发送数据
void single_transmit(UCHAR * buf, UINT len)
{
	if( len <= 16) {
		D12_WriteEndpoint(1, len, buf);
	}
}

//获取描述符
void get_descriptor(void)
{
	UINT bDescriptor = device_request.wValue>>8;

	if (bDescriptor == 0x01) {//获取设备描述符
		code_transmit(DeviceDescr, 18);
	} else if (bDescriptor == 0x02) {//获取配置描述符
		code_transmit(ConfigDescr, 0x2e);
	} else
		stall_ep0();
}

//设置地址
void set_address(void)
{
	D12_SetAddressEnable(device_request.wValue,1);
	single_transmit(0, 0);
}

//设置配置状态
void set_configuration(void)
{
	if (device_request.wValue == 0) //设备进入未配置状态
    {
		single_transmit(0, 0);
		D12_SetEndpointEnable(0);
	}
    else if (device_request.wValue == 1)  //配置设备
    {
    	USB_D12_OK = 1;
		single_transmit(0, 0);
		D12_SetEndpointEnable(1);
	}
    else
		stall_ep0();
}  

void Set_Interface()
{
    if (device_request.wValue == 0 && device_request.wIndex == 0)
		single_transmit(0, 0);
	else
		stall_ep0();
}

UINT GML = 0;
void Get_Max_Lun()
{
    D12_SetEndpointEnable(1);
    //single_transmit(&GML, 1);
    D12_WriteEndpoint(1, 1, &GML);
}

#define CMD_EXE_SUCCESS		0xAB
#define CMD_EXE_FAILED		0x00

#define ONLY_CAN0					0x00
#define ONLY_CAN1					0x01
#define CAN0_AND_CAN1				0x02

#define CMD_OPEN_OR_CLOSE			0x01
#define CMD_SET_BTR					0x02
#define CMD_REQ_TEST				0x0E

#define VLU_CLOSE_CAN				0x00
#define VLU_OPEN_CAN				0x01

#define	VLU_BTR_125k				0xD887
#define	VLU_BTR_250k				0xD883
#define	VLU_BTR_500k				0xD881

void LW_Request(UINT req)//req是一个字节
{	
	UINT len = 0;
	
	if(device_request.bmRequestType & 0x80)//PC需要设备向上传输数据
	{
		CMD_EXE_STATUS[0] = device_request.bRequest;
		CMD_EXE_STATUS[1] = (UCHAR)device_request.wValue;
		CMD_EXE_STATUS[2] = (UCHAR)(device_request.wValue>>8);
		CMD_EXE_STATUS[3] = (UCHAR)device_request.wIndex;
		CMD_EXE_STATUS[4] = (UCHAR)(device_request.wIndex>>8);
		CMD_EXE_STATUS[5] = 0;//保留
		CMD_EXE_STATUS[6] = 0;//保留
		CMD_EXE_STATUS[7] = CMD_EXE_FAILED;
		
		switch(req)
		{			
			case CMD_REQ_TEST://(测试使用的)
				EP0_Request_PData = my_buf;
				
				if(EP0_Request_wLength > 16)
				{
					single_transmit(EP0_Request_PData, 16);	
					EP0_Request_wCount += 16;
					EP0_state = TRANSMIT;
				}
				else if(EP0_Request_wLength != 0)
				{
					single_transmit(EP0_Request_PData, EP0_Request_wLength);	
					EP0_Request_wCount += EP0_Request_wLength;
					EP0_state = IDLE;
				}
				else if(EP0_Request_wLength == 0)
				{
					D12_WriteEndpoint(1, 0, 0);
					EP0_state = IDLE;
				}
				break;
			case CMD_OPEN_OR_CLOSE://注意:这里要求返回的字节数一定是8
			
				USB_Packet[0].USB_Packet_struct.CAN_frame_num = 0;
				USB_Packet[1].USB_Packet_struct.CAN_frame_num = 0;
				
				if(device_request.wIndex == ONLY_CAN0)
				{
					if(device_request.wValue == VLU_OPEN_CAN)
					{
						CAN0RIER = 0x01;//使能CAN0接受中断	
						CAN0_RX_LED_ON;
					}
					else if(device_request.wValue == VLU_CLOSE_CAN)
					{
						CAN0RIER = 0x00;//
						CAN0_RX_LED_OFF;
					}
				}
				else if(device_request.wIndex == ONLY_CAN1)
				{
					if(device_request.wValue == VLU_OPEN_CAN)
					{
						CAN1RIER = 0x01;//使能CAN1接受中断	
						CAN1_RX_LED_ON;
					}
					else if(device_request.wValue == VLU_CLOSE_CAN)
					{
						CAN1RIER = 0x00;//
						CAN1_RX_LED_OFF;
					}
				}
				else if(device_request.wIndex == CAN0_AND_CAN1)
				{
					if(device_request.wValue == VLU_OPEN_CAN)
					{
						CAN0RIER = 0x01;
						CAN1RIER = 0x01;	
						CAN0_RX_LED_ON;
						CAN1_RX_LED_ON;
					}
					else if(device_request.wValue == VLU_CLOSE_CAN)
					{
						CAN0RIER = 0x00;
						CAN1RIER = 0x00;	
						CAN0_RX_LED_OFF;
						CAN1_RX_LED_OFF;
					}

⌨️ 快捷键说明

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