0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

根据SCI输入信号自动校准波特率

星星科技指导员 来源:TI 作者:Terry Deng 2023-03-17 10:34 次阅读

本文档概述了一种基于 SCI/UART 输入信号,可以自动校准本设备SCI/UART波特率的方法,该方法适用与所有第三代C2000芯片,比如F2807x/37x,F28004x,F28002x等等。

一 原理说明

假设有2块电路板通过SCI进行通信。“Transmitter”向“Receiver”发送未知波特率的数据,“ Receiver”则使用 eCAP 测量未知的波特率,然后修改其自身的波特率和“Transmitter”匹配。

下面款图是一种情况,其中“Transmitter” 的波特率设置为 9889,而“Receiver”的初始波特率设置为 9601 ,相比之下“Receiver”的波特率为 -3% 偏差。 经过算法的自动校准以后,“Receiver”将会把自身波特率校正为与“Transmitter”相同的9889。

pYYBAGQT0amARgUfAABA1BlJA4c667.png

下面框图则是另一种情况,假如“Receiver”和“Transmitter”的初始波特率都是9889,但“Receiver”的内部晶振INTOSC有-3%的偏差。使用上述完全相同的方法原理和步骤,“Receiver”波特率设置将会从9889校准成9601,这样“Receiver”的波特率设置被自动校准抵消内部晶振的偏差。在测量实际信号时,“Receiver”输出到“Transmitter”的信号会是正确的 9889 波特率。

pYYBAGQT0aqAEj78AABV32CtimM689.png

二 Receiver 的校准代码

1. 初始化

需要配置以下模块来校准波特率:

时钟:使用 INTOSC2 并选择 100MHz 的 LSPCLK

#define DEVICE_SETCLOCK_CFG (SYSCTL_OSCSRC_OSC2 | SYSCTL_IMULT(20) |

SYSCTL_FMULT_NONE | SYSCTL_SYSDIV(2) |

SYSCTL_PLL_ENABLE)

//

// Set up PLL control and clock dividers

//

SysCtl_setClock(DEVICE_SETCLOCK_CFG);

//

// Make sure the LSPCLK divider is set to the default (divide by 4)

//

SysCtl_setLowSpeedClock(SYSCTL_LSPCLK_PRESCALE_1);

SCI 模块:通讯数据使用,发出校准以后的波形

// Initialize SCIA and its FIFO.

//

SCI_performSoftwareReset(SCIA_BASE);

//

// Configure SCIA for communications.

//

SCI_setConfig(SCIA_BASE, DEVICE_LSPCLK_FREQ, TARGETBAUD, (SCI_CONFIG_WLEN_8 |

SCI_CONFIG_STOP_ONE |

SCI_CONFIG_PAR_NONE));

SCI_resetChannels(SCIA_BASE);

SCI_resetRxFIFO(SCIA_BASE);

SCI_resetTxFIFO(SCIA_BASE);

SCI_clearInterruptStatus(SCIA_BASE, SCI_INT_TXFF | SCI_INT_RXFF);

SCI_enableFIFO(SCIA_BASE);

SCI_enableModule(SCIA_BASE);

SCI_performSoftwareReset(SCIA_BASE);

Xbar 输入:将 GPIO28/SCI 内部连接到 INPUTXBAR7 与 ECAP1 配合使用

//

// Configure GPIO 28 as eCAP input

//

XBAR_setInputPin(XBAR_INPUT7, 28);

ECAP 模块:监控接收到的 SCI 通信脉冲宽度

//

// Disable ,clear all capture flags and interrupts

//

ECAP_disableInterrupt(ECAP1_BASE,

(ECAP_ISR_SOURCE_CAPTURE_EVENT_1 |

ECAP_ISR_SOURCE_CAPTURE_EVENT_2 |

ECAP_ISR_SOURCE_CAPTURE_EVENT_3 |

ECAP_ISR_SOURCE_CAPTURE_EVENT_4 |

ECAP_ISR_SOURCE_COUNTER_OVERFLOW |

ECAP_ISR_SOURCE_COUNTER_PERIOD |

ECAP_ISR_SOURCE_COUNTER_COMPARE));

ECAP_clearInterrupt(ECAP1_BASE,

(ECAP_ISR_SOURCE_CAPTURE_EVENT_1 |

ECAP_ISR_SOURCE_CAPTURE_EVENT_2 |

ECAP_ISR_SOURCE_CAPTURE_EVENT_3 |

ECAP_ISR_SOURCE_CAPTURE_EVENT_4 |

ECAP_ISR_SOURCE_COUNTER_OVERFLOW |

ECAP_ISR_SOURCE_COUNTER_PERIOD |

ECAP_ISR_SOURCE_COUNTER_COMPARE));

//

2. 中断

捕获传入 SCI 通信的脉冲宽度,每捕获 4 次就中断一次。 将这 4 个捕获添加到阵列中。

__interrupt void ecap1ISR(void)

