代码如下:
//=========================================================================
//函数名:usb_ep_in_transfer
//功 能: USB发送IN包
//参 数: u8EP:端点
// pu8DataPointer:待发数据所在缓冲区首地址
// u8DataSize:待发数据长度
//返 回: 无
//=========================================================================
void usb_ep_in_transfer(uint8 u8EP,uint8 *pu8DataPointer,uint8 u8DataSize)
{
uint8 *pu8EPBuffer;
uint8 u8EPSize;
uint16 u16Lenght=0;
uint8 u8EndPointFlag;
//设置端点所对应的端点描述符
u8EndPointFlag=u8EP;
if(u8EP)
u8EP=(uint8)(u8EP<<2);
u8EP+=2;
// 指向端点的缓冲区
pu8EPBuffer=BufferPointer[u8EP];
//检查是否可以发送数据
if(FLAG_CHK(fIN,gu8USBClearFlags))
{
// 待传输的数据
pu8IN_DataPointer=pu8DataPointer;
gu8IN_Counter=u8DataSize;
u16Lenght=(Setup_Pkt->wLength_h<<8)+Setup_Pkt->wLength_l ;
if((u16Lenght < u8DataSize) && (u8EP==2))
{
gu8IN_Counter=Setup_Pkt->wLength_l;
}
}
// 看看待发送的数据是否大于端点所能发送数据的长度。
if(gu8IN_Counter > cEP_Size[u8EP])
{
u8EPSize = cEP_Size[u8EP];
gu8IN_Counter-=cEP_Size[u8EP];
FLAG_CLR(fIN,gu8USBClearFlags);
}
else
{
u8EPSize = gu8IN_Counter;
gu8IN_Counter=0;
FLAG_SET(fIN,gu8USBClearFlags);
}
// 把待发数据长度写入BDT
tBDTtable[u8EP].Cnt=(u8EPSize);
// 把数据拷贝到BDT 缓冲区
while(u8EPSize--)
*pu8EPBuffer++=*pu8IN_DataPointer++;
// gu8USB_Toogle_flags : 用Data0 和Data1 来跟USB 设备进行同步用的。
// DATA0/DATA1 交替
if(FLAG_CHK(u8EndPointFlag,gu8USB_Toogle_flags))
{
// gu8USB_Toogle_flags : 表示是DATA0 还是DATA1 。1: 表示发送DATA0, 0: 表示发送DATA1.
tBDTtable[u8EP].Stat._byte= kUDATA0;
FLAG_CLR(u8EndPointFlag,gu8USB_Toogle_flags);
}
else
{
tBDTtable[u8EP].Stat._byte= kUDATA1;
FLAG_SET(u8EndPointFlag,gu8USB_Toogle_flags);
}
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>