定时器相关

最近在用 ch552 芯片做 usb 转串口的调试板

串口需要设置波特率,在 ch552 上需要给串口提供设定的波特率,这里使用定时器产生

初值计算问题

一般使用定时器的模式2,8位自动重装,使用 TL 计数,使用 TH 重装

波特率初值的计算公式如下

THn = TLn = 256 - fsys/12/16/波特率/2

ch552 有 1T 的模式,所以可以不用除以 12,还可以设置波特率倍频,也不用除以 2,这样的话,计算公式改为

THn = TLn = 256 - fsys/16/波特率

这里顺便提一下除以 16 的原因。在51单片机内置的串口模块中,他采取的方式是把一位信号采集16次,然后把第7、8、9次取出来,如果这三次中其中有两次是高电平的话,就认定这一位数据是1,如果两次数据是低电平,就认为是0。这样可以提高通信的容错率。【参考来源】
(PS:STC12C5A60S2 的 datasheet 8.2.2 节有更详细的介绍)

波特率误差问题

异步串口有起始和停止位,再加校验位,8位字节最多可有12位。51单片机的串口模块通常在位中间采样,如此12位偏差50%就可能采样错误造成通信失败,对应通信双方波特率偏差约50%/12=4%。

串口通信误码率与通信双方波特率高低无关,不过波特率和通信距离的乘积有上限。【参考来源】

本文中使用的 ch552 ,系统时钟为 16M,下面对是使用的常见的波特率进行误差分析。因为 ch552 不支持浮点波特率,所以对于小数部分进行截断

波特率 THn 误差 THn 误差
2400 416 0.16% 417 0.08%
9600 104 0.16% 105 0.79%
19200 52 0.16% 53 1.73%
38400 26 0.16% 27 3.55%
43000 23 1.11% 24 3.1%
56000 17 5% 18 0.79%
57600 17 2.12% 18 3.55%
115200 8 8.5% 9 3.55%
128000 7 11.6% 8 2.3%

虽然说理论上 5% 的误差对于异步串口通信来说都是可以容忍的,但是可能存在收发双方都存在偏差的情况,所以需要控制偏差在 2.5% 以下。

本次实验中使用发现,表中误差达到 3.55% 的波特率,在接收数据的时候都会乱码

usb 相关

既然 ch552 上的串口波特率需要定时器的支持,那在 host 设备上设置波特率的时候,如何将 host 设备上对于波特率的需求传达给 ch552 呢

ch552 的 usb 驱动是 ftdi 的,通过对 ftdi 的 usb 驱动反汇编可以知道设置波特率的 usb 非标准请求编码(当然不是我反汇编的☺),然后通过这个编码获取 usb 驱动送过来的一个 divisor 值。计算公式如下

divisor = 48M/16/波特率

这个计算是在 usb 驱动中完成的

在接收 host 端发送过来的 divisor 时要注意,自己的串口在什么接口,需要进行判断

if(UsbSetupBuf->wIndexL == 1)// inf1
else// inf2

由于 ch552 不支持浮点波特率,因此可以忽略 host 端传送过来的 divisor 的小数部分, divisor 的低 14 位是整数部分,高两位是小数部分。

divisor = UsbSetupBuf->wValueL |(UsbSetupBuf->wValueH << 8);
divisor &= 0x3fff;

在接收到 divisor 后,还需要对这个数进行处理。因为 ftdi 驱动中使用的是 48M 的时钟进行波特率的计算的,这里我们需要转换成自己的系统时钟,然后再进行定时器的 THn 进行设置

divisor = divisor / 3; // 16M CPU时钟
if(UsbSetupBuf->wIndexL == 1) // 串口位于接口1TH1 = 0 - divisor;

知乎链接

制作usb转串口固件相关推荐

  1. ESP8266-01学习笔记01:如何使用USB转串口对ESP-01进行入门调试、烧录固件?

    原址:https://blog.csdn.net/ls1792304830/article/details/72380281 ESP8266 是一个带完整 WiFi 功能. 同时带一个 32bit M ...

  2. USB转串口芯片 FT232RL/CH9101/PL2303/CY7C65213同类型芯片参数对比

    USB转串口芯片CH9101可实现FT232RL/FT232RQ/PL2303/CY7C65213等型号之间的pin to pin兼容,在不更改硬件设计的前提下实现不同型号间快速切换与产品应用.CH9 ...

  3. CH340国产USB转串口芯片替代CP2102对比CH340C与CH340G

    CH340系列简介 CH340系列为USB总线的转接芯片,实现USB转串口或者USB转打印口.在串口方式下,CH340 提供常用的 MODEM 联络信号,用于为计算机扩展异步串口,或者将普通的串口设备 ...

  4. 新一代高性能USB转串口芯片CH342与CH343

    简介 CH342与CH343是沁恒推出的第三代USB转串口产品,内部高度集成,外围精简,均提供VIO电源引脚,串口I/O支持独立供电. CH342实现USB转两路高速异步串口,支持串口波特率高达3Mb ...

  5. CP2102 USB转串口电路设计以及介绍

    CP2102 USB转串口电路设计以及介绍 CP2102 CP2102是高度集成的USB至UART桥接控制器,可使用最少的组件和PCB面积将RS 232设计更新为USB. CP2102 / 9包括一个 ...

  6. OpenWrt增加usb转串口支持

    环境 硬件:HLK_MTK7628n 系统:官方Openwrt 分支:master 硬件连接 usb转串口芯片直连MTK7628的原生USB接口,比如 CH340 PL2303 CP2012 操作步骤 ...

  7. 可编程 USB 转串口适配器开发板专用工具 S2STool 介绍

    可编程 USB 转串口适配器开发板专用工具 S2STool 介绍   可编程USB转 UART/I2C /SMBusS/SPI/CAN/1 -Wire适配器USB2S  专用工具 S2STool 介绍 ...

  8. USB转串口与虚拟串口相关

    不是原创,网上查询整理. 目录 一.串口与并口 二.USB转串口.虚拟串口概念 三.串口占用问题 四.其他:多个程序共享一个串口数据 五.COM.COM+和DCOM与COM端口无关 一.串口与并口 ( ...

  9. 可编程 USB 转串口适配器开发板 S2S 功能介绍

    可编程 USB 转串口适配器开发板 S2S 功能介绍 USB2S 支持基于 STC 单片机的二次开发,若有需要,可参照原理图和单片机型号手册自行开发具有特殊功能的固件程序. 1.自带固件S2S 功能介 ...

最新文章

  1. 毕业设计记录(二)配置mysql5.0数据库的问题
  2. jboss7 java版本,jdk 1.7推荐使用什么社区版本的Jboss以及为什么
  3. 115网盘如何打开php文件格式,115网盘下载:因纽特语教材(初级+高级+音频)
  4. 分布式系统框架Spring+Redis+SSO视频课程
  5. condition可数吗 living_单词辨析 知识讲解 condition situation state的区别
  6. 什么是 CAS 机制
  7. 赛码网算法: 军训队列( python实现 )
  8. 浮点高精求和(洛谷P2393题题解,弃坑Java拥抱C++)
  9. Memcached: 目录
  10. ServiceStack.Ormlit 使用Insert的时候自增列不会被赋值
  11. LeetCode_Maximum Subarray | Maximum Product Subarray
  12. java编译命令是什么_Java编译命令整理
  13. IPv6 节点主动访问 IPv4 节点-地址池方式的NAT64配置
  14. 干货满满!亲测国内四大AI智能抠图网站
  15. 找出大于200的最小质数
  16. Arduino与Proteus仿真实例-74HC573锁存器驱动仿真
  17. “鹏城”伴你鹏程:下届全国人工智能大赛再会!
  18. 原生js实现 转义还原HTML
  19. java自习_java 自习室 day 24
  20. Android开发者如何搭建服务器

热门文章

  1. ios 每日签到功能,模拟连续签到和中断需要重新签到
  2. windows下的cd命令
  3. DNS服务器显示为fec0,DNS服务器地址为fec0
  4. Vue 实现输入框验证码功能
  5. 年轻人开始流行给自己买花
  6. linux fwrite 头文件,linux的fwrite()使用方法
  7. 造梦西游online十殿阎罗篇:法宝篇(莫等闲,空悲切)
  8. 缓慢的http拒绝服务攻击
  9. 对接抖店API-01 获取参数签名
  10. Cadence Orcad Allegro Sigrity相关软件资源下载分享 持续更新 敬请关注