您的位置 首页 元件

初涉USB,初学者USB入门总结(2) 设备固件程序

为了更好的说明整个USB启动过程,我们可以用串口实时的跟踪各个USB中断。不过这里先不用串口进行测试,只是简单的用一组变量记录过程。测试

为了更好的阐明整个USB发动进程,咱们可以用串口实时的盯梢各个USB中止。不过这儿先不必串口进行测验,仅仅简略的用一组变量记载进程。测验程序如下(以下会有程序的阐明):

uchar test[100];//100长度的变量,记载进程
uchar conters=0;//记载计数值,
/*————————————————————
高校电子联盟–肖继达
QQ:258347765
————————————————————-*/

void EXT_int(void)//USB中止呼应函数
{
/*————————————————————
Check interrupt status register to know interrupt
source.
————————————————————*/

if(USB_BUSRESET_ASS_INT())
{/* USB bus reset */
/*for USB Rev.1.1
After USB bus reset released, 10msec recoverly time we have.
Follwing request must be processed normally.
*/

CLR_BUS_RESET_STATE();/* USB bus reset status clear */

/*————————————————————
Endpoint0 setting
————————————————————*/
/* Tx/Rx payload size setting */
/* Rx payload is fixed as 8-byte or 32-byte, therefor the
setting has no meaninig */

SET_PAYLOAD_EPn(EP0RX, device_deor.bMaxPacketSize0);
SET_PAYLOAD_EPn(EP0TX, device_deor.bMaxPacketSize0);
/* Stall bit, the value undefined after reset, cleared */
CLR_STALL_EPn(EP0);

/*————————————————————
Misceronous status variable initialization
————————————————————*/
usb_status.configuration = NULL;
usb_status.remote_wakeup = 0;
usb_status.address = 0;
usb_status.dvcstate = DEFAULT_STATE;/* Device state :DEFAULT */
usb_status.stall_req = 0;
#ifdef Debug
test[conters]=!;
conters++;
#endif

/*————————————————————
Callback to application layer
————————————————————*/
(*usb_status.callback)();
}
else if (SUSPENDED_INT())
{/* suspended state */
/* for USB Rev.1.1
Transit to suspended state after detect the USB line has kept idle over 3msec.
After resume detected, end suspend state in 3msec to be able to respond
the host request.
*/
CLR_SUSPENDED_STATE();
#ifdef Debug
test[conters]=@;
conters++;
#endif

}

else if(AWAKE_INT())
{/* Deveice awake state */
/* AWAKE procedure */

CLR_AWAKE_STATE();/* Request clear */
#ifdef Debug
test[conters]=#;
conters++;
#endif

}
else if(USB_BUSRESET_DES_INT())
{/* USB bus reset deassert */
/* Procedure for USB bus reset de-assert */

CLR_BUS_RESET_DES_STATE();/* Request clear */
#ifdef Debug
test[conters]=$;
conters++;
#endif

}

else if(SOF_INT())
{/* SOF interrupt status */
CLR_B_SOF_STATE();
#ifdef Debug
test[conters]=%;
conters++;
#endif
/* SOF interrupt status clear */
}/* SOF interrupt status */

if(SETUP_RDY_INT())
{/* setup ready */
#ifdef Debug
test[conters]=^;
conters++;
#endif

read_Device_Requests();
}

else if(EP1_PKTRDY_INT())
{/* EP1 packet ready */
read_FIFO(EP1);
}
else if(EP2_PKTRDY_INT())
{/* EP2 packet ready */

write_FIFO(EP2);
}

else if(EP0_RXPKTRDY_INT())
{/* EP0 receive packet ready */
read_FIFO(EP0RX);
}
else if(EP0_TXPKTRDY_INT())
{/* EP0 transmit packet ready */
write_FIFO(EP0TX);
}

}
计录的成果在变量查看中显现如下:

首要我解释一下,这段程序是我在做USB设备时的中止函数。主控(便是你往里面写固件程序的那个东西)会在要求设备进行操作时,发生一个相应的中止(咱们可以用中止的方法,也可以用查询的方法,中止的方法的优点便是主机有需求操作的都会叫你,而用查询你有必要不断的问主机“有事么”,这儿选用中止方法),比方主机给设备设置地址,主机会经过固定的通道(point0)发送一个‘设定地址’包,设备主控接到包后会发生中止,而且把呼应的状况保存在相应的寄存器中,咱们只要在中止程序判别各个寄存器就能完结主机的使命。
程序中蓝色字是中止类型的判别,其对应的宏界说就不列出来了。如果是这个中止就会履行相应的中止操作。而且一次中止只要一种中止类型,咱们在每个中止呼应中加一段赤色字的程序,是为了保存每次中止的状况,比方刚插上设备,来了一次BUSRESET总线复位中止,就会进入相应的中止操作,完了后记载状况test[conters]=!; conters++;意思是进入了这个中止就在这一组数的当时方位设成!,而且方位记载的变量加一,以便下一次记载到下一个方位。这样USB的进程咱们就记载了下来,
下面看一下记载成果(其间的数字和字母是呼应规范恳求时的程序发生的这儿不罗列程序了)。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/xinpin/yuanjian/234121.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部