This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSP430FR6047:MSP430FR6047

Guru**** 1626620 points
Other Parts Discussed in Thread: MSP430FR6047
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1353455/msp430fr6047-msp430fr6047

器件型号:MSP430FR6047

您好!
 使用 UART 与 PC 进行通信时、MSP430FR6047存在问题。 我正在 尝试发送具有不同长度的数据并进行回显。  
例如、我正在发送  
command = bytes ([0x040x81、0x01、0xFF、0x2C、 0x010x01])作为 komand:B'\x04\x81\x01\xff、\x01\x01'、且接收到的数据为错误 响应:B'\x04\x81\x01、\x01\x01'。
但是、当我只发送2个字节并回显相同的2个字节时、它可以正常工作。 我做错了什么? 我将使用 python 发送命令。 以下是我使用 python 和 MCU 中的代码来发送和接收的代码。  

导入序列
导入时间
#定义串行端口设置
com_port ="COM3"
BAUD_RATE = 115200
DATA_BITS = 8
奇偶校验='N'
STOP_BITS = 1

#打开串行端口
SER =串行。 serial (port=com_port、baudrate=b波特 率、bytesize=Data_bits、奇偶校验=奇偶校验、stopbits=stop_bits、 超时=0.5)

DEF READ_RESPONSE ():
Response = ser.read (7)#读取7字节(数据包大小)
返回响应


DEF SEND_COMMAND():
命令=字节([0x04、0x81、0x01、0xFF、0x2C、 0x01、0x01])
print ("komand:"、command)
print ("len:"、len (command))

#发送命令
ser.write (命令)
时间睡眠(0.5)

While True:
#发送命令
send_command()
#读取响应
响应= READ_RESPONSE ()
#打印回复
Print ("响应:"、响应)

MCU 代码

#包含
#包含
//*****
//引脚配置
//*****
静态空 uart_sendByte (uint8_t byte);

#define center_ID 0x04
#define COMMAND_ID 0x80
#define WRITE_CMD 0x01
#define READ_CMD 0x00
#define DATA_SIZE 2
Volatile uint16_t RECEIVED_DATA = 0;
//*****
// UART 初始化文档
//*****

#define SMCLK_115200 0
#define SMCLK_9600 1
#define ACLK_9600 2
#define SMCLK_19200 3

//#define UART_MODE ACLK_9600//SMCLK_115200//
#define UART_MODE SMCLK_115200//

void inituart()
{
//针对 UART 模式配置 USCI_A0
UCA0CTLW0 = UCSWRST;//将 eUSCI 置于复位状态

#if uart_mode == SMCLK_115200

UCA0CTLW0 |= UCSSEL_SMCLK;// CLK = SMCLK

//波特率设置
//使用系列用户指南中的表30-5
UCA0BR0 = 8;
UCA0BR1 = 0;
UCA0MCTLW |= UCOS16 | UCBRF_10 | 0xF700;//0xF700是 UCBRSx = 0xF7
//UCA0MCTLW |= UCOS16 | UCBRF_5 | 0xD600;//0xF700是 UCBRSx = 0xF7

#Elif UART_MODE = SMCLK_9600

UCA0CTLW0 |= UCSSEL_SMCLK;// CLK = SMCLK

//波特率设置
//使用系列用户指南中的表30-5
UCA0BR0 = 3;
UCA0BR1 = 0;
UCA0MCTLW |= UCOS16 | UCBRF_8 | 0xD600;//0xD600是 UCBRSx = 0xD6

#Elif UART_MODE = ACLK_9600

UCA0CTLW0 |= UCSSEL_ACLK;// CLK = ACLK
//波特率计算
// 32768/(9600)= 3.4133
//分数部分= 0.4133
//使用系列用户指南中的表24-5
UCA0BR0 = 3;// 32768/9600
UCA0BR1 = 0;
UCA0MCTLW |= 0x9200;//0x9200为 UCBRSx = 0x92
#Elif UART_MODE = SMCLK_19200

UCA0CTLW0 |= UCSSEL_SMCLK;// CLK = SMCLK

//波特率设置
//使用系列用户指南中的表30-5
UCA0BR0 = 3;
UCA0BR1 = 0;
UCA0MCTLW |= UCOS16 | UCBRF_4 | 0x0200;//0xF700是 UCBRSx = 0xF7


#else
#错误"请指定波特率115200或9600"
#endif

UCA0CTLW0 &=μ~UCSWRST;//初始化 eUSCI
UCA0IE |= UCRXIE;//启用 USCI_A0 RX 中断

//*****
//设备初始化
//*****

void initGPIO()
{
//配置 UART
P2SEL0 &=~(BIT0 | BIT1);
P2SEL1 |= BIT0 | BIT1;// USCI_A0 UART 操作

//将 P1.6和 P1.7设置为输出
P1DIR |= BIT6 | BIT7;
//为外部晶体振荡器配置 PJ.5 PJ.4
PJSEL0 |= BIT4 | BIT5;//表示 XT1

PM5CTL0 &=~μ A LOCKLPM5;

void initClock45C() 16MHz
{
//根据 MCLK 的器件数据表需要配置一个 FRAM 等待状态
//在配置时钟系统之前8MHz 之外的操作。
FRCTL0 = FRCTLPW | NWAITS_1;

//时钟系统设置
CSCTL0_H = CSKEY_H;//解锁 CS 寄存器
CSCTL1 = DCOFSEL_0;//将 DCO 设置为1MHz
//设置 SMCLK=MCLK=DCO、ACLK=LFXTCLK (如果不可用、则为 VLOCLK)
CSCTL2 = SELM__LFXTCLK | SELS__DCOCLK | SELM__DCOCLK;
//每器件勘误表将分频器设置为4,然后再将频率更改为
//防止过冲瞬变导致超出规范操作
CSCTL3 = DIVA_4 | DIVS__4 | DIVM_4;//将所有相应的 clk 源设置为4除以进行勘误
CSCTL1 = DCOFSEL_4 | DCORSEL;//将 DCO 设置为16MHz
//延迟~10us 以使 DCO 稳定。 60个周期= 20个周期缓冲区+(10us /(4MHz))
__delay_cycles (60);
CSCTL3 = DIVA_1 | DIVS__1 | DIVM_1;//将所有分频器设置为1以进行16MHz 操作

CSCTL4 &=~LFXTOFF;
正确
{
CSCTL5 &=~LFXTOFFG;//清除 XT1故障标志
SFRIFG1 &=~OFIFG;
—while (SFRIFG1&OFIFG);//测试振荡器的故障标志

CSCTL0_H = 0;//锁定 CS 寄存器

//*****
//主要文件
//如果使用 SMCLK,则进入 LPM0并等待 UART 中断。 如果使用 ACLK *
//然后器件将进入 LPM3模式。 UART RX 中断处理*
//接收到的字符并回显它。 *
//*****

int main (空)
{
uint8_t test1[10]={0};
INT I;
WDTCTL = WDTPW | WDTHOLD;//停止看门狗

initGPIO();
initClock45C(); 16MHz
inituart();

P1OUT &=~BIT6;
P1OUT &=~BIT7;
while (1)
{
P1OUT &=~BIT6;
P1OUT &=~BIT7;
while (! (UCA0IFG & UCRXIFG));
for (I=0;I<6;I++)
{
test1[i]= UCA0RXBUF;
___ delay_cycles(2000);

P1OUT |= BIT6;
P1OUT |= BIT7;
while (! (UCA0IFG & UCTXIFG));
for (I=0;I<6;I++)
{
UCA0TXBUF =测试1[i];
___ delay_cycles(2000);


  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Pierre:

    您是否尝试过编辑脚本以更慢地发送字符? 我想知道 MSP 是否没有时间读取每个传入字节。 您可能还会发现、将您的代码与我们的一些现有示例进行比较 会更容易。 通常、使用中断将传入的字节保存到缓冲区中、然后在代码的主体中处理/发送这些字节可能有助于消除计时问题。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Dylan:
    实际上、我之所以来到这个示例、是因为在 MSP430FR6047EVM_USS_MSP430FR6047EVM 中出现了读取问题 Water_Demo。 在这里、我更改了"Communication to UART"。  

    软件正在无问题发送、并且通过 PC 可以正确接收结果、但当我发送命令以从 PC 更改算法的某些配置时、这些命令无法接收。 我努力调试、意识到没有收到任何信息。 这就是为什么我来到公理会发送缓冲,并看到我可以回显它。  
    使用中断完全不起作用。 但是,如果我尝试阅读像我在前一封电子邮件我得到至少有些东西,但这不是完全正确的。  

     MSP430FR6047EVM_USS_MSP430FR6047EVM_USS_MSP430FR6047EVM 中软件内的代码 Water_Demo。 此函 数在 UART 中断例程 USCI_UART_UCRXIFG 的 UART.c 中不起作用。 就像我说的,发送是工作没有任何问题。  

    问题是、MSP430FR6047中没有一个示例会接收缓冲器、所有示例都会接收字符并回显字符。  

    如果您能告诉我是否有收到缓冲区的示例、可能会有所帮助。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Pierre:

    我们有关器件的示例仅接收一个字符的原因是这是最基本的器件行为。 即使在接收一个缓冲区时、该缓冲区也会被逐字符接收、并使用软件保存到一个缓冲区中。 因此、我们让设计人员根据需要将每个字符保存到缓冲区中并对该缓冲区进行处理。

    我还要补充一点、在 USS 演示中使用任何中断时、您将遇到一些影响器件行为的其他中断。 就我的经验而言、当为 UART 之类的东西添加中断时、我需要禁用所有其他中断。  

    当从 PC 发送到 MSP 的操作正常时、但 MSP 的参数未保存时、您是否确定数据包是否正确匹配 HID 桥结构? 您可能已经看过该视图、但为了清晰起见、 此处 是 HID 接口说明的链接。