历史上的今天
今天是:2025年02月03日(星期一)
2021年02月03日 | 关于MSP430单片机串口通信数据丢失问题
2021-02-03 来源:eefocus
研究摸索了接近一个星期,把所遇到的问题写出来以供参考。
最开始看一个官方的串口收发数据的示例,然后自己操作后收发数据老是会丢失一个数据,然后看User’s Guide,取消了函数收发的方法直接用寄存器操作,问题解决。
接下来写一个组帧协议,收发完全正常。但是看上去逻辑思维非常的杂乱不清晰,就想整理一下,就开始写函数,进行函数调用。好了,这下问题又来了,数据又会丢失。
接近一个星期研究,发现不是自己写的代码有问题,是官方示例的波特率配置问题。大家都知道波特率表示每秒钟传送的码元符号的个数,是衡量数据传输速率的指标,它用单位时间内载波调制状态改变的次数来表示。晶振为1MHz波特率为115200,我自己改成了9600,问题解决。如何配置波特率在User’s Guide里面有想要的答案,详阅即可。以此单片机MSP430FR2311为例波特率配置在586页:
Setting a Baud Rate
For a given BRCLK clock source, the baud rate used determines the required division factor N:
N = fBRCLK/Baud Rate
The division factor N is often a noninteger value, thus, at least one divider and one modulator stage is
used to meet the factor as closely as possible.
If N is equal or greater than 16, it is recommended to use the oversampling baud-rate generation mode by
setting UCOS16.
NOTE: Baud Rate settings quick set up
To calculate the correct the correct settings for the baud rate generation, perform these
steps:
Calculate N = fBRCLK/Baud Rate [if N > 16 continue with step 3, otherwise with step 2]
OS16 = 0, UCBRx = INT(N) [continue with step 4]
OS16 = 1, UCBRx = INT(N/16), UCBRFx = INT([(N/16) – INT(N/16)] × 16)
UCBRSx can be found by looking up the fractional part of N ( = N - INT(N) ) in table
Table 22-4If OS16 = 0 was chosen, a detailed error calculation is recommended to be performe
更改后的波特率设置代码如下:
//Configure UART
//SMCLK = 1MHz, Baudrate = 9600
//UCBRx = 6, UCBRFx = 8, UCBRSx = 0x20, UCOS16 = 1
EUSCI_A_UART_initParam param = {0};
param.selectClockSource = EUSCI_A_UART_CLOCKSOURCE_SMCLK;
param.clockPrescalar = 6;//UCBRx = 6
param.firstModReg = 8;//UCBRFx = 8
param.secondModReg = 0x20;//CBRSx = 0x20
param.parity = EUSCI_A_UART_NO_PARITY;
param.msborLsbFirst = EUSCI_A_UART_LSB_FIRST;
param.numberofStopBits = EUSCI_A_UART_ONE_STOP_BIT;
param.uartMode = EUSCI_A_UART_MODE;
param.overSampling = EUSCI_A_UART_OVERSAMPLING_BAUDRATE_GENERATION;//UCOS16 = 1;
史海拾趣
|
/********************************** I2C总线驱动 ************************************* 模块名:I2C总线驱动 型号:I2C 创建人:陈曦 日期:2005-6-15 修改人:陈曦 日期:2005-6-19 功能描 ...… 查看全部问答> |
|
KEIL下 LM3S9B92 将程序搬到SDRAM中运行 有人玩过没 有没有人试过,我现在.SCT中修改链接地址 LR_IROM 0x60000000 0x00030000 { ; ; Specify the Execution Address of the code and the&nb ...… 查看全部问答> |
|
StreamClassGetPhysicalAddress函数调用出错,求助 windows的StreamClass驱动开发中,在minidriver中调用StreamClassGetPhysicalAddress( pHwDevExt, pSrb, pImage, SRBDataBuffer, &Length ); 返回的物理地址高32位和低32位都是一个很大的值,且与MmGetPhysicalAddress ( pImage )的结果不同,但用 ...… 查看全部问答> |
|
51单片机串口通信以16进制发送一个0-65536之间的任一数,当单片机收到后在数码管上动态显示出来 /*以16进制发送一个0-65536之间的任一数, *当单片机收到后在数码管上动态显示出来,波特率自定。 */ //我写的程序发送第一个数便成功显示,此后但不行了。。 /*比如说我发fffe 数码管显示65534 &n ...… 查看全部问答> |
|
请问:makefile中ipk文件有什么用? 有时执行make时必须提前删除某些ipk文件,否则自己的修改内容就不会被编译,这是为什么呀?ipk文件究竟是干什么用的,有什么作用? 求解,或者给个链接可以找到答案。。。谢谢。 ...… 查看全部问答> |




