USB与串口,虽然同属于串行通信协议,它们的协议,复杂度可谓是天差地别!
完整的USB英文协议,光英文文档就是厚厚一叠,绝对不是一两天、十天半个月能完全吃透的!更为让人叫绝的是其复杂的协议并没有牺牲传输速度,而是比最简单的串口高出N的档次!
各种USB键盘、鼠标、音响,设置是一个速度要求极低的设备,都给它搭载一个USB接口,大有不整个USB,产品都没法拿出手的赶脚……
还好现在的MCU产商基本都会提供完整的USB开发库,可以非常容易地实现复杂的协议
AT官方一般采用的波特率是115200bps,我们将波特率设置为230400
SAMV71实现USB虚拟串口的效果如下------>
将从串口助手接收到的数据原样发回
完整源代码如下--------> /** UART Interface */
#define CONF_UART CONSOLE_UART
/** Baudrate setting */
#define CONF_UART_BAUDRATE (230400UL)
/** Character length setting */
#define CONF_UART_CHAR_LENGTH US_MR_CHRL_8_BIT
/** Parity setting */
#define CONF_UART_PARITY US_MR_PAR_NO
/** Stop bits setting */
#define CONF_UART_STOP_BITS US_MR_NBSTOP_1_BIT
/* USB虚拟串口输入输出测试,将从虚拟串口接收到的数据发回虚拟串口 */
void u***_uart_test(void)
{
sysclk_init();
ioport_init();
ioport_set_pin_mode(USART1_RXD_GPIO, USART1_RXD_FLAGS);
ioport_disable_pin(USART1_RXD_GPIO);
MATRIX->CCFG_SYSIO |= CCFG_SYSIO_SYSIO4;
ioport_set_pin_mode(USART1_TXD_GPIO, USART1_TXD_FLAGS);
ioport_disable_pin(USART1_TXD_GPIO);
const usart_serial_options_t uart_serial_options = {
.baudrate = CONF_UART_BAUDRATE,
.charlength = CONF_UART_CHAR_LENGTH,
.paritytype = CONF_UART_PARITY,
.stopbits = CONF_UART_STOP_BITS,
};
sysclk_enable_peripheral_clock(ID_USART1);
stdio_serial_init(USART1, &uart_serial_options);
puts("U*** uart test start --->");
uint32_t tmp;
while(1) {
while(usart_read(USART1,&tmp));
printf("You input -> %crn",tmp);
}
}
0
|
|
|
|