STM32F103C8T6 USB寄存器开发详解(5)-枚举

下面正式开始讲解USB协议:

设备检测:

当USB设备接入时,需要将D+/D-数据线电平拉高,通知主机有设备接入,具体拉高那根线要看设备速率,这个可以自己去USB中文网看一下. 

STM32F103C8T6的开发板电路已经自动上拉,如果不是这个型号,可能需要自己手动输出.

枚举流程:

枚举大概就是下面几个步骤,先给设备供电,然后设备上电后给D+/D-拉高,表面自己需要被枚举.

然后主机会请求设备进行复位,这个时候就需要在触发的中断函数里面,手动初始化一下相关寄存器

之后主机会请求一些设备描述符,然后继续复位,最后分配地址.

不同系统的枚举过程不一样,不过大方向还是差不多的,WIN一般是进行三次,LINUX就只有两次

代码编写:

枚举过程简单讲了一下,下面开始写代码.

看流程,接入主机后,会先触发依次复位中断,这时候需要进行以下配置:

1.配置USB_DADDR寄存器,启用USB模块,这个主要是启用端点寄存器,允许模块接收和发送数据

(之前有两个启用USB模块了,但RCC是提供时钟,然后初始化是上电,这三个启用不是一个意思)

2.配置端点0,因为USB枚举需要使用端点0,因此需要配置一下端点寄存器.

这里内容比较多,第一个就是CTR位,这个就是接收/发送标识,通过查看这两位来判断是触发的端点接收中断,还是发送中断.

另一个就是DTOG位,这个说明很有意思,写0无效,写1反转,所以对这个寄存器操作时候就要注意了.

然后就是STAT位,这个很重要,只有为11时候才可以响应主机的in/out令牌包,来接收/发送数据,否则就会进行其它响应,所以大多数情况下,需要使这几位一直保持在正确值.

然后就是端点类型位了,端点零应该是控制传输类型,然后特殊类型不要管,默认00就好,这个来回折腾太麻烦了,不管是控制端点还是其它类型端点的双缓冲区都可以不用,你不懂乱用的话还会出错,尽量先跟教程走,教程是我写完代码才写的,大概率不会出现问题.

然后就是端点地址位,端点0填1就行

3.然后就是中断寄存器了,触发中断后第一个看中断寄存器判断中断类型,然后进行相关处理,

这里面一个是复位中断,一个是触发中断的端点,然后就是传输方向,看看是发送中断还是接收中断

需要注意的是,每次触发中断一定要清除中断寄存器,不然函数结束后还是会一直重复触发.

小结:

最后代码差不多就是这个样子,里面调用了两个函数,之后再写.



/*USB接收中断处理*/
void USB_LP_CAN1_RX0_IRQHandler(void)
{
	uint32_t* handler = (uint32_t*)0x40005C44;



	/*复位中断*/
	if (*handler & (1 << 10))
	{
		*(uint32_t*)0x40005C4C = (1 << 7);                    //模块使能
		*(uint32_t*)0x40005C00 = 0x3330;                      //配置端点0(控制)
	}
	else
	{
		//检测端点ID,端点0通常仅用于枚举,其余端点通常用于专属通讯
		uint16_t id = ((*(uint16_t*)0x40005C44)&0xF);
		if (id == 0)
		{
			USB_Endpoint_Zero(handler);
		}
		else
		{
			USB_Endpoint(handler, id);
		}
	}


	*handler &=~((1<<15)|(1<<10));                //清除复位信息,来退出中断函数    
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值