USB串口通信之编程中需要考虑的问题
1.分组缓冲区的结构和用途
每个双向端点都可以接收或发送数据。接收到的数据存储在该端点指定的专用缓冲区内,而另一个缓冲区则用于存放待发送的数据。 对这些缓冲区的访问由分组缓冲区接口模块实现, 它提出缓冲区访问请求,并等待确认信息后返回。 为防止产生微控制器与USB模块对缓冲区的访问冲突,缓冲区接口模块使用仲裁机制,使APB1总线的一半周期用于微控制器的访问,另一半保证USB模块的访问。
每个端点对应于两个分组缓冲区(一般一个用于发送,另一个用于接收)。这些缓冲区可以位于整个分组存储区的任意位置,因为它们的地址和长度都定义在缓冲区描述表中,而缓冲区描述表也同样位于分组缓冲区中,其地址由寄存器确定。缓冲区描述表的每个表项都关联到一个端点寄存器,它由4个16位的字组成,因此缓冲区描述表的起始地址按8字节对齐(寄存器的最低3位总是’000’)。
2.端点初始化
初始化端点的第一步是把适当的值写到ADDRn_TX或ADDRn_RX寄存器中,以便USB模块能找到要传输的数据或准备好接收数据的缓冲区。USB_EpnR寄存器的EP_TYPE位确定端点的基本类型,EP_KIND位确定端点的特殊特性。
– 作为发送方,需要设置USB_EpnR寄存器的STAT_TX位来使能端点,并配置COUNTn_TX位决定发送长度。
– 作为接收方,需要设置STAT_RX位来使能端点,并且设置BL_SIZE和NUM_BLOCK位,确定接收缓冲区的大小,以检测缓冲区溢出的异常。
– 对于非同步非双缓冲批量传输的单向端点,只需要设置一个传输方向上的寄存器。一旦端点被使能,应用程序就不能再修改USB_EpnR寄存器的值和ADDRn_TX / ADDRn_RX, COUNTn_TX / COUNTn_RX所在的位置,因为这些值会被硬件实时修改。当数据传输完成时,CTR中断会产生,此时上述寄存器可以被访问,并重新使能新的传输。