查看: 1088|回复: 0

【XMEGA深思录】3、使用好USB CDC类

[复制链接]

该用户从未签到

发表于 2015-11-24 23:30:49 | 显示全部楼层 |阅读模式
分享到:
这一文,主要是为了方便后续方便地输出调试信息和结果。

以此篇为基础,后续开发板只需要一根USB线,便可以方便地完成与PC的通信。
毕竟现在带COM口的笔记本越来越稀有了

先上一张开发板的高清图



完成本篇,需要用到如下两个函数库







conf_clock.h和main.c两部分的源码如下
---------------------------------------------------------conf_clock.h
#define CONFIG_SYSCLK_SOURCE     SYSCLK_SRC_PLL
#define CONFIG_PLL0_SOURCE            PLL_SRC_RC2MHZ
#define CONFIG_PLL0_MUL                 12
#define CONFIG_PLL0_DIV                 1
#define CONFIG_SYSCLK_PSADIV     SYSCLK_PSADIV_1
#define CONFIG_SYSCLK_PSBCDIV     SYSCLK_PSBCDIV_1_1

// #define BOARD_XOSC_HZ              32768
// #define BOARD_XOSC_TYPE           XOSC_TYPE_32KHZ
// #define BOARD_XOSC_STARTUP_US       1000000

///// USB
#define CONFIG_USBCLK_SOURCE   USBCLK_SRC_RCOSC
#define CONFIG_OSC_RC32_CAL     48000000UL
#define CONFIG_OSC_AUTOCAL_RC32MHZ_REF_OSC OSC_ID_USBSOF
/////
---------------------------------------------------------
---------------------------------------------------------main.c
#include <asf.h>

void usb_send_bytes(uint8_t *buff, uint16_t bytes)
{
      uint8_t *p = buff;
      uint16_t i = 0;
      for(; i < bytes; i++, p++) {
             putchar(*p);
      }
}

uint8_t usbReveiveBytes;
uint8_t usbReceiveBuffer[200];
#include <string.h> // 使用memset
int main (void)
{
      /* Insert system clock initialization code here (sysclk_init()). */

      board_init();
      sysclk_init();
      
      /* USB */
      irq_initialize_vectors();
      cpu_irq_enable();
      stdio_usb_init();
      stdio_usb_enable();
      
      while(true) {
             if(udi_cdc_is_rx_ready()) { // USB有数据送过来
                  /* 接收PC送来的数据 */
                  usbReveiveBytes = udi_cdc_get_nb_received_data();
                  memset(usbReceiveBuffer,0,200); // 缓冲区清零
                  udi_cdc_read_buf(usbReceiveBuffer,usbReveiveBytes);
                  
                  /* 判断数据 */
                  if(usbReceiveBuffer[0] == 'A'
                  && usbReceiveBuffer[1] == 'B'
                  && usbReceiveBuffer[2] == 'C'
                  && usbReceiveBuffer[3] == 'D') {
                      usb_send_bytes((uint8_t *)"OK\r\n",4);
                  } else {
                      usb_send_bytes((uint8_t *)"Error\r\n",7);
                  }
             }
      }
      

      /* Insert application code here, after the board has been initialized. */
}


---------------------------------------------------------
如果PC传来的是“ABCD”,向PC返回“OK”,否则返回“Error”

需要特别注意的是:
1、不同的ASF版本下,库函数的使用略有不同,
比如使用低版本ASF时,代码中的stdio_usb_enable();可以省略不用;
类似的情况,在其余外设驱动操作时大量存在!
因此对于一个成熟的产品,不要轻易升级旧代码中的ASF版本。
2、对于USB虚拟串口,使用串口助手输入输出时,串口助手的波特率设置
无任何影响

回复

使用道具 举报

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

本版积分规则

关闭

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

手机版|小黑屋|与非网

GMT+8, 2024-3-29 04:08 , Processed in 0.117808 second(s), 18 queries , MemCache On.

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

苏公网安备 32059002001037号

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.