CH554 通過端點(diǎn)3上傳數(shù)據(jù)到PC,? 上傳兩字節(jié) 0x03,0x00 到PC ,收到確實(shí)0X6d,0xdf. 不知為何?
#define THIS_ENDP0_SIZE? ? ?DEFAULT_ENDP0_SIZE
#define ENDP1_IN_SIZE 64
#define ENDP2_IN_SIZE 4
#define ENDP3_IN_SIZE 2
#define ENDP3_OUT_SIZE 64
UINT8X? Ep0Buffer[MIN(64,THIS_ENDP0_SIZE+2)]? _at_? 0x0000;? ? //端點(diǎn)0 OUT&IN緩沖區(qū),必須是偶地址
UINT8X? Ep1Buffer[MIN(64,ENDP1_IN_SIZE+2)] _at_? MIN(64,THIS_ENDP0_SIZE+2);? //端點(diǎn)1 IN緩沖區(qū),必須是偶地址
UINT8X? Ep2Buffer[MIN(64,ENDP2_IN_SIZE+2)] _at_ (MIN(64,THIS_ENDP0_SIZE+2)+MIN(64,ENDP1_IN_SIZE+2)); //端點(diǎn)2 IN緩沖區(qū),必須是偶地址
UINT8XEp3Buffer[MIN(64,ENDP3_IN_SIZE+2)+MIN(64,ENDP3_OUT_SIZE+2)] _at_ (MIN(64,THIS_ENDP0_SIZE+2)+MIN(64,ENDP1_IN_SIZE+2)+MIN(64,ENDP2_IN_SIZE+2));? ?//端點(diǎn)3 OUT+IN緩沖區(qū)
//--------------------------------------------------
// Description? : Touch設(shè)備模式配置,設(shè)備模式啟動(dòng),收發(fā)端點(diǎn)配置,中斷開啟
// Input Value? : None
// Output Value : None
//--------------------------------------------------
void CTouchDeviceInit()
{
IE_USB = 0;
USB_CTRL = 0x00;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // 先設(shè)定模式
UDEV_CTRL = bUD_PD_DIS;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// 禁止DP/DM下拉電阻
? UDEV_CTRL &= ~bUD_LOW_SPEED;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//選擇全速12M模式,默認(rèn)方式
? USB_CTRL &= ~bUC_LOW_SPEED;
? UEP0_DMA = Ep0Buffer;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//端點(diǎn)0數(shù)據(jù)傳輸?shù)刂?/span>
? UEP4_1_MOD &= ~(bUEP4_RX_EN | bUEP4_TX_EN);? ? ? ? ? ? ? ? ? ? ?//端點(diǎn)0單64字節(jié)收發(fā)緩沖區(qū)
? ??
? UEP1_DMA = Ep1Buffer;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//端點(diǎn)1數(shù)據(jù)傳輸?shù)刂?/span>
? UEP4_1_MOD = UEP4_1_MOD & ~bUEP1_BUF_MOD | bUEP1_TX_EN;? ? ? ? ?//端點(diǎn)1發(fā)送使能 64字節(jié)緩沖區(qū)
UEP2_DMA = Ep2Buffer;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//端點(diǎn)2數(shù)據(jù)傳輸?shù)刂?/span>
? UEP2_3_MOD = UEP2_3_MOD & ~bUEP2_BUF_MOD | bUEP2_TX_EN;? ? ? ? ?//端點(diǎn)2發(fā)送使能 64字節(jié)緩沖區(qū)
UEP3_DMA = Ep3Buffer;? ? ? ?
UEP2_3_MOD |= bUEP3_TX_EN;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //端點(diǎn)3發(fā)送使能
? UEP2_3_MOD |= bUEP3_RX_EN;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //端點(diǎn)3接收使能
UEP2_3_MOD &= ~bUEP3_BUF_MOD;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//端點(diǎn)3收發(fā)各64字節(jié)緩沖區(qū)
//? UEP3_CTRL = bUEP_AUTO_TOG | UEP_T_RES_NAK | UEP_R_RES_ACK;? ? ? //端點(diǎn)3自動(dòng)翻轉(zhuǎn)同步標(biāo)志位,IN事務(wù)返回NAK,OUT返回ACK
USB_DEV_AD = 0x00;
USB_CTRL |= bUC_DEV_PU_EN | bUC_INT_BUSY | bUC_DMA_EN;? ? ? ? ? // 啟動(dòng)USB設(shè)備及DMA,在中斷期間中斷標(biāo)志未清除前自動(dòng)返回NAK
UDEV_CTRL |= bUD_PORT_EN;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// 允許USB端口
USB_INT_FG = 0xFF;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // 清中斷標(biāo)志
USB_INT_EN = bUIE_SUSPEND | bUIE_TRANSFER | bUIE_BUS_RST;
IE_USB = 1;
}
case UIS_TOKEN_IN | 3:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //endpoint 3# 中斷端點(diǎn)上傳
? ? ? ? ? ? UEP3_T_LEN = 0;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//預(yù)使用發(fā)送長度一定要清空
//? ? ? ? ? ? UEP3_CTRL ^= bUEP_T_TOG;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //手動(dòng)翻轉(zhuǎn)同步標(biāo)志位
? ? ? ? ? ? UEP3_CTRL = UEP3_CTRL & ~ MASK_UEP_T_RES | UEP_T_RES_NAK;? ? ? ? ? ?//默認(rèn)應(yīng)答NAK
? ? ? ? ? ? Endp3Busy = 0;
? ? ? ? ? ? break;
case UIS_TOKEN_OUT | 3:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // endpoint 3# 批量端點(diǎn)下傳
if ( U_TOG_OK ) {? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // 不同步的數(shù)據(jù)包將丟棄
//UEP3_CTRL ^= bUEP_R_TOG;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // 手動(dòng)翻轉(zhuǎn)
len = USB_RX_LEN;
printf("KeyLength:%d\n",len);
if(len == 1)
{
CTouchUploadKeyInfo();
}
else
{
/*
printf("Key:");
for ( i = 0; i < len; i ++ )?
{
printf("x%02X ",(UINT16)(Ep3Buffer[i]) );
}
printf("\n");
CTouchSaveKeyInfo();
*/
}
}
break;
//--------------------------------------------------
// Description? : key upload
// Input Value? : None
// Output Value : None
//--------------------------------------------------
void Enp3IntIn( )
{
memcpy( Ep3Buffer, KeyData, sizeof(KeyData));?
? if( TouchDeviceReady )
{
? UEP3_T_LEN = sizeof(KeyData);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //上傳數(shù)據(jù)長度
? ? ? ? UEP3_CTRL = UEP3_CTRL & ~ MASK_UEP_T_RES | UEP_T_RES_ACK;? ? ?//有數(shù)據(jù)時(shí)上傳數(shù)據(jù)并應(yīng)答ACK
? ? ? ? Endp3Busy = 1;?
}
}
void CTouchUploadKeyInfo()
{
//需要返回的2字節(jié)報(bào)告的緩沖
?UINT8 Buf[2]={0,0};
?Buf[0] = 0x03;??
?Buf[1] = 0x00;
?while( Endp3Busy )
?{
? ? ;? //如果忙(上一包數(shù)據(jù)沒有傳上去),則等待。
?}
?
?memcpy(KeyData,Buf,2);?
?Enp3IntIn();
}