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.

[参考译文] MSP432P401R:与 MSP430G2553进行 MSP432P401R UART 通信

Guru**** 2529560 points
Other Parts Discussed in Thread: MSP430G2553

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/592402/msp432p401r-msp432p401r-uart-communication-with-msp430g2553

器件型号:MSP432P401R
主题中讨论的其他器件:MSP430G2553

大家好、

我的项目上遇到了问题、这是我的最后一篇论文。 在该项目中、我尝试通过 UART 上的蓝牙模块与 MSP432进行通信。 我将与大家分享我的发送器器件代码和接收器件代码、但首先、我想解释我所面临的问题;我正在尝试使用以下代码通过 MSP430发送一些测量数据。 MSP430 G2553正以发送器的形式正确发送数据。 如果接收器侧也是 MSP430 G2553、则可以正确获取从 UART 接收到的数据、但如果接收器侧是 MSP432、则无法正确获取数据。

以下代码是由 MSP430G2553运行的发送器部分;

#include 

char X_Axis;
char Y_Axis;
char Z_Axis;
char Griper_Axis;
char PreambLE_1 ='A';
char PreambLE_2 ='B';
char PreambLE_3 ='C';

void PIN_Config (void);
void TIME_Config (void);
void UART_Config (void);
void ADC_Config (void);
void ADC_Reading_X_Axis (void);
void ADC_Reading_Y_Axis (void);
void ADC_Reading_Z_Axis (void);
void ADC_Reading_Griperm_Axis (void);
void translation_to-MSP432 (void);

