数码之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
查看: 1061|回复: 17

[C51] 哪位大佬有CH552的USB CDC波特率自适应的例程?

[复制链接]
发表于 2024-12-11 11:53:53 | 显示全部楼层 |阅读模式
本帖最后由 lmn2005 于 2024-12-11 15:04 编辑

某恒提供的CH552的USB CDC例程,波特率是固定的。
波特率不能自适应,因而用途不大。
想从官方论坛上要求提供一个波特率自适应的例程,实在太难了!
想着自己修改,却因水平关系而无从下手,所以特来这里请教。
哪位大佬手头有此例程的,请分享一下,谢谢!


附:原CH552 CDC例程下载网址:https://www.wch.cn/uploads/file/20210113/1610527372338156.zip




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x
发表于 2024-12-11 15:09:56 | 显示全部楼层
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-12-11 15:47:17 | 显示全部楼层
本帖最后由 lmn2005 于 2024-12-12 11:01 编辑

这是arduino版本的,且原来的链接失效了
回复 支持 反对

使用道具 举报

发表于 2024-12-12 07:15:13 | 显示全部楼层
没失效呀: 52~69行实现了这一功能

arduino版的, 自己改改一样。


#ifndef USER_USB_RAM
#error "This example needs to be compiled with a USER USB setting"
#endif

#include "src/userUsbCdc/USBCDC.h"
extern __xdata uint8_t LineCoding[]; //lineCoding of CDC is located in this array
extern __xdata uint8_t controlLineState;
__xdata uint32_t oldBaudRate = 9600;
__xdata uint8_t oldLineState = 0;

#define USB_SWITCH_PIN 33
#define POWER_TARGET_PIN 34
#define USBDP_PULLUP_TARGET_PIN 14
#define BOOTLOADER_PULLDOWN_TARGET_PIN 16

#define SENSE_TARGET_SWTICH_PERF 17
#define POWER_PERF_PIN 11

void bootloaderRoutine() {
  USB_CTRL = 0;
  EA = 0;                                                                    //Disabling all interrupts is required.
  delayMicroseconds(50000);
  delayMicroseconds(50000);
  __asm__ ("lcall #0x3800");                                                 //Jump to bootloader code
  while (1);
}

void setup() {
  USBInit();

  pinMode(USB_SWITCH_PIN, OUTPUT);
  digitalWrite(USB_SWITCH_PIN, LOW);  //connect target to computer USB

  pinMode(POWER_TARGET_PIN, OUTPUT);
  digitalWrite(POWER_TARGET_PIN, LOW);

  pinMode(USBDP_PULLUP_TARGET_PIN, OUTPUT);
  digitalWrite(USBDP_PULLUP_TARGET_PIN, HIGH);

  pinMode(BOOTLOADER_PULLDOWN_TARGET_PIN, INPUT);
  
  pinMode(SENSE_TARGET_SWTICH_PERF, INPUT_PULLUP);

  pinMode(POWER_PERF_PIN, OUTPUT);
  digitalWrite(POWER_PERF_PIN, HIGH);

  Serial0_begin(9600);

}

void loop() {
  __xdata uint32_t currentBaudRate = *((__xdata uint32_t *)LineCoding); //both linecoding and sdcc are little-endian
  __xdata uint8_t currentLineState = controlLineState; //both linecoding and sdcc are little-endian

  while (USBSerial_available()) {
    char serialChar = USBSerial_read();
    Serial0_write(serialChar);
  }
  Serial0_flush();

  while (Serial0_available()) {
    char serialChar = Serial0_read();
    USBSerial_write(serialChar);
  }
  USBSerial_flush();

  if (oldBaudRate != currentBaudRate) {
    oldBaudRate = currentBaudRate;
    Serial0_begin(currentBaudRate);
  }

  if (oldLineState != currentLineState) {
    if  ( ((currentLineState & 0x01) == 0) && ((oldLineState & 0x01) == 1)) {
      if (currentBaudRate == 1200) {
        digitalWrite(POWER_TARGET_PIN, HIGH); //Cut target power
        digitalWrite(POWER_PERF_PIN, HIGH); //Cut peripheral power
        digitalWrite(USB_SWITCH_PIN, LOW);  //connect target to computer USB
        delay(100);
        digitalWrite(USBDP_PULLUP_TARGET_PIN, LOW); //Connect pull up resistor to target
        digitalWrite(BOOTLOADER_PULLDOWN_TARGET_PIN, LOW); //if the bootloader require a pin to be pulled low, use this pin  
        pinMode(BOOTLOADER_PULLDOWN_TARGET_PIN, OUTPUT);
        delay(10);
        digitalWrite(POWER_TARGET_PIN, LOW); //Restore target power
        delay(50);
        digitalWrite(USBDP_PULLUP_TARGET_PIN, HIGH); //Disconnect pull up resistor to target
        pinMode(BOOTLOADER_PULLDOWN_TARGET_PIN, INPUT);
      }
    }
    oldLineState = currentLineState;
  }

  if (digitalRead(15) == LOW) {
    delay(10);
    if (digitalRead(15) == LOW) {
      bootloaderRoutine();
    }
  }

  if (digitalRead(SENSE_TARGET_SWTICH_PERF)) {
    digitalWrite(POWER_PERF_PIN, HIGH); //Cut peripheral power
    digitalWrite(USB_SWITCH_PIN, LOW);  //connect target to computer USB
  } else {
    digitalWrite(POWER_PERF_PIN, LOW); //Set peripheral power
    digitalWrite(USB_SWITCH_PIN, HIGH);  //connect target to peripheral USB
  }

}

