本博文主要记录 ,【沁恒蓝牙mesh】CH58x USB功能开发记录(三),数据收发基于寄存器级别解释
【沁恒蓝牙mesh】CH58x USB功能开发记录(一)
【沁恒蓝牙mesh】CH58x USB功能开发记录(二)
void USBSendData( uint8_t *SendBuf, uint8_t l)
{
memcpy(pEP2_IN_DataBuf,SendBuf,l); /*将发送数据,复制到 pEP2_IN_DataBuf 这个地址下*/
DevEP2_IN_Deal( l ); /*数据发送*/
}
参考: CH583 技术手册的 17.2.2 章节 设备寄存器描述,关于USB 功能寄存器的描述, CH582 USB Device CherryUSB 这篇博文描述的很详细
每组端点都具有一个控制寄存器 R8_UEPn_CTRL
和发送长度寄存器 R8_UEPn_T_LEN
(n=0/1/2/3/4/5/6/7),用于设定该端点的同步触发位、对 OUT 事务和 IN 事务的响应以及发送数据
的长度等
R8_UEPn_T_LEN
R8_USB_RX_LEN
中,可以在 USB 接收中断时根据当前端点号区分。DMA buffer
中/*pEP2_IN_DataBuf 是个什么地址???*/
#define R16_UEP2_DMA (*((PUINT16V)0x40008018)) // endpoint 2 DMA buffer address
uint8_t *pEP2_RAM_Addr;
R16_UEP2_DMA = (uint16_t)(uint32_t)pEP2_RAM_Addr;
#define pEP2_IN_DataBuf (pEP2_RAM_Addr + 64)
void DevEP2_IN_Deal(uint8_t l)
{
R8_UEP2_T_LEN = l;
R8_UEP2_CTRL = (R8_UEP2_CTRL & ~MASK_UEP_T_RES) | UEP_T_RES_ACK;
}
同样的,节点接收到数据时,在端点2的 DMA Buffer 中的前64字节中存储着接收到的数据