查看: 1409|回复: 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虚拟串口,使用串口助手输入输出时,串口助手的波特率设置
无任何影响

回复

举报

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

本版积分规则

关闭

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

【预约参会三重礼】2025 瑞萨电子工业以太网技术日
2025瑞萨电子工业以太网技术日聚焦工业4.0核心需求,为工程师与企业决策者提供实时通信技术最佳解决方案,通过案例剖析、现场演示、动手实践,全方位解读瑞萨电子最新实时通信技术解决方案,洞察行业发展趋势,助力企业高效开发更具竞争力工业以太网产品。

查看 »

手机版|小黑屋|与非网

GMT+8, 2025-4-1 13:53 , Processed in 0.109374 second(s), 18 queries , MemCache On.

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

苏公网安备 32059002001037号

Powered by Discuz! X3.5

Copyright © 2001-2024, Tencent Cloud.