void main (void)
{
WDTCTL = WDTPW | WDTHOLD;

PIN_Config ();
TIME_Config ();
UART_Config ();
ADC_Config ();

while (1){
ADC_Reading_X_Axis ();
ADC_Reading_Y_Axis ();
ADC_Reading_Z_Axis ();
ADC_Reading_Griper_Axis ();
正在发送_TO_MSP432();
}


void PIN_Config (void){
P1SEL = BIT1 | BIT2;
P1SEL2 = BIT1 | BIT2;
P2DIR = 0xFF;
P2OUT &=~0x00;
}

void time_Config (void){
DCOCTL = 0;
BCSCTL1 = CALBC1_1MHz;
DCOCTL = CALDCO_1MHz;
}

void UART_Config (void){
UCA0CTL1 |= UCSWRST | UCSSEL_2;
UCA0BR0 = 8;
UCA0BR1=0;
UCA0MCTL = UCBRS_6;
UCA0CTL1 &=~UCSWRST;
}

void ADC_Config (void){
ADC10CTL0 = SREF_0 | ADC10ON | ADC10SHT_3;
}

void ADC_Reading_X_Axis (void){
ADC10CTL0 &=~ENC;
ADC10CTL1 = INCH_0 | CONSEQ_0 | ADC10SSEL_0;
ADC10AE0 |= BIT0;
ADC10CTL0 |= ENC | ADC10SC;
while (ADC10CTL1 & ADC10BUSY);
x_Axis =(ADC10MEM >> 7);
}

void ADC_Reading_Y_Axis (void){
ADC10CTL0 &=~ENC;
ADC10CTL1 = INCH_3 | CONSEQ_0 | ADC10SSEL_0;
ADC10AE0 |= BIT3;
ADC10CTL0 |= ENC | ADC10SC;
while (ADC10CTL1 & ADC10BUSY);
Y_Axis =(ADC10MEM >> 7);
}

void ADC_Reading_Z_Axis (void){
ADC10CTL0 &=~ENC;
ADC10CTL1 = INCH_4 | CONSEQ_0 | ADC10SSEL_0;
ADC10AE0 |= BIT4;
ADC10CTL0 |= ENC | ADC10SC;
while (ADC10CTL1 & ADC10BUSY);
Z_Axis =(ADC10MEM >> 7);
}

void ADC_Reading_Griper_Axis (void){
ADC10CTL0 &=~ENC;
ADC10CTL1 = INCH_5 | CONSEQ_0 | ADC10SSEL_0;
ADC10AE0 |= BIT5;
ADC10CTL0 |= ENC | ADC10SC;
while (ADC10CTL1 & ADC10BUSY);
夹具轴=(ADC10MEM >> 7);
}

void translation_TO_MSP432 (void){
UCA0TXBUF =前导码_1;
while (!(IFG2 & UCA0TXIFG));
UCA0TXBUF =前导码_2;
while (!(IFG2 & UCA0TXIFG));
UCA0TXBUF =前导码_3;
while (!(IFG2 & UCA0TXIFG));
UCA0TXBUF = X_Axis;
while (!(IFG2 & UCA0TXIFG));
UCA0TXBUF = Y_Axis;
while (!(IFG2 & UCA0TXIFG));
UCA0TXBUF = Z_轴;
while (!(IFG2 & UCA0TXIFG));
UCA0TXBUF = Griper_Axis;
while (!(IFG2 & UCA0TXIFG));
} 


以下代码是 MSP430G2553选择 MSP430G2553作为接收器端时运行的接收器部分;

#include 

int i = 0;
char X_Axis;
char Y_Axis;
char Z_Axis;
char Griper_Axis;
char
前导码_1 = 0x41;char 前导码_2 = 0x42;
char 前导码_3 = 0x43;

void PIN_Config (void);
void time_Config (void);
void UART_Config (void);

void main (void)
{
WDTCTL = WDTPW | WDTHOLD;

PIN_Config();
TIME_Config();
UART_Config();

enable_interrupts ();

LPM0;
}

void PIN_Config (void){
P1SEL = BIT1 | BIT2;
P1SEL2 = BIT1 | BIT2;
P1DIR = 0xF9;
P2DIR = 0xFF;
P1OUT = 0x00;
P2OUT = 0x00;
}

void time_Config (void){
DCOCTL = 0;
BCSCTL1 = CALBC1_1MHz;
DCOCTL = CALDCO_1MHz;
}

void UART_Config (void){
UCA0CTL1 |= UCSWRST | UCSSEL_2;
UCA0BR0 = 8;
UCA0BR1=0;
UCA0MCTL = UCBRS_6;
UCA0CTL1 &=~UCSWRST;
IE2 |= UCA0RXIE;
}


#pragma vector = USCIAB0RX_vector
__interrupt void USCIAB0RX_ISR (void){

if (i = 0){
IF (UCA0RXBUF =前导码_1)
I = 1;
其他
I = 0;
}
否则、如果(i = 1){
IF (UCA0RXBUF =前导码_2)
I = 2;
其他
I = 0;
}
否则、如果(i ==2){
IF (UCA0RXBUF =前导码_3)
I = 3;
其他
I = 0;
}
否则、如果(i = 3){
x_Axis = UCA0RXBUF;
I = 4;
}
否则、如果(i = 4){
Y_Axis = UCA0RXBUF;
I = 5;
}
否则、如果(i == 5){
Z_Axis = UCA0RXBUF;
I = 6;
}
否则、如果(i ==6){
夹具轴= UCA0RXBUF;
I = 0;
}
}

如果选择 MSP432作为接收器端、则 belowcode 是由 MSP432运行的接收器部分;

#include "driverlib.h"
#include 
#include 

int i = 0;
char X_Axis;
char Y_Axis;
char Z_Axis;
char Griper_Axis;
字符前导码_1 ='A';
字符前导码_2 ='B';
字符前导码_3 ='C';
字符接收到的数据= 0x00;

const eUSCI_UART_Config uartConfig =
{
EUSCI_A_UART_CLOCKSOURCE_SMCLK、 // SMCLK 时钟源
1、 // BRDIV = 8
10、 // UCxBRF =-
0、 // UCxBRS = 0xD6
EUSCI_A_UART_NO_奇 偶校验、 //无奇偶校验
EUSCI_A_UART_MSB_FIRST、 // MSB 优先
EUSCI_A_UART_One_stop_bit、 //一个停止位
EUSCI_A_UART_MODE、 // UART 模式
EUSCI_A_UART_oversampling_BAUDRATE_generation、//无过采样
};

int main (void)
{
WDT_A_HOLDTimer();

/*在 UART 模式下选择 P1.2和 P1.3 */
GPIO_setPeripheralModuleFunctionInputPin (GPIO_PORT_P3、GPIO_PIN2 | GPIO_PIN3、GPIO_PRIMARY_MODULE_Function);

CS_setDCOFrequency (1000000);

UART_initModule (EUSCI_A2_base、uartConfig); /*配置 UART 模块*/
UART_enableModule (USCI_A2_base); /*启用 UART 模块*/
UART_enableInterrupt (EUSCI_A2_base、EUSCI_A_UART_receive_interrupt);//启用中断*
INTERRUPT_enableInterrupt (INT_EUSCIA2);
interrupt_enableMaster();
interrupt_enableSlepOnIsrExit();

while (1)
{
PCM_gotoLPM0 ();
}
}

空 EUSCIA2_IRQHandler (空)
{
uint32_t status = UART_getEnabledInterruptStatus (EUSCI_A2_base);

UART_clearInterruptFlag (EUSCI_A2_base、status);

IF (STATUS 和 EUSCI_A_UART_receive_interrupt_FLAG)
{
Received_Data = UART_receiveData (EUSCI_A2_base);

if (i = 0){
if (Received_Data =前导码_1)
I = 1;
其他
I = 0;
}
否则、如果(i = 1){
if (Received_Data =前导码_2)
I = 2;
其他
I = 0;
}
否则、如果(i ==2){
if (Received_Data =前导码_3)
I = 3;
其他
I = 0;
}
否则、如果(i = 3){
x_Axis =接收到的数据;
I = 4;
}
否则、如果(i = 4){
Y_Axis =接收到的数据;
I = 5;
}
否则、如果(i == 5){
Z_Axis =接收到的数据;
I = 6;
}
否则、如果(i ==6){
夹具轴=接收到的数据;
I = 0;
}
}
interrupt_disableSlepOnIsrExit();
} 
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    有一点、需要使中断处理程序中访问的所有全局变量都是易失性的。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好的、但尽管我对 volatile 执行了所有全局变量、但代码仍不运行。 无论如何都很感谢:)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
     >       EUSCI_A_UART_MSB_FIRST,                         // MSB First
     
    这看起来很可疑-- MSB 优先与 G2553不匹配,更不用说在 UART 世界中很常见。
    尝试将其设置为 LSB 优先。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Bruce、

    不幸的是,这对我来说是行不通的。 您对我收到的错误有什么想法吗?

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

    您能否提供有关您看到的错误的更多详细信息? 您正在使用什么 MSP432 LaunchPad 版本? 黑色还是红色?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Evan、

    ı 正在使用红色的。 您谈论的代码或 CCS 错误是什么?

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

    您发布的 CCS 映像不是我关心的问题。 我更想知道"某些数据将传送到 RXBUF、但整个代码不会运行"这句话。 您能解释一下这是什么意思吗? 您是否获得了一些数据?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我将会因内在活动而关闭此主题。 如果您有与上述主题无关的另一个问题、请发布另一个主题、如果您有任何其他与此相关的问题、请随时在此处发布、主题将重新打开。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    请接受我对延迟回复的道歉。 主要问题是、虽然我认为 MSP432的所有代码行都正确、但两个微处理器之间没有通信。 MSP430 G2553作为发送器发送数据、如果接收器也是 MSP430 G2553作为接收器、则会正确获取接收到的数据、但如果接收器是 MSP432 (红色)、尽管 MSP430 G2553发送数据、但 MSP432无法获取正确的数据。 我在代码的某个地方犯了一些错误、但我找不到。 我必须重新解释我遇到的所有问题、因为我在发布此问题时非常忙、无法正确解释此问题。 再次感谢您的关注。

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

    无需担心延迟响应。 感谢您澄清这是一个红色 launchpad。 当您说 MSP432无法获取正确的数据时、能否举个例子说明您接收到了哪些数据? 可能是对预期结果与您的预期结果的比较? 或者您是否看到零通信?

    您需要的波特率是多少? 您是否已确保您实施的 UART 设置为每个器件提供所需的预期波特率?

    software-dl.ti.com/.../index.html

    上面的链接应该有助于波特率设置。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Evan、

    首先、我要感谢您的关注和快速响应。 例如、我想在 MSP432接收器上看到一个介于0和7之间的值、但它会随机获取一些值。 尽管我使用该工具来处理115200波特率、但可能我犯了一个错误。 我将重试并在24小时内写入。 因此、有一个通信、但它不是我想要的。

    此致、

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

    您好 Evan、

    我计算了波特率设置、但它们与我的设置相同。 因此、它仍然不起作用。 除了运行然后停止代码之外、我还会收到错误或下图中的内容。 RXBUF 正在获取一些数据、但没有我想要的数据。

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

    您是否有机会使用 TX 和 RX 引脚的逻辑分析仪提供示波器截图? 这将有助于查看您是按预期向 G2553传输数据、还是 RX 实际上导致了该问题。

    与0x0082相对、您希望在 UCARXBUF 中接收到什么?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Evan、

    正如您在发送器代码中看到的、在开始来自 G2553中 ADC 的数据之前、G2553正在发送三个前导码数据以校正数据包的传输。 因此、我只需要在 MSP432 RXBUF 中看到前三个前导码数据和一个介于0和7之间的数字作为字符。 遗憾的是、我没有机会发布逻辑分析。 不过、让我更详细地介绍一下代码。 我想在 MSP432和图片的右上角看到一个字符格式的数字。 在下图中、接收到的数据与 msp432的 UCARXBUF 直接相关。 因此、在那里可以看到不需要的数据、但有时可以看到"B"、即前导码2。 此外、当我暂停跑步时、会打开2下的选项卡。