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.

[参考译文] MSP430FR6043:使用 PJ.0/PJ2/PJ3上的 UCA2'SPI 端口

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1378057/msp430fr6043-use-the-uca2-s-spi-port-on-pj-0-pj2-pj3

器件型号:MSP430FR6043

工具与软件:

您好;

我正在尝试使用 PJ.0/PJ2/PJ3上的 UCA2 SPI 端口。 我无法使它正常工作。  

使用相同的代码并将 UCA2的 SPI 映射到 P5.2/P5.1/P5.0、它可以正常工作。

以下是我用于配置 SPI 端口的代码。

这基于我下载的示例项目"eusci_a_spi_ex1_master"。

谢谢!

================

#include "driverlib.h"

uint8_t RXData = 0;
uint8_t TXData = 0;

void main (void)

volatile uint16_t i;

//停止看门狗计时器
WDT_A_HOLD (WDT_A_BASE);

/*
*选择端口1
*将引脚0设置为输出
*/
GPIO_setAsOutputPin (
GPIO_PORT_P1、
GPIO_PIN0
);
/*
*选择端口1
*将引脚0设置为输出低电平。
*/
GPIO_setOutputLowOnPin (
GPIO_PORT_P1、
GPIO_PIN0
);

//将 DCO 频率设置为最大 DCO 设置
CS_setDCOFreq (CS_DCORSEL_0、CS_DCOFSEL_3);
//选择 DCO 作为 SMCLK 的时钟源(无分频器)
CS_initClockSignal (CS_SMCLK、CS_DCOCLK_SELECT、CS_CLOCK_DIVIDER_1);

/*
*选择端口 J
*将引脚0设置为输入辅助模块功能(UCA2CLK)。
*/
GPIO_setAsPeripheralModuleFunctionInputPin (
GPIO_PORT_PJ、
GPIO_PIN0、
GPIO_secondary_module_function
);

/*
*选择端口 J
*将引脚2、3设置为输入辅助模块功能(UCA2TXD/UCA2SIMO、UCA2RXD/UCA2SOMI)。
*/
GPIO_setAsPeripheralModuleFunctionInputPin (
GPIO_PORT_PJ、
GPIO_PIN2 + GPIO_PIN3、
GPIO_secondary_module_function
);

/*
*禁用 GPIO 上电默认高阻抗模式以激活
*先前配置的端口设置
*/
PMM_UNlockLPM5 ();

//初始化主设备
EUSCI_A_SPI_initMasterParam 参数={0};
param.selectClockSource = EUSCI_A_SPI_CLOCKSOURCE_SMCLK;
param.clockSourceFrequency = CS_getSMCLK ();
param.desiredSpiClock = 500000;
param.msbFirst = EUSCI_A_SPI_MSB_FIRST;
param.clockPhase = EUSCI_A_SPI_PHASE_DATA_CHANGED_ONFIRST_CAPTURED_ON_NEXT;
param.clockPolarity = EUSCI_A_SPI_CLOCKPOLARITY_INACTIVE_HIGH;
param.spiMode = EUSCI_A_SPI_3pin;
EUSCI_A_SPI_initMaster (EUSCI_A2_BASE、&param);

//启用 SPI 模块
EUSCI_A_SPI_ENABLE (EUSCI_A2_BASE);

EUSCI_A_SPI_clearInterrupt (EUSCI_A2_base、
EUSCI_A_SPI_RECEIVE_INTERRUPT);
//启用 USCI_A2 RX 中断
EUSCI_A_SPI_enableInterrupt (EUSCI_A2_BASE、
EUSCI_A_SPI_RECEIVE_INTERRUPT);

//等待从机初始化
__delay_cycles (100);

TXData = 0x1;//保存 TX 数据

//USCI_A2 TX 缓冲器是否准备就绪?
while (! EUSCI_A_SPI_getInterruptStatus (EUSCI_A2_base、
EUSCI_A_SPI_TRANSMIT_INTERRUPT);

//将数据发送到从机
EUSCI_A_SPI_transmitData (EUSCI_A2_base、TXData);

__bis_SR_register (LPM0_bits + GIE);// CPU 关闭、启用中断
___ no_operation ();//保留在 LPM0中
}

#if defined (__TI_Compiler_version__)|| defined (__IAR_SYSTEMS_ICC__)
#pragma VECTOR=USCI_A2_VECTOR
_interrupt
#elif defined (_GNUC__)
_attribute__((interrupt (USCI_A2_VECTOR))
#endif
void USCI_A2_ISR (void)

开关(__EVEN_IN_RANGE (UCA2IV、USCI_SPI_UCTXIFG))

案例 USCI_SPI_UCRXIFG:// UCRXIFG
//USCI_A2 TX 缓冲器是否准备就绪?
while (! EUSCI_A_SPI_getInterruptStatus (EUSCI_A2_base、
EUSCI_A_SPI_TRANSMIT_INTERRUPT);

RXData = EUSCI_A_SPI_receiveData (EUSCI_A2_BASE);

//递增数据
TXData++;

//发送下一个值
EUSCI_A_SPI_transmitData (EUSCI_A2_BASE、
TXData
);

//从机处理信息的传输之间的延迟
__delay_cycles (40);
休息;
默认值:
休息;
}
}

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

    GPIO_setAsPeripheralModuleFunctionInputPin (GPIO_PORT_PJ、GPIO_PIN2 + GPIO_PIN3、GPIO_secondary_module_function);

    根据数据表(SLASEF5B)表9-47、对于 UCA2、PSEL=01、因此这应该是:

    GPIO_setAsPeripheralModuleFunctionInputPin (GPIO_PORT_PJ、GPIO_PIN2 + GPIO_PIN3、GPIO_PRIMARY_MODULE_FUNCTION);

    PJ.0也是如此。

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

    非常感谢您的快速回复。

    我已根据您的建议更改了 GPIO 设置:使用  GPIO_primary_module_function。

    我仍然无法使 PJ.0/UCA2CLK 正常工作、没有 SPI 时钟输出。

    但是、我确实看到了 PJ2/UCA2SIMO 输出数据信号。

    有什么建议吗?

    以下是更新后的代码:

    //=============

    #include "driverlib.h"

    uint8_t RXData = 0;
    uint8_t TXData = 0;

    void main (void)

    volatile uint16_t i;

    //停止看门狗计时器
    WDT_A_HOLD (WDT_A_BASE);

    /*
    *选择端口1
    *将引脚0设置为输出
    */
    GPIO_setAsOutputPin (
    GPIO_PORT_P1、
    GPIO_PIN0
    );
    /*
    *选择端口1
    *将引脚0设置为输出低电平。
    */
    GPIO_setOutputLowOnPin (
    GPIO_PORT_P1、
    GPIO_PIN0
    );

    //将 DCO 频率设置为最大 DCO 设置
    CS_setDCOFreq (CS_DCORSEL_0、CS_DCOFSEL_3);
    //选择 DCO 作为 SMCLK 的时钟源(无分频器)
    CS_initClockSignal (CS_SMCLK、CS_DCOCLK_SELECT、CS_CLOCK_DIVIDER_1);

    /*
    *选择端口 J
    *将引脚0设置为输入辅助模块功能(UCA2CLK)。
    */
    GPIO_setAsPeripheralModuleFunctionInputPin (
    GPIO_PORT_PJ、
    GPIO_PIN0、
    GPIO_PRIMARY_MODULE_FUNCTION
    );

    /*
    *选择端口 J
    *将引脚2、3设置为输入辅助模块功能(UCA2TXD/UCA2SIMO、UCA2RXD/UCA2SOMI)。
    */
    GPIO_setAsPeripheralModuleFunctionInputPin (
    GPIO_PORT_PJ、
    GPIO_PIN2 + GPIO_PIN3、
    GPIO_PRIMARY_MODULE_FUNCTION
    );

    /*
    *禁用 GPIO 上电默认高阻抗模式以激活
    *先前配置的端口设置
    */
    PMM_UNlockLPM5 ();

    //初始化主设备
    EUSCI_A_SPI_initMasterParam 参数={0};
    param.selectClockSource = EUSCI_A_SPI_CLOCKSOURCE_SMCLK;
    param.clockSourceFrequency = CS_getSMCLK ();
    param.desiredSpiClock = 500000;
    param.msbFirst = EUSCI_A_SPI_MSB_FIRST;
    param.clockPhase = EUSCI_A_SPI_PHASE_DATA_CHANGED_ONFIRST_CAPTURED_ON_NEXT;
    param.clockPolarity = EUSCI_A_SPI_CLOCKPOLARITY_INACTIVE_HIGH;
    param.spiMode = EUSCI_A_SPI_3pin;
    EUSCI_A_SPI_initMaster (EUSCI_A2_BASE、&param);

    //启用 SPI 模块
    EUSCI_A_SPI_ENABLE (EUSCI_A2_BASE);

    EUSCI_A_SPI_clearInterrupt (EUSCI_A2_base、
    EUSCI_A_SPI_RECEIVE_INTERRUPT);
    //启用 USCI_A2 RX 中断
    EUSCI_A_SPI_enableInterrupt (EUSCI_A2_BASE、
    EUSCI_A_SPI_RECEIVE_INTERRUPT);

    //等待从机初始化
    __delay_cycles (100);

    TXData = 0x1;//保存 TX 数据

    //USCI_A2 TX 缓冲器是否准备就绪?
    while (! EUSCI_A_SPI_getInterruptStatus (EUSCI_A2_base、
    EUSCI_A_SPI_TRANSMIT_INTERRUPT);

    //将数据发送到从机
    EUSCI_A_SPI_transmitData (EUSCI_A2_base、TXData);

    __bis_SR_register (LPM0_bits + GIE);// CPU 关闭、启用中断
    ___ no_operation ();//保留在 LPM0中
    }

    #if defined (__TI_Compiler_version__)|| defined (__IAR_SYSTEMS_ICC__)
    #pragma VECTOR=USCI_A2_VECTOR
    _interrupt
    #elif defined (_GNUC__)
    _attribute__((interrupt (USCI_A2_VECTOR))
    #endif
    void USCI_A2_ISR (void)

    开关(__EVEN_IN_RANGE (UCA2IV、USCI_SPI_UCTXIFG))

    案例 USCI_SPI_UCRXIFG:// UCRXIFG
    //USCI_A2 TX 缓冲器是否准备就绪?
    while (! EUSCI_A_SPI_getInterruptStatus (EUSCI_A2_base、
    EUSCI_A_SPI_TRANSMIT_INTERRUPT);

    RXData = EUSCI_A_SPI_receiveData (EUSCI_A2_BASE);

    //递增数据
    TXData++;

    //发送下一个值
    EUSCI_A_SPI_transmitData (EUSCI_A2_BASE、
    TXData
    );

    //从机处理信息的传输之间的延迟
    __delay_cycles (40);
    休息;
    默认值:
    休息;
    }
    }

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

    显然 PJ.0确实有一些奇怪的东西--对于 UCA2CLK、你必须明确地使它成为一个输出才能使它起作用:

    https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/820120/msp430fr6043-issue-with-spi-clk-uca2-when-mapped-to-port-pj

    该主题建议直接设置 PJDIR。  如果您愿意,还会出现一个 GPIO_setAPeripheralModuleFunctionOutputPin ()函数。

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

    再次感谢!