📄 usb_function.c
字号:
/* 参数: */
/* 无 */
/****************************************************************/
void EndptOut4EvHndler(void)
{
USB_EVENT_MASK mask;
mask = USB_getEvents((USB_EpHandle)&EndptObjOut4);
if(mask & USB_EVENT_EOT)
{
mask = 0;
usbflag = USB_BULK4_READ;
}
}
/****************************************************************/
/* 函数名: EndptIn5EvHndler() */
/* 功能: 对5509片上的USB节点In5的中断事件进行处理 */
/* 参数: */
/* 无 */
/****************************************************************/
void EndptIn5EvHndler(void)
{
/* 获取当前的中断状态 */
//USB_EVENT_MASK mask;
//mask = USB_getEvents((USB_EpHandle)&EndptObjIn5);
// 没有使能中断,如果用户使能了块输入节点中断,那么可以在这添加中断处理函数
}
/****************************************************************/
/* 函数名: EndptOut5EvHndler() */
/* 功能: 对5509片上的USB节点Out5的中断事件进行处理 */
/* 参数: */
/* 无 */
/****************************************************************/
void EndptOut5EvHndler(void)
{
USB_EVENT_MASK mask;
mask = USB_getEvents((USB_EpHandle)&EndptObjOut5);
if(mask & USB_EVENT_EOT)
{
mask = 0;
usbflag = USB_BULK5_READ;
}
}
/****************************************************************/
/* 函数名: EndptIn6EvHndler() */
/* 功能: 对5509片上的USB节点In6的中断事件进行处理 */
/* 参数: */
/* 无 */
/****************************************************************/
void EndptIn6EvHndler(void)
{
/* 获取当前的中断状态 */
//USB_EVENT_MASK mask;
//mask = USB_getEvents((USB_EpHandle)&EndptObjIn6);
// 没有使能中断,如果用户使能了块输入节点中断,那么可以在这添加中断处理函数
}
/****************************************************************/
/* 函数名: EndptOut6EvHndler() */
/* 功能: 对5509片上的USB节点Out6的中断事件进行处理 */
/* 参数: */
/* 无 */
/****************************************************************/
void EndptOut6EvHndler(void)
{
USB_EVENT_MASK mask;
mask = USB_getEvents((USB_EpHandle)&EndptObjOut6);
if(mask & USB_EVENT_EOT)
{
mask = 0;
usbflag = USB_BULK6_READ;
}
}
/****************************************************************/
/* 函数名: EndptIn7EvHndler() */
/* 功能: 对5509片上的USB节点In7的中断事件进行处理 */
/* 参数: */
/* 无 */
/****************************************************************/
void EndptIn7EvHndler(void)
{
/* 获取当前的中断状态 */
//USB_EVENT_MASK mask;
//mask = USB_getEvents((USB_EpHandle)&EndptObjIn7);
// 没有使能中断,如果用户使能了块输入节点中断,那么可以在这添加中断处理函数
}
/****************************************************************/
/* 函数名: EndptOut7EvHndler() */
/* 功能: 对5509片上的USB节点Out7的中断事件进行处理 */
/* 参数: */
/* 无 */
/****************************************************************/
void EndptOut7EvHndler(void)
{
USB_EVENT_MASK mask;
mask = USB_getEvents((USB_EpHandle)&EndptObjOut7);
if(mask & USB_EVENT_EOT)
{
mask = 0;
usbflag = USB_BULK7_READ;
}
}
/****************************************************************/
/* 函数名: USB_ReceivData() */
/* 功能: 接收指定块输出传输节点的数据 */
/* 参数: */
/* EpNum----USB CSL定义的节点号 */
/* *DataPtr-指向接收数据缓冲区的指针 */
/* *ByteCnt-指向存储接收到的总字节个数的变量地址 */
/* 返回值: 如果成功,返回USB_TURE,否则返回USB_FALSE */
/****************************************************************/
USB_Boolean USB_ReceivData(USB_EpNum EpNum, Uint16 *DataPtr, Uint16 *ByteCnt)
{
Uint16 i, Offset;
Uint16 SourAdd;
USB_Boolean State = USB_FALSE;
switch(EpNum)
{
case USB_OUT_EP1:
*ByteCnt = USBO1CTX_ADDR&0x7F; // 获取接收到的字节长度
Offset = USBO1XBUF_ADDR; // 获取缓冲基地址
USBOD1CTL_ADDR |= DMA_GO;
break;
case USB_OUT_EP2:
*ByteCnt = USBO2CTX_ADDR&0x7F; // 获取接收到的字节长度
Offset = USBO2XBUF_ADDR; // 获取缓冲基地址
USBOD2CTL_ADDR |= DMA_GO;
break;
case USB_OUT_EP3:
*ByteCnt = USBO3CTX_ADDR&0x7F; // 获取接收到的字节长度
Offset = USBO3XBUF_ADDR; // 获取缓冲基地址
USBOD3CTL_ADDR |= DMA_GO;
break;
case USB_OUT_EP4:
*ByteCnt = USBO4CTX_ADDR&0x7F; // 获取接收到的字节长度
Offset = USBO4XBUF_ADDR; // 获取缓冲基地址
USBOD4CTL_ADDR |= DMA_GO;
break;
case USB_OUT_EP5:
*ByteCnt = USBO5CTX_ADDR&0x7F; // 获取接收到的字节长度
Offset = USBO5XBUF_ADDR; // 获取缓冲基地址
USBOD5CTL_ADDR |= DMA_GO;
break;
case USB_OUT_EP6:
*ByteCnt = USBO6CTX_ADDR&0x7F; // 获取接收到的字节长度
Offset = USBO6XBUF_ADDR; // 获取缓冲基地址
USBOD6CTL_ADDR |= DMA_GO;
break;
case USB_OUT_EP7:
*ByteCnt = USBO7CTX_ADDR&0x7F; // 获取接收到的字节长度
Offset = USBO7XBUF_ADDR; // 获取缓冲基地址
USBOD7CTL_ADDR |= DMA_GO;
break;
default:
return State;
}
SourAdd = USBMOD_ADDR + (Offset<<4); // 获取缓冲地址
for(i=0; i<*ByteCnt; i++)
{
*DataPtr++ = (*(volatile ioport Uint16*)SourAdd);
SourAdd++;
}
State = USB_TRUE;
return State;
}
/****************************************************************/
/* 函数名: USB_SendData() */
/* 功能: 向指定块输入传输节点发送数据 */
/* 参数: */
/* hEp------指向一个已经初始化的节点对象的句柄 */
/* ByteCnt--欲发送的总字节个数 */
/* *DataPtr-指向数据缓冲区的指针 */
/* Flags----USB数据传输标志的或组合 */
/* 返回值: 如果成功,返回USB_TURE,否则返回USB_FALSE */
/****************************************************************/
USB_Boolean USB_SendData(USB_EpHandle hEp, Uint16 ByteCnt, void *DataPtr, USB_IOFLAGS Flags)
{
USB_Boolean State;
/* 发送数据 */
State = USB_postTransaction( hEp,ByteCnt,(Uint16 *)DataPtr,Flags );
if(!State)
return State;
/* 结束数据发送状态,发出一个In型的数据包 */
State = USB_postTransaction( &EndptObjIn0,0,NULL,USB_IOFLAG_NONE);
return State;
}
/****************************************************************/
/* 函数名: USB_EnableDInt() */
/* 功能: 使能块输出节点(OUT1-OUT7)中断 */
/* 参数: */
/* hEp[]---指向一个NULL终止的已经初始化的节点对象 */
/* 句柄数组 */
/****************************************************************/
void USB_EnableDInt(USB_EpHandle hEp[])
{
Uint16 i, EpIndex;
for(i=0; hEp[i]!=NULL; i++)
{
EpIndex = (Uint16)hEp[i]->EpNum;
if((EpIndex<=0x07)&&(EpIndex>=0x01))
{
switch(EpIndex)
{
case USB_OUT_EP1:
USBOD1CTL_ADDR |= DMA_GO;
break;
case USB_OUT_EP2:
USBOD2CTL_ADDR |= DMA_GO;
break;
case USB_OUT_EP3:
USBOD3CTL_ADDR |= DMA_GO;
break;
case USB_OUT_EP4:
USBOD4CTL_ADDR |= DMA_GO;
break;
case USB_OUT_EP5:
USBOD5CTL_ADDR |= DMA_GO;
break;
case USB_OUT_EP6:
USBOD6CTL_ADDR |= DMA_GO;
break;
case USB_OUT_EP7:
USBOD7CTL_ADDR |= DMA_GO;
break;
default:
break;
}
}
}
}
/****************************************************************/
/* 函数名: USB_InitConfig() */
/* 功能: 对5509片上的USB进行初始化配置 */
/* 参数: */
/* hEp[]---指向一个NULL终止的已经初始化的节点对象 */
/* 句柄数组 */
/* EpIn0EventMark----输入控制节点中断事件的或组合 */
/* EpOut0EventMark---输出控制节点中断事件的或组合 */
/****************************************************************/
void USB_InitConfig(USB_EpHandle hEp[], Uint16 EpIn0EventMark, Uint16 EpOut0EventMark)
{
/* Set IVPH/IVPD to start of interrupt vector table */
IRQ_setVecs((Uint32)(&VECSTART));
/* 初始化API */
USB_setAPIVectorAddress();
/* 设置USB的时钟,运行在48MHz */
USB_initPLL(12,48,0);
/* 进行USB的节点初始化 */
USB_EndpointInit(EpIn0EventMark,EpOut0EventMark);
/* 进行USB的初始化 */
while(!(USB_init(USB0,hEp,0) == USB_TRUE)){};
/* 设置寄存器ST1的INTM位,使能所有的中断 */
IRQ_globalEnable();
/* 使能USB中断 */
IRQ_enable(IRQ_EVT_USB);
/* 使能USB单元 */
USB_connectDev(USB0);
}
/****************************************************************/
/* 函数名: USB_DefaultDeal() */
/* 功能: 5509片上的USB进入死循环后,不断地检测状态信息, */
/* 如果满足相应的系统默认状态设置,就执行相应的动作 */
/* 参数: */
/* 无 */
/****************************************************************/
void USB_DefaultDeal(void)
{
Uint16 i, j, Temp;
if(usbflag == USB_BULK1_WRITE) // 块写操作
{
/* 写endpoint1in*/
usbflag =0;
j=1;
for(i=0; i<100;)
{
Temp = i&0x00FF;
i++;
usbbuffer[j] = (Temp<<8) + i;
i++;
j++;
}
/* 发送数据 */
USB_SendData(&EndptObjIn1,48,&usbbuffer,USB_IOFLAG_SWAP);
}
if(usbflag == USB_BULK2_WRITE)
{
/* 写endpoint2in */
usbflag =0;
for(i=0; i<usbreceilen/2+1; i++)
{
Temp = usbbuffer[2*i];
usbbuffer[i+1] = usbbuffer[2*i+1]*0x100+Temp;
}
/* 发送数据 */
USB_SendData(&EndptObjIn2,usbreceilen,&usbbuffer,USB_IOFLAG_NONE);
}
if(usbflag == USB_BULK2_READ) // 块读操作
{
usbflag = 0;
/* 接收PC机传来的数据 */
USB_ReceivData(USB_OUT_EP2,usbbuffer,&usbreceilen);
}
/*
// 接收PC机下传的数据时,也可以在系统死循环里采用查询方法
// 但必须注意应该先使能所对应输出节点的中断
if(USBOEPIF_ADDR == 0x0004)
{
USBOEPIF_ADDR = 0x0004;
// 接收数据
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -