ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

【SCI波特率计算、串口助手使用】

【SCI波特率计算、串口助手使用】 一、SCI波特率计算基础要点套公式算 BRRBRR取整会带来误差知道 LSPCLK 从哪来看 LSPCLK 最大规格LOSPCP 配置分频知道改波特率怎么重算部分寄存器知识补充整理于deepseek目录一、SCI波特率计算波特率公式LSPCLK 是多少怎么来的LOSPCP寄存器和PCLKCR外设时钟门控实际波特率是多少误差多大SCIBAUD 寄存器名高低字节合并SCI 内部 8 倍采样 4/5/6 点多数表决计算例子比特率bps、字节率Bps、波特率Baud的区别与换算串口助手使用二、Modbus基本规约、协议报文详解待整理485通信协议编写倍率偏移量通信故障分析串行/并行通信 、同步/异步波特率公式C2000 SCI 的波特率计算波特率 LSPCLK / ((BRR 1) * 8)反推BRR LSPCLK / (波特率 × 8) - 1*注意上述公式仅适用于 0 BRR 65536 的情况。 * 如果 BRR 0则 SCI 异步波特 LSPCLK / 16其中LSPCLK低速外设时钟Low-Speed Peripheral ClockBRR16 位波特率分频值SCIBAUDSCI 硬件设计决定的。BRR 是分频系数减 1后写入寄存器的值。8固定分频系数SCIHBAUD高 8 位 SCILBAUD低 8 位合起来是一个16 位寄存器叫 BRRBaud-Rate Register。16 位 2¹⁶ 65536 个不同取值而 TI 文档习惯把 65536 简称64K。SCI 使用这些寄存器的 16 位值为通信模式选择 64K 串行时钟速率之一SCI 用这 16 位数值从65536 种可用的串行时钟速率中选出你要的那一种。LSPCLK 是多少怎么来的答LSPCLK 由系统时钟 SYSCLK 分频得到通过LOSPCP寄存器配置。要知道 LSPCLK 不是固定的取决于LOSPCP分频算波特率前必须先确认 LSPCLK。LSPCLK 的公式LSPCLK SYSCLKOUT / (LOSPCP × 2)但有个特殊规则LOSPCP 0 时LSPCLK SYSCLKOUT不分频。#############################问为什么 SCI 用 LSPCLK不用 SYSCLK 直接驱动答串口是低速外设不需要 CPU 高速时钟分频降频降低外设动态功耗、降低 EMI 干扰独立低速时钟域方便低功耗模式单独关闭低速外设时钟CPU 可以保持高速运行。问 LSPCLK 有没有最大上限答有手册最大频率限制。280025 手册限制 LSPCLK 最高不能超过50MHzSYSCLKOUT 最高 100M所以 LOSPCP 最小配置是 2 分频LSPCLK50M不能配置为 1 分频100M 超出 SCI 最大时钟。问LSPCLK 和外设时钟使能位PCLKCR 寄存器的区别LOSPCP分频产生 LSPCLK 时钟信号时钟源有没有PCLKCR.SCI_B外设时钟门控开关这个时钟能不能送到 SCI 模块内部逻辑先 LOSPCP 生成 LSPCLK再 PCLKCR 打开 SCI 时钟门SCI 模块才有时钟输入。两个是独立配置缺一不可。打开 PCLKCR 的 SCI 时钟门控即使 LOSPCP 配置正确SCI 无时钟无法工作。#############################LOSPCP寄存器和PCLKCR外设时钟门控LOSPCP寄存器Low-Speed Peripheral Clock Prescaler是低速外设时钟预分频寄存器用来配置 LSPCLK 与 SYSCLK 的分频比把 SYSCLKOUT 做分频输出 LSPCLKLSPCLK 就是 SCI、SPI 的外设时钟源。寄存器ClkCfgRegs.LOSPCP有效位 Bit2~Bit0LSPCLKDIV [2:0]注意LOSPCP 属于系统控制寄存器修改 LOSPCP 时SCI/SPI 外设最好先软件复位关闭避免分频切换瞬间时钟毛刺造成外设异常。工程规范时钟分频LOSPCP只在系统初始化阶段配置一次运行时不动态修改若运行时必须改需要先复位 SCI改完 LOSPCLK重新计算 BRR重新初始化 SCI。#############################PCLKCR外设时钟门控Peripheral Clock Control Register通俗比喻LOSPCP时钟分频器产生 LSPCLK 这个时钟信号相当于发电机产生电PCLKCR外设电源总开关时钟门控制 LSPCLK 能不能送到 SCI 模块内部SCI 的电源开关两个独立就算 LSPCLK 时钟已经生成如果 PCLKCR 的 SCI 位是 0 →SCI 模块没有时钟SCI 完全不工作读写寄存器也可能异常。28002x 寄存器PCLKCR0PCLKCR0.bit.SCI_B 1;→ 打开 SCIB 模块的时钟门PCLKCR0.bit.SCI_B 0;→ 关闭 SCIB 的时钟模块断电降低功耗初始化顺序补充串联前面知识点配置 PLL得到 SYSCLKOUT配置 LOSPCP分频得到 LSPCLK低速时钟产生PCLKCR0.bit.SCI_B 1; // 打开 SCIB 时钟门把 LSPCLK 送入 SCIB计算 BRR配置 SCIHBAUD/SCILBAUD 波特率SCICCR 配置帧格式8bit、无校验、1 停止位等SCICTL1RXENA1、TXENA1SWRESET1 释放 SCI 软件复位SCI 正式启用高频坑很多新手配置了波特率、SCICTL1但忘记打开 PCLKCR 的 SCI 时钟门SCI 完全不工作查很久找不到问题。补充关闭 PCLKCR 时钟门之后访问 SCI 寄存器会无效甚至报错低功耗时可以关掉不用外设的 PCLKCR 位降低芯片功耗。#############################F28002x 常见配置SYSCLKLOSPCPLSPCLK100 MHz/250 MHz100 MHz/425 MHz120 MHz/430 MHz示例SYSCLKOUT100MHzLOSPCP2010 LSPCLK 100M / 4 25MHz此例子代码对应 LSPCLK 25 MHz。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。时钟链路外部晶振 → PLL → SYSCLKOUTCPU 系统主频 → LOSPCP 分频 → LSPCLK → SCI 波特率发生器280025x中SCI、SPI 模块的时钟源固定是 LSPCLK不是 CPU 主频 SYSCLKOUT这点是高频坑。 高速外设ePWM、ADC用 HSPCLK由 HISPCP 分频不要和 LOSPCP 搞混。✅ 初始化顺序规范先配置 PLL → 配置 LOSPCP 得到 LSPCLK → 计算 BRR 配置 SCI 波特率寄存器 →SCICCR 配置帧格式再配置SCICTL1 置 SWRESET1 退出复位注意LOSPCP 修改会直接改变 LSPCLK波特率跟着漂移必须在 SCI 初始化前一次性配置。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。波特率和 LSPCLK 的关系问如果 SYSCLK 变了波特率会变吗→会。LSPCLK 跟着 SYSCLK 变BRR 不变的话波特率就变了。所以改时钟后必须重算 BRR。实际波特率是多少误差多大答BRR 取整会带来误差实际波特率 LSPCLK / ((BRR 1) × 8) 25,000,000 / ((324 1) × 8) 25,000,000 / 2600 9615.38 bps目标 9600实际 9615.38误差 (9615.38 - 9600) / 9600 × 100% 0.16%0.16% 误差完全可以接受一般要求 2%~3%。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。SCIBAUD寄存器名F28002x 里高字节寄存器叫SCIHBAUD低字节叫SCILBAUD。有些文档写成SCIBAUD16 位合并访问。问能不能一次写 16 位→ 可以用SciaRegs.SCIBAUD.all 0x0144;如果头文件支持。1“如果头文件支持”是什么意思“如果头文件支持”的意思就是先去头文件里搜有没有SCIBAUD这个定义有就能一次写没有就只能分两次标准头文件通常没有需要分开写更稳妥。C2000 的头文件如f28002x_device.h用union struct的方式把外设寄存器封装成可访问的成员。比如SciaRegs这个结构体里会定义SciaRegs.SCIHBAUD→ 高字节寄存器8位SciaRegs.SCILBAUD→ 低字节寄存器8位如果头文件作者定义了合并访问的别名你就能写SciaRegs.SCIBAUD.all 0x0144;。但大多数 C2000 标准头文件并没有定义这个合并别名所以实际上你只能分开写SciaRegs.SCIHBAUD.all 0x01; SciaRegs.SCILBAUD.all 0x44;高低字节合并原理高字节代表 BRR 的 bit15~bit8低字节代表 bit7~bit0。左移 8 位把高字节放到正确位置再用按位或|把低字节拼上。也可以写成BRR SCIBAUD_H * 256 SCIBAUD_L;。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。SCI 内部 8 倍采样 4/5/6 点多数表决基础概念SCI 异步串口内部采样时钟 8 × 波特率。 举例子波特率 9600采样时钟 9600 × 8 76800 Hz。为什么不是 1 倍如果只用 1 倍采样只在数据位中间采一次一旦有噪声、边沿抖动就会采错。8 倍过采样就是对 1 个 bit 连续采 8 次。接收检测流程空闲时总线高电平当检测到起始位下降沿由高变低采样计数器开始从 0 计数Bit0~3前 4 个采样用来确认起始位消抖第 4、5、6 个采样点对当前数据位连续采样 3 次做多数表决3 取 23 次里面≥2 次是 0 → 判断这一位是 03 次里面≥2 次是 1 → 判断这一位是 1第 7 个采样结束当前 bit准备下一个 bit一句话口述SCI 采用 8 倍过采样在每个数据位窗口的第 4、5、6 采样点连续采 3 次多数表决抵抗信号噪声、边沿抖动提升串口抗干扰能力。坑点这个是硬件内部自动做不需要软件写代码软件只需要配置波特率硬件自动生成 8 倍采样时钟。计算例子假设 LSPCLK 25 MHz (100 MHz SYSCLK)目标波特率9600bps每秒钟可以传输9600个二进制传输一个二进制位需要的时间是1/9600秒也就是104μs波特率就是9600。分析查数据手册可知使用的是4分频即100MHZ/425MHZ。由公式可得BRR 25,000,000 / (9600 × 8) - 1 324.52≈ 324 0x0144SciaRegs.SCIHBAUD.all 0x01; // 波特率高字节 0x01SciaRegs.SCILBAUD.all 0x44; // 波特率低字节 0x44。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。CAN波特率具体计算分析还未看。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。DSP简单自定义波特率再也不用手动计算了哈哈哈-CSDN博客记得看评论里建议待试还没有在程序里实际用过看到有人写这种excel公式表格网上没找到现成的还是自己算一下快些。比特率bps、字节率Bps、波特率Baud的区别与换算波特率是信号的拍子比特率是0/1 的流量字节率是用户拿到手的量串口里 1 拍 1 bit所以波特率 bps但 1 字节要占 10 个 bit 在线上传8-N-1实际字节速度 ≈ bps ÷ 10。名词单位回答的问题与另外两者的关系备注**波特率**Baud即 symbol/s每秒码元数信号每秒变化几次码元/s串口1码元1bit时数值 bps一个码元可能携带 1 个或多个 bit**比特率**bps每秒传多少二进制 0/1的个数 波特率 × 每码元比特数是通信链路最根本的速率指标**字节率**Byte/s常写作 Bps大写 B每秒传多少个字节数据 bps ÷ 8串口实际还要 ÷181是站在用户数据角度的速率文件传输、串口助手里常见波特率 ≠ 比特率除非每个码元只携带 1 个 bit这正是 UART/SI 的情况。bps ↔ Baud串口场景对UART/SCI这类二进制调制只有高/低两种电平1 码元 1 bitbps Baud × log₂(码元状态数) Baud × log₂(2) Baud × 1 ∴ 串口场景下bps Baud数值上相等这就是为什么大家平时把 9600 波特率、9600 bps 混着叫——对串口来说它们数值相同。反例为什么两者不总是一回事调制方式1 波特携带9600 Baud 对应比特率UART高低电平1 bit9600 bpsQPSK4 相位2 bit19200 bps16QAM16 状态4 bit38400 bps只有调制状态数 2 时如 MODEM、Wi-Fi波特率数值上才小于比特率。C2000 的 SCI 是标准 UART1 波特 1 bit两者相等。串口助手使用。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。.......................................................................................................................................................通信猫调试软件 V313一站式通信调试解决方案 | Modbus物联网云平台 (未用过。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。二、Modbus基本规约、协议报文详解待整理485通信协议编写倍率偏移量通信故障分析串行/并行通信 、同步/异步搞定串口就搞定了通信STM32串口通信基本原理“按照通信方式分为同步通信带时钟同步信号传输。比如SPIIIC通信接口。异步通信不带时钟同步信号。比如UART(通用异步收发器)单总线。在同步通讯中收发设备上方会使用一根信号线传输信号在时钟信号的驱动下双方进行协调同步数据。例如通讯中通常双方会统一规定在时钟信号的上升沿或者下降沿对数据线进行采样。在异步通讯中不使用时钟信号进行数据同步它们直接在数据信号中穿插一些用于同步的信号位或者将主题数据进行打包以数据帧的格式传输数据。通讯中还需要双方规约好数据的传输速率也就是波特率等以便更好地同步。常用的波特率有4800bps、9600bps、115200bps等。在同步通讯中数据信号所传输的内容绝大部分是有效数据而异步通讯中会则会包含数据帧的各种标识符所以同步通讯效率高但是同步通讯双方的时钟允许误差小稍稍时钟出错就可能导致数据错乱异步通讯双方的时钟允许误差较大。”
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进