{

if(stopCaptures==0)

{

//

// Get the capture counts, interrupt every 4. Can be 1-bit or more wide.

// add one to account for partial eCAP counts at higher baud rates

// (e.g. count = 40, but if had higher resolution, this would be 40.5)

//

capCountArr[0] = 1+ECAP_getEventTimeStamp(ECAP1_BASE, ECAP_EVENT_1);

capCountArr[1] = 1+ECAP_getEventTimeStamp(ECAP1_BASE, ECAP_EVENT_2);

capCountArr[2] = 1+ECAP_getEventTimeStamp(ECAP1_BASE, ECAP_EVENT_3);

capCountArr[3] = 1+ECAP_getEventTimeStamp(ECAP1_BASE, ECAP_EVENT_4);

//

// Add samples to a buffer. Get average baud and tune INTOSC if buffer filled.

//

capCountIter = 0;

for (capCountIter=0; capCountIter<4; capCountIter++)

{

//

3. 主循环

捕获阵列满后,计算阵列的平均脉冲宽度 (也就是波特率),并更新SCI波特率寄存器,使其尽可能接近计算的平均值。

//

// Loop forever. Suspend or place breakpoints to observe the buffers.

//

for(;;)

{

//

// Array is filled, begin tuning

//

if(stopCaptures==1)

{

//

// Get an average baud rate from the array of samples

//

uint32_t avgBaud = getAverageBaud(samplesArr,NUMSAMPLES,TARGETBAUD);

//

// if the baud function returns the error code '0', then flag an error

//

if(avgBaud==0)

{

ESTOP0;

4. 平均脉冲宽度

对于许多应用的SCI 通信,传输的数据 (例如 0xA5)是变化不固定的,因此SCI的高低电平脉冲宽度就是变化的。所以必须对样本阵列进行如下的预处理,然后才能计算平均脉冲宽度。

a) 丢弃大于 10 位宽的脉冲宽度 (丢弃空闲时间)

b) 将 n 位值除以 n

c) 对修改后的样本数组进行平均化

uint32_t getAverageBaud(volatile float arr[], int size, float targetBaudRate)

{

//

// clean up variable width array to single-bit-width array

//

uint16_t pass = arrTo1PulseWidth(arr, size, (float)DEVICE_SYSCLK_FREQ/targetBaudRate);

//

// pass only if enough good samples provided

//

if(pass == 0)

{

return 0;

}

//

// convert 2-bit width, 3-bit width, etc. to 1-bit width values by dividing, and average these values.

// skip unrelated values

//

float averageBitWidth = computeAvgWidth(arr, size);

以下是平均脉宽计算的原理和代码流程图

pYYBAGQT0aqAAUOBAABId9BaVcc503.png

poYBAGQT0ayAPcWQAAA6HkSAzxQ287.png

三 结果

按照以下设置进行测试,结果详见表格,校准以后的误差从3% 改善为0.1%左右甚至更小。

“Transmitter”设置为正确的波特率 (我们尝试匹配的波特率)

“Receiver”设置为错误波特率 (-3% 或 +3%)

“Receiver”运行校准程序以匹配“Transmitter”

100K 波特率 9601波特率
-3% +3% -3% +3%
Transmitter
(我们正在尝试匹配的内容)
理想波特率
(仅供参考)
103306 96899 9889 9314.
实际波特率
(必须与此匹配)
104174. 96906 9890 9315.
Receiver
(初始错误波特率)
波特率
(校准前)
100154. 100157. 9622. 9622.
出错百分比
(校准前)
-3.859% 3.355% -2.706% 3.296%
Receiver
(校准后波特率)
波特率
(校准后)
104336. 97047. 9888 9314.
出错百分比
(校准后)
0.156% 0.146% -0.016% -0.012%

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 寄存器
    +关注

    关注

    31

    文章

    5292

    浏览量

    119802
  • 电路板
    +关注

    关注

    140

    文章

    4870

    浏览量

    97172
  • uart
    +关注

    关注

    22

    文章

    1219

    浏览量

    101113
收藏 人收藏

    评论

    相关推荐

    can波特率计算

    can波特率其实并不难计算,这里给出了can波特率的简单计算,并给出了实例STM32的CAN波特率计算。讲解CAN波特率计算原理。
    发表于 12-14 17:02 1.2w次阅读
    can<b class='flag-5'>波特率</b>计算

    什么是串口波特率?串口波特率的分类及应用详解

    直接影响到通信的质量和效率。本文将介绍串口波特率的分类、选择以及应用。串口波特率的分类根据不同的应用需求,串口波特率包括以下几种:标准波特率
    的头像 发表于 08-08 10:09 5682次阅读
    什么是串口<b class='flag-5'>波特率</b>?串口<b class='flag-5'>波特率</b>的分类及应用详解

    基于SCI/UART输入信号自动校准波特率

    本文档概述了一种基于 SCI/UART 输入信号,可以自动校准本设备SCI/UART
    发表于 11-04 07:16

    C Core芯片SCI串口波特率容限优化

    发现了C*Core国芯芯片中SCI发送与接受方波特率误差导致数据不匹配问题,分析了发送与接受方数据传输丢帧、误帧现象出现的根本原因,总结了SCI容限值与芯片主频及标准波特率之间规
    发表于 03-05 17:45 17次下载
    C Core芯片<b class='flag-5'>SCI</b>串口<b class='flag-5'>波特率</b>容限优化

    串行通信的实现条件和波特率自动整定问题

    串行通信在波特率误差超过一定范围时,会产生错误。本节介绍的内容在51单片机上仅用软件就实现了波特率自动整定,最大程度地减小了波特率误差,因而可使串行通信的可靠性得到提高。
    发表于 03-23 14:52 3835次阅读
    串行通信的实现条件和<b class='flag-5'>波特率</b><b class='flag-5'>自动</b>整定问题

    在dsPIC30F器件上实现自动波特率检测的详细中文资料概述

    目前所有 dsPIC30F 器件都拥有一个具备自动波特率检测能力的 UART 外设。UART 接收引脚(RX 引脚)上的信号能在内部传送至一个输入捕捉模块以获得输入
    发表于 06-29 10:25 6次下载
    在dsPIC30F器件上实现<b class='flag-5'>自动波特率</b>检测的详细中文资料概述

    在dsPIC30F器件上实现自动波特率检测

    目前所有 dsPIC30F 器件都拥有一个具备自动波特率检测能力的 UART 外设。UART 接收引脚(RX 引脚)上的信号能在内部传送至一个输入捕捉模块以获得输入
    发表于 05-11 10:34 10次下载

    根据SCI输入信号自动校准波特率

    作者:Terry Deng 本文档概述了一种基于 SCI/UART 输入信号,可以自动校准本设备S
    的头像 发表于 01-12 13:56 2559次阅读
    <b class='flag-5'>根据</b><b class='flag-5'>SCI</b><b class='flag-5'>输入</b><b class='flag-5'>信号</b><b class='flag-5'>自动</b><b class='flag-5'>校准</b><b class='flag-5'>波特率</b>

    SCI串口自动波特率介绍

    自中科昊芯推出专题讲解SCI串口通信以来,第一期主要讲解SCI串口FIFO通信原理,本期主要讲解SCI串口自动波特率,FIFO中断通信逻辑将在下期内容中讲解。
    的头像 发表于 04-26 09:26 3140次阅读
    <b class='flag-5'>SCI</b>串口<b class='flag-5'>自动波特率</b>介绍

    根据 SCI 输入信号自动校准波特率

    根据 SCI 输入信号自动校准波特率
    发表于 10-28 12:00 0次下载
    <b class='flag-5'>根据</b> <b class='flag-5'>SCI</b> <b class='flag-5'>输入</b><b class='flag-5'>信号</b><b class='flag-5'>自动</b><b class='flag-5'>校准</b><b class='flag-5'>波特率</b>

    STM32的USART自动波特率检测

    当在两个设备之间建立通信链路时,自动波特率检测十分有用,因为从设备能够检测到主控制器的波特率并进行相应的自我调整。这需要使用一种自动机制来确定波特率
    的头像 发表于 11-28 11:15 8354次阅读

    波特率是什么?波特率设计

    从宏观理解,波特率表征了串口的传输速度。
    的头像 发表于 06-05 15:19 2.5w次阅读
    <b class='flag-5'>波特率</b>是什么?<b class='flag-5'>波特率</b>设计

    芯教程丨平头哥助力中科昊芯HX2000系列芯片专题SCI串口通信(二)AutoBaud自动波特率

    自中科昊芯推出专题讲解SCI串口通信以来,第一期主要讲解SCI串口FIFO通信原理,本期主要讲解SCI串口自动波特率,FIFO中断通信逻辑将在下期内容中讲解。HX2000系列
    的头像 发表于 04-27 14:48 793次阅读
    芯教程丨平头哥助力中科昊芯HX2000系列芯片专题<b class='flag-5'>SCI</b>串口通信(二)AutoBaud<b class='flag-5'>自动波特率</b>

    什么是波特率?为什么要设置波特率

    欢迎来到东用知识小课堂!一、什么是波特率波特率(BaudRate)单位bps是用于衡量串口通信速度的单位,它表示每秒钟发送的比特数。如果一个串口的波特率为9600,就表示该串口在一秒钟内可以发送
    的头像 发表于 04-08 00:00 6541次阅读
    什么是<b class='flag-5'>波特率</b>?为什么要设置<b class='flag-5'>波特率</b>?

    什么是波特率波特率是如何影响CAN总线长度的?

    信息在通信通道中传输的速率被称为波特率。通俗地说,波特率是数据在网络上传输的速度/速率。这是以比特/秒表示的。因此,一秒钟内在通信网络上传输的比特数就是波特率
    的头像 发表于 08-14 15:23 5838次阅读
    什么是<b class='flag-5'>波特率</b>?<b class='flag-5'>波特率</b>是如何影响CAN总线长度的?