查看: 708|回复: 0

SAMV71实现USB虚拟串口

[复制链接]

该用户从未签到

发表于 2015-11-13 08:46:52 | 显示全部楼层 |阅读模式
分享到:
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 usb_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("Usb uart test start --->");
      
      uint32_t tmp;
      while(1) {
             while(usart_read(USART1,&tmp));
             printf("You input -> %c\r\n",tmp);
      }
}
回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /1 下一条

手机版|小黑屋|与非网

GMT+8, 2024-4-24 22:04 , Processed in 0.122044 second(s), 17 queries , MemCache On.

ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

苏公网安备 32059002001037号

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.