最近几天正在学习CH376T模块,因任务需要,要实现作为HOST需要和CDC类设备进行通信;作为Device能和电脑进行数据往来。使用硬件SPI与CH376进行控制。首先,在进行验证CH376作为HOST时,设置的为主机模式6,已经能够正常通过EP0端点收到并成功分析和保存了各种描述符信息,也将CDC设备的数据收/发接口的端点进行保存。然后是尝试进行往CDC设备发送数据,发送函数摘自打印机例程,代码如下
void send_data( uint8_t len, uint8_t *buf )
{
uint8_t l, s;
while( len ) /* 连续输出数据块给USB打印机 */
{
toggle_send( tog_send ); /* 数据同步 */
l = len>endp_out_size?endp_out_size:len; /* 单次发送不能超过端点尺寸 */
WR_USB_DATA( l, buf ); /* 将数据先复制到CH375芯片中 */
issue_token( 0X40, ( endp_out_addr << 4 ) | DEF_USB_PID_OUT ); //endp_out_addr = 0x03
s = wait_interrupt(); /* 请求CH375输出数据 */
if ( s == USB_INT_SUCCESS ) /* CH375成功发出数据 */
{
tog_send = ~ tog_send; /* 切换DATA0和DATA1进行数据同步 */
len-=l; /* 计数 */
buf+=l; /* 操作成功 */
}
else if ( s== 0x2A)
{ /* USB打印机正忙,如果未执行SET_RETRY命令则CH375自动重试,所以不会返回USB_INT_RET_NAK状态 */
/* USB打印机正忙,正常情况下应该稍后重试 */
/* s=get_port_status( ); 如果有必要,可以检查是什么原因导致打印机忙 */
printf("USB is Busy\r\n");
}
else /* 操作失败,正常情况下不会失败 */
{
clr_stall( endp_out_addr ); /* 清除打印机的数据接收端点,或者 soft_reset_print() */
/* soft_reset_print(); 打印机出现意外错误,软复位 */
tog_send = 0; /* 操作失败 */
CH376_WriteCmd(CMD_UNLOCK_USB); //此行为我自行添加,猜测当前端点的缓存区未被释放?
// printf("USB never Back data, and over time\r\n");
}
/* 如果数据量较大,可以定期调用get_port_status()检查打印机状态 */
}
}
遇到的问题:
1、往发送端点发送数据,中断查询返回一直为0x28的数据,请问通常遇到此类通信错误的问题,解决的点在哪?
2、另外的疑惑,在命令列表中,有看到端点0、端点1和端点2的相关设置命令,对于其他端点的操作该如何进行?
3、对于端点的发送数据,都提到了端点数据同步的命令操作,但对于命令,也仅设计涉及到端点0、端点1、端点2,对设备其他的端点,如端点3,该怎么进行数据同步?