回复 支持 反对

使用道具 举报

发表于 2024-12-12 09:56:31 | 显示全部楼层
  if (oldBaudRate != currentBaudRate) {
     oldBaudRate = currentBaudRate;
     Serial0_begin(currentBaudRate);
   }
其实这段是关键,看看波特率变化了没有,变化了就更新
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-12-12 10:06:54 | 显示全部楼层
wxws 发表于 2024-12-12 07:15
没失效呀: 52~69行实现了这一功能

arduino版的, 自己改改一样。

原链接昨天打不开,今天打开了,我已经把整个zip下载下来了,有空看看能否实现这功能。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-12-12 10:56:53 | 显示全部楼层
wxws 发表于 2024-12-12 07:15
没失效呀: 52~69行实现了这一功能

arduino版的, 自己改改一样。

编译提示错误:


Arduino:1.8.19 (Windows 7), 开发板:"CH552 Board, 16 MHz (internal), 3.3V or 5V, Default CDC, Serial"

RebootToolTest:2:2: error: #error "This example needs to be compiled with a USER USB setting"

exit status 1

#error "This example needs to be compiled with a USER USB setting"



回复 支持 反对

使用道具 举报

发表于 2024-12-13 10:51:06 | 显示全部楼层

自带的例子

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-12-13 10:59:21 | 显示全部楼层

示例编译也出错


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x
回复 支持 反对

使用道具 举报

发表于 2024-12-13 11:40:43 | 显示全部楼层

我用的IDE2.3.4
https://cos.thinkcreate.us/packa ... oudflare_index.json
这里的包
或者这个
https://raw.githubusercontent.co ... no_mcs51_index.json
就是github那下面说明里的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-12-13 11:48:04 | 显示全部楼层
bg4rff 发表于 2024-12-13 11:40
我用的IDE2.3.4
https://cos.thinkcreate.us/package_ch55xduino_mcs51_newest_cloudflare_index.json
这 ...

哦,那可能是版本的问题了,我现在用的是win7的,所以只能用低版本的IDE
回复 支持 反对

使用道具 举报

发表于 2024-12-13 11:50:42 | 显示全部楼层
本帖最后由 bg4rff 于 2024-12-13 11:55 编辑

菜单,工具,USB setting选第四个

你那个选148那个

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-12-13 11:55:53 | 显示全部楼层
bg4rff 发表于 2024-12-13 11:50
菜单,工具,USB setting选第四个

原来是这个选项选错了,现在编译成功了,谢谢!
回复 支持 反对

使用道具 举报

发表于 2024-12-13 11:57:08 | 显示全部楼层
bg4rff 发表于 2024-12-13 11:50
菜单,工具,USB setting选第四个

你那个选148那个

看这个,选不一样的哦

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x
回复 支持 反对

使用道具 举报

发表于 2024-12-13 11:58:57 | 显示全部楼层

错误就是这个原因,默认的那个ram未定义

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x
回复 支持 反对

使用道具 举报

发表于 2024-12-13 11:59:26 | 显示全部楼层
## USB Memory Settings
## ----------------------------------------------
ch552.menu.usb_settings.usbcdc=Default CDC
ch552.menu.usb_settings.usbcdc.upload.maximum_data_size=876
ch552.menu.usb_settings.usbcdc.upload.xdata_location=148
ch552.menu.usb_settings.usbcdc.build.extra_flags=-DEP0_ADDR=0 -DEP1_ADDR=10 -DEP2_ADDR=20
## ----
ch552.menu.usb_settings.user148=USER CODE w/ 148B USB ram
ch552.menu.usb_settings.user148.upload.maximum_data_size=876
ch552.menu.usb_settings.user148.upload.xdata_location=148
ch552.menu.usb_settings.user148.build.extra_flags=-DUSER_USB_RAM=148
## ----
ch552.menu.usb_settings.user0=USER CODE w/ 0B USB ram
ch552.menu.usb_settings.user0.upload.maximum_data_size=1024
ch552.menu.usb_settings.user0.upload.xdata_location=0
ch552.menu.usb_settings.user0.build.extra_flags=-DUSER_USB_RAM=0
## ----
ch552.menu.usb_settings.user266=USER CODE w/ 266B USB ram
ch552.menu.usb_settings.user266.upload.maximum_data_size=758
ch552.menu.usb_settings.user266.upload.xdata_location=266
ch552.menu.usb_settings.user266.build.extra_flags=-DUSER_USB_RAM=266
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-12-13 14:06:31 | 显示全部楼层
bg4rff 发表于 2024-12-13 11:59
## USB Memory Settings
## ----------------------------------------------
ch552.menu.usb_settings.usb ...

好的,有空再弄弄
回复 支持 反对

使用道具 举报

发表于 2024-12-13 14:40:45 | 显示全部楼层
Ai8H2K12U-45MHz-SOP16,
USB转双串口,芯片出厂自带USB程序免驱动安装
USB插头支持:USB-TypeA,USB-TypeC
支持任意波特率,最高到10Mbps
全自动停电/上电,ISP下载编程烧录器
有手动电源开/关按键,可做电源供电模块

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 微信登录

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-7-13 22:22 , Processed in 0.343200 second(s), 8 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

快速回复 返回顶部 返回列表