djsnake
驱动牛犊
驱动牛犊
  • 注册日期2002-10-29
  • 最后登录2003-07-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1300回复:2

大家来看看我的D12的发送和接受子程序是否正确,为什么枚举不正确?谢谢!!!

楼主#
更多 发布于:2003-07-05 19:26
大家来看看我的发送和接受子程序:(单步执行时,ep_last为0X03,为什么?这可能是那里的错误,我在D12数据单里看到0X03表示数据接受或发送成功,PID解码错误,位7-4不是位3-0的反码 )
void ep0_rxdone(void)
{
unsigned char ep_last, i;

ep_last = D12_ReadLastTransactionStatus(0); // Clear interrupt flag

if (ep_last & D12_SETUPPACKET)
{

ControlData.wLength = 0;
ControlData.wCount = 0;

if( D12_ReadBuffer(0,(unsigned char *)(&(ControlData.DeviceRequest)),sizeof(ControlData.DeviceRequest)) != sizeof(DEVICE_REQUEST))
{

D12_SetEndpointStatus(0, 1);
D12_SetEndpointStatus(1, 1);
bEPPflags.bits.control_state = USB_IDLE;

return;
}

ControlData.DeviceRequest.wValue = SWAP(ControlData.DeviceRequest.wValue);
ControlData.DeviceRequest.wIndex = SWAP(ControlData.DeviceRequest.wIndex);
ControlData.DeviceRequest.wLength = SWAP(ControlData.DeviceRequest.wLength);

// Acknowledge setup here to unlock in/out endp
D12_AcknowledgeEndpoint(0);
D12_AcknowledgeEndpoint(1);

ControlData.wLength = ControlData.DeviceRequest.wLength;
ControlData.wCount = 0;



if (ControlData.DeviceRequest.bmRequestType & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
{
bEPPflags.bits.setup_packet = 1;
bEPPflags.bits.control_state = USB_TRANSMIT; /* get command */ }

else
{
if (ControlData.DeviceRequest.wLength == 0)
{
bEPPflags.bits.setup_packet = 1;
bEPPflags.bits.control_state = USB_IDLE; /* set command */
}
else
{
if(ControlData.DeviceRequest.wLength > MAX_CONTROLDATA_SIZE)
{
bEPPflags.bits.control_state = USB_IDLE;
D12_SetEndpointStatus(0, 1);
D12_SetEndpointStatus(1, 1);
}
else
{
bEPPflags.bits.control_state = USB_RECEIVE; /* set command with OUT token */
}
} // set command with data
} // else set command
} // if setup packet

else if (bEPPflags.bits.control_state == USB_RECEIVE)
{ i =D12_ReadBuffer(0, ControlData.dataBuffer + ControlData.wCount,EP0_PACKET_SIZE);

ControlData.wCount += i;

if( i != EP0_PACKET_SIZE || ControlData.wCount >= ControlData.wLength)
{
bEPPflags.bits.setup_packet = 1;
bEPPflags.bits.control_state = USB_IDLE;
}
}

else
{
bEPPflags.bits.control_state = USB_IDLE;
}

}
//control in function
void ep0_txdone(void)
{
short i = ControlData.wLength - ControlData.wCount;

D12_ReadLastTransactionStatus(1); // Clear interrupt flag

if (bEPPflags.bits.control_state != USB_TRANSMIT)

{
return; }
//-------------------------

if( i >= EP0_PACKET_SIZE)
//ControlData.pData=&ControlData.dataBuffer;
D12_WriteBuffer(1, ControlData.pData + ControlData.wCount,EP0_PACKET_SIZE);

ControlData.wCount += EP0_PACKET_SIZE;

bEPPflags.bits.control_state = USB_TRANSMIT;
}
else if( i != 0)
{ D12_WriteBuffer(1,ControlData.pData + ControlData.wCount,i);

ControlData.wCount += i;

bEPPflags.bits.control_state = USB_IDLE;
}
else if (i == 0)
{
D12_WriteBuffer(1, 0, 0); // Send zero packet at the end ???

bEPPflags.bits.control_state = USB_IDLE;
}
}


[编辑 -  7/5/03 by  djsnake]
Parker
驱动牛犊
驱动牛犊
  • 注册日期2002-09-29
  • 最后登录2007-10-11
  • 粉丝0
  • 关注0
  • 积分110分
  • 威望11点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-07-07 23:27
用PHILIPS的D12程序不会有错的,只要你移植没有出错.我几乎没对CHAP_9.C做多大改动就在其他MCU上实现了USB的连接.
不以物喜,不以己悲。
一天到晚游泳的鱼
驱动小牛
驱动小牛
  • 注册日期2002-05-08
  • 最后登录2005-04-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-07-18 18:13
用PHILIPS的D12程序不会有错的,只要你移植没有出错.我几乎没对CHAP_9.C做多大改动就在其他MCU上实现了USB的连接.


楼上说的对,PHILIPS的D12的枚举等程序没什么问题,只是罗嗦了点,熟悉了是可以优化,要改的只是mainloop.c和isr.c
游客

返回顶部