[ZLG-ARM] 用LPC2148的BULK传输,DMA方式

[复制链接]
 楼主| yuguonet 发表于 2007-10-12 10:26 | 显示全部楼层 |阅读模式
请各位帮忙看看,运用DMA在批量传输方式中能够正常接收,无法正常发送,是什么原因?<br />void&nbsp;USB_EndPoint2&nbsp;(DWORD&nbsp;event)&nbsp;{<br /><br />&nbsp;USB_DMA_DESCRIPTOR&nbsp;DD;<br /><br />//从PC接收数据,能正常接收数据<br />&nbsp;if&nbsp;(event&nbsp;&&nbsp;(USB_EVT_OUT_DMA_EOT)&nbsp;|&nbsp;(USB_EVT_OUT_DMA_NDR))&nbsp;{<br />&nbsp;/*&nbsp;End&nbsp;of&nbsp;Transfer&nbsp;or&nbsp;New&nbsp;Descriptor&nbsp;Request&nbsp;*/<br />&nbsp;DD.BufAdr&nbsp;=&nbsp;(DWORD)DataBuf&nbsp;+&nbsp;2*DataIn;&nbsp;/*&nbsp;DMA&nbsp;Buffer&nbsp;Address&nbsp;*/<br />&nbsp;DD.BufLen&nbsp;=&nbsp;B_S;&nbsp;/*&nbsp;DMA&nbsp;Packet&nbsp;Count*/<br />&nbsp;DD.MaxSize&nbsp;=&nbsp;64;&nbsp;/*&nbsp;Must&nbsp;be&nbsp;0&nbsp;for&nbsp;Iso&nbsp;Transfer&nbsp;*/<br />&nbsp;DD.InfoAdr&nbsp;=&nbsp;(DWORD)InfoBuf;&nbsp;/*&nbsp;Packet&nbsp;Info&nbsp;Buffer&nbsp;Address&nbsp;*/<br />&nbsp;DD.Cfg.Val&nbsp;=&nbsp;0;&nbsp;/*&nbsp;Initial&nbsp;DMA&nbsp;Configuration&nbsp;*/<br />&nbsp;DD.Cfg.Type.IsoEP&nbsp;=&nbsp;0;&nbsp;/*&nbsp;Iso&nbsp;Endpoint&nbsp;*/<br />&nbsp;USB_DMA_Setup&nbsp;(0x02,&nbsp;&DD);&nbsp;/*&nbsp;Setup&nbsp;DMA&nbsp;*/<br />&nbsp;USB_DMA_Enable(0x02);&nbsp;/*&nbsp;Enable&nbsp;DMA&nbsp;*/<br />&nbsp;}<br />&nbsp;if&nbsp;(event&nbsp;&&nbsp;USB_EVT_OUT_DMA_EOT)&nbsp;{<br />&nbsp;/*&nbsp;End&nbsp;of&nbsp;Transfer&nbsp;*/<br />&nbsp;if&nbsp;(USB_DMA_BufAdr(0x02)&nbsp;!=&nbsp;((DWORD)DataBuf&nbsp;+&nbsp;2*DataIn))&nbsp;{<br />&nbsp;/*&nbsp;Data&nbsp;Available&nbsp;*/<br />&nbsp;DataIn&nbsp;+=&nbsp;64;&nbsp;/*&nbsp;Update&nbsp;Data&nbsp;In&nbsp;Index*/<br />&nbsp;DataIn&nbsp;&=&nbsp;B_S&nbsp;-&nbsp;1;&nbsp;/*&nbsp;Adjust&nbsp;Data&nbsp;In&nbsp;Index&nbsp;*/<br />&nbsp;if&nbsp;(DataIn&nbsp;&&nbsp;(B_S&nbsp;-&nbsp;1))&nbsp;==&nbsp;B_S/2)&nbsp;{<br />&nbsp;DataRun&nbsp;=&nbsp;1;&nbsp;/*&nbsp;Data&nbsp;Stream&nbsp;running&nbsp;*/<br />&nbsp;}<br />&nbsp;}<br />&nbsp;}<br />&nbsp;////////////////////////////////////发送数据到PC,不能发送数据<br />&nbsp;if&nbsp;(DataRun&nbsp;==&nbsp;1)<br />&nbsp;{<br />&nbsp;if&nbsp;(event&nbsp;&&nbsp;(USB_EVT_IN_DMA_EOT)&nbsp;|&nbsp;(USB_EVT_IN_DMA_NDR))&nbsp;{<br />&nbsp;DD.BufAdr&nbsp;=&nbsp;(DWORD)DataBuf&nbsp;+&nbsp;2*DataOut;&nbsp;/*&nbsp;DMA&nbsp;Buffer&nbsp;Address&nbsp;*/<br />&nbsp;DD.BufLen&nbsp;=&nbsp;B_S;&nbsp;/*&nbsp;DMA&nbsp;Packet&nbsp;Count&nbsp;*/<br />&nbsp;DD.MaxSize&nbsp;=&nbsp;64;&nbsp;/*&nbsp;Must&nbsp;be&nbsp;0&nbsp;for&nbsp;Iso&nbsp;Transfer&nbsp;*/<br />&nbsp;DD.InfoAdr&nbsp;=&nbsp;(DWORD)InfoBuf;&nbsp;/*&nbsp;Packet&nbsp;Info&nbsp;Buffer&nbsp;Address&nbsp;*/<br />&nbsp;DD.Cfg.Val&nbsp;=&nbsp;1;&nbsp;/*&nbsp;Initial&nbsp;DMA&nbsp;Configuration&nbsp;*/<br />&nbsp;DD.Cfg.Type.IsoEP&nbsp;=&nbsp;0;&nbsp;/*&nbsp;Iso&nbsp;Endpoint&nbsp;*/<br />&nbsp;USB_DMA_Setup&nbsp;(0x82,&nbsp;&DD);&nbsp;/*&nbsp;Setup&nbsp;DMA&nbsp;*/<br />&nbsp;USB_DMA_Enable(0x82);&nbsp;/*&nbsp;Enable&nbsp;DMA&nbsp;*/<br />&nbsp;}<br />&nbsp;if&nbsp;(event&nbsp;&&nbsp;USB_EVT_IN_DMA_EOT)&nbsp;{<br />&nbsp;DataOut&nbsp;+=&nbsp;64;&nbsp;/*&nbsp;Update&nbsp;Data&nbsp;In&nbsp;Index&nbsp;*/<br />&nbsp;DataOut&nbsp;&=&nbsp;B_S&nbsp;-&nbsp;1;&nbsp;/*&nbsp;Adjust&nbsp;Data&nbsp;In&nbsp;Index&nbsp;*/<br />&nbsp;if&nbsp;(DataIn&nbsp;==&nbsp;DataOut)&nbsp;{<br />&nbsp;DataRun&nbsp;=&nbsp;0;&nbsp;/*&nbsp;Data&nbsp;Stream&nbsp;running&nbsp;*/<br />&nbsp;DataOut&nbsp;=&nbsp;DataIn;&nbsp;/*&nbsp;Initialize&nbsp;Data&nbsp;Indexes&nbsp;*/<br />&nbsp;}<br />&nbsp;}<br />&nbsp;}<br />}<br /><br />程序是使用keil自带的usbaudio程序代码改过来的,现在接收应该正常了,但发送PC接收不到任何数据,我把接收部分单独提出来也没有用,象这样也收不到数据:<br />void&nbsp;USB_EndPoint1&nbsp;(DWORD&nbsp;event)&nbsp;{<br />&nbsp;USB_DMA_DESCRIPTOR&nbsp;DD;<br />&nbsp;DWORD&nbsp;DataLen;<br />&nbsp;BYTE&nbsp;DBuf[0x10];<br />&nbsp;switch&nbsp;(event)&nbsp;{<br />&nbsp;case&nbsp;USB_EVT_IN:&nbsp;//控制传输来自PC的输入&nbsp;发送传输字节的总长度<br />&nbsp;break;<br />&nbsp;case&nbsp;USB_EVT_OUT:&nbsp;//控制传输来自PC的输出&nbsp;接收所有命令<br />//&nbsp;USB_ClrStallEP(USB_ENDPOINT_OUT(1));<br />&nbsp;DataLen&nbsp;=&nbsp;0;<br />&nbsp;DataLen&nbsp;=&nbsp;USB_ReadEP(USB_ENDPOINT_OUT(1),&nbsp;DBuf);<br />&nbsp;DD.BufAdr&nbsp;=&nbsp;(DWORD)DataBuf;&nbsp;/*&nbsp;DMA&nbsp;Buffer&nbsp;Address&nbsp;*/<br />&nbsp;DD.BufLen&nbsp;=&nbsp;B_S;&nbsp;/*&nbsp;DMA&nbsp;Packet&nbsp;Count&nbsp;*/<br />&nbsp;DD.MaxSize&nbsp;=&nbsp;64;&nbsp;/*&nbsp;Must&nbsp;be&nbsp;0&nbsp;for&nbsp;Iso&nbsp;Transfer&nbsp;*/<br />&nbsp;DD.InfoAdr&nbsp;=&nbsp;(DWORD)InfoBuf;&nbsp;/*&nbsp;Packet&nbsp;Info&nbsp;Buffer&nbsp;Address&nbsp;*/<br />&nbsp;DD.Cfg.Val&nbsp;=&nbsp;1;&nbsp;/*&nbsp;Initial&nbsp;DMA&nbsp;Configuration&nbsp;*/<br />&nbsp;DD.Cfg.Type.IsoEP&nbsp;=&nbsp;0;&nbsp;/*&nbsp;Iso&nbsp;Endpoint&nbsp;*/<br />&nbsp;USB_DMA_Setup&nbsp;(0x82,&nbsp;&DD);&nbsp;/*&nbsp;Setup&nbsp;DMA&nbsp;*/<br />&nbsp;USB_DMA_Enable(0x82);&nbsp;/*&nbsp;Enable&nbsp;DMA&nbsp;*/<br />&nbsp;break;<br />&nbsp;}<br />}<br />
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

3

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部

3

主题

3

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部