与非网论坛
标题:
【XMEGA深思录】3、使用好USB CDC类
[打印本页]
作者:
植物大战奥特曼
时间:
2015-11-24 23:30
标题:
【XMEGA深思录】3、使用好USB CDC类
这一文,主要是为了方便后续方便地输出调试信息和结果。
以此篇为基础,后续开发板只需要一根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虚拟串口,使用串口助手输入输出时,串口助手的波特率设置
无任何影响
欢迎光临 与非网论坛 (https://www.eefocus.com/forum/)
Powered by Discuz! X3.5