?? d12.h
字號:
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
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)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -