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.

[参考译文] MSP-EXP430F5529LP:将 SPI 与 MSP430搭配使用

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/969687/msp-exp430f5529lp-using-spi-with-the-msp430

器件型号:MSP-EXP430F5529LP

大家好、我有一个 MSP430开发板、 MSP-EXP430F5529LP。  在我在这个论坛和网络上的其他地方进行的所有搜索中、似乎"3线"SPI MSP430支持的是时钟线路和数据输入/输出线路、但不支持从器件选择线路。  要使用从器件选择线路、您必须手动切换 GPIO 输出引脚。  这真的是真的吗???

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

    尊敬的 Terence:

    是的、通常第4个独立的从器件选择连接与3线模式一起使用。

    BR、
    Leo

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

    是否无法使用 MSP430实现这一自动化?

    理想情况下、我想在 MSP430上设置 SPI、这样我只需使用我希望发送的数据调用一个发送函数、外设将相应地自动切换从器件选择线路。  这就是它与我使用过的其他微控制器的工作方式。

    但是、根据我所读的内容、MSP430似乎无法实现这一点。  似乎我需要手动将 GPIO 引脚切换为高电平/低电平以进行从器件选择。  我的理解是否正确?

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

    尊敬的 Terence:

    是的。 另一种选择是使用4线 SPI 接口。

    BR、
    Leo

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

    我认为用户指南(SLAU208Q)第37.3节指出、对于4线制主器件、STE 引脚会自动切换。 不幸的是,我在第37章中看不到这方面的明确说明。 (eUSCI 具有 UCSTEM 功能、并且明确地说是这样。)  

    我不确定的原因是我从未在 MSP430上使用过4线制主器件、因为自动 STE 会在每个字节周围置位 STE、并且我使用的每个 SPI 从器件都要求在整个事务中置位 STE。 [参考 UG 图37-4和40-4]这不是 MSP430所独有的、大多数 SPI 主站都是这样工作的。

    我之所以说出来、是因为:如果您的从器件在整个事务中需要将 STE 置为有效、则必须使用具有显式 GPIO 的3线制 STE (没有理由确定它是否起作用)。

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

    H Bruce -感谢您的参与。 是的、我的从器件要求在整个传输过程中将 STE 置为有效。  在参考第37.3节时、我认为您是指数据表中的以下特定报价:

    在发布之前阅读数据表时、我遗漏了这一点。  我想我读出 MSP-EXP430F5529LP 仅在 3线模式下实现了 USCI SPI。

    我将弄清楚如何执行4线制主器件、并明确设置 STE 的 GPIO、然后使用我的结果进行回布置。  谢谢你。

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

    如果您使用的是用于 STE (/CS)的 GPIO、则应使用3线模式。 在这种情况下、如果您使用4线制模式、则可能必须摆动(痕量) STE、以便 SPI 单元能够看到它所需的内容、这是一种痛苦、没有好处。 在3线制模式下、它完全忽略 STE。 在3线制模式下、您可以将标有 STE (作为 GPIO)的引脚用于/CS、或使用其他一些引脚、这是方便的。

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

    [引用用户="Bruce McKenney47378"]

    在3线制模式下、您可以将标有 STE (作为 GPIO)的引脚用于/CS、或使用其他一些引脚、这是方便的。

    [/报价]

    谢谢、Bruce。  不过、这是问题所在。  我的从外设需要 CS (片选)、我更愿意不必手动切换 CS 的 GPIO 引脚。  我之前使用过的每个其他微处理器都包含一个带有 SPI 的 CS 引脚、该引脚在数据发送前后自动切换、因此我很难理解为什么 MSP430不会切换。

    我有一些时间来进一步调查。  我在 MSP430 DriverLib 文档中看到的是,它似乎不支持芯片选择行:(   

    如果您查看数据表、您会看到它似乎支持具有片选的4引脚 SPI (请参阅下面的寄存器字段 UCMODEx):

    如果您看一下《适用于 MSP430F5xx_6xx 器件的 MSP430 DriverLib 用户指南》、您将看到 USCI_A_SPI_initMaster ()。  但是、如果您深入研究该函数的 DriverLib 代码、您会发现它不支持修改 UCMODE 寄存器字段:

    bool USCI_A_SPI_initMaster (uint16_t baseAddress、USCI_A_SPI_initMasterParam * param)
    {
    //禁用 USCI 模块
    HWREG8 (baseAddress + OFS_UCAxCTL1)|= UCSWRST;
    
    //重置 OFS_UCAxCTL0值
    HWREG8 (baseAddress + OFS_UCAxCTL0)&=~(UCCKPH + UCCKPL + UC7BIT + UCMSB +
    UCMST + UCMODE_3 + UCSYNC);
    
    //重置 OFS_UCAxCTL1值
    HWREG8 (baseAddress + OFS_UCAxCTL1)&=~(UCSSEL_3);
    
    //选择时钟
    HWREG8 (baseAddress + OFS_UCAxCTL1)|= param->selectClockSource;
    
    HWREG16 (baseAddress + OFS_UCAxBRW)=
    (uint16_t)(param->clockSourceFrequency / param->desedSpiClock);
    
    /*
    *配置为 SPI 主模式。
    *时钟相位选择、极性、MSB
    * UCMST =主控模式
    * UCSYNC =同步模式
    * UCMODE_0 = 3引脚 SPI
    *
    HWREG8 (baseAddress + OFS_UCAxCTL0)|=(
    param->msbFirst +
    param->clockPhase +
    param->clockPolarity +
    UCMST +
    UCSYNC +
    UCMODE_0
    );
    //无调制
    HWREG8 (baseAddress + OFS_UCAxMCTL)= 0;
    
    返回( STATUS_SUCCES);
    } 

    我的 SPI 代码如下所示:

    #define SPICLK 500000
    uint8_t transmitData = 0x00;
    
    void main (void)
    {
    //停止看门狗计时器
    WDT_A_HOLD (WDT_A_base);
    
    GPIO_setPeripheralModuleFunctionOutputPin (GPIO_PORT_P2、GPIO_PIN7);
    GPIO_setPeripheralModuleFunctionOutputPin (GPIO_PORT_P3、GPIO_PIN4);
    GPIO_setPeripheralModuleFunctionOutputPin (GPIO_PORT_P3、GPIO_PIN3);
    GPIO_setPeripheralModuleFunctionOutputPin (GPIO_PORT_P3、GPIO_PIN2);
    
    //初始化主设备
    USCI_A_SPI_initMasterParam param ={0};
    param.selectClockSource = USCI_A_SPI_CLOCKSOURCE_SMCLK;
    param.clockSourceFrequency = UCS_getSMCLK();
    param.desiredSpiClock = SPICLK;
    param.msbFirst = USCI_A_SPI_MSB_FIRST;
    param.clockPhase = USCI_A_SPI_PHASE_DATA_Changed_ONFIRST_captured_on_next;
    param.clockPolarity = USCI_A_SPI_CLOCKPOLARITY_INACT_LOW;
    
    返回值= USCI_A_SPI_initMaster (USCI_A0_BASE、&param);
    如果(STATUS_FAIL =返回值){
    返回;
    }
    
    //启用 USCI_A_SPI 模块
    USCI_A_SPI_ENABLE (USCI_A0_BASE);
    
    //配置端口引脚以复位从器件
    //等待从器件初始化
    _DELAY_CYCLES (100);
    
    //初始化数据值
    transmitData = 0x00;
    
    //向从器件发送数据
    while (1)
    {
    USCI_A_SPI_transmitData (USCI_A0_BASE、transmitData);
    transmitData++;
    }
    }
    

    当运行我的代码并使用我的逻辑分析仪查看 MSP430的引脚时、我看到:

    ^正如预期的那样、P3.2 UCA0STE 上没有任何内容。  我甚至在调用 USCI_A_SPI_initMaster()后尝试手动设置寄存器字段,希望它能通过以下操作正确激活它:

    UCA0CTL0 |= 0x1;
    UCA0CTL0 |= UCMODE_2;

    但这似乎不起作用、因为我的逻辑分析仪在执行此操作时根本不显示任何内容、甚至在 SCLK 或主输出线上也不显示。

    MSP430是否有支持此功能的不同型号???

    如果对此有任何想法,我们将不胜感激。

    谢谢

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

    您的原始信息似乎是正确的。 我可以告诉 USCI (如 F5529上所示)在任何模式下都不支持动态驱动 STE。 当 UCMODE=2或3时、STE 是一个到主器件的输入。 您必须自己驱动从属方/CS。

    我尝试了4线制模式、但我使用了 REN 电阻器将 STE 拉至非活动状态(因此主器件处于活动状态)。 我成功地使用了这个事实告诉我 STE 是一个输入、因此您不会获得它来驱动从器件的/CS 引脚。 UG 表37-1中的另一个线索:当 UCMODE=2 (STE 低电平有效)使 STE 有效(低电平)使主器件处于非活动状态、即如果主器件集 STE 有效、它将停止(冲突)。

    eUSCI (在最近的 MSP430器件中可见)支持使用 UCSTEM=1的自动 STE。 当 UCSTEM=0时、USCI 的运行方式似乎与 eUSCI 的运行方式相匹配。

    以下是我使用的程序供参考:

    #include 
    
    int main (void){
    WDTCTL = WDTPW | WDTHOLD;
    
    P3OUT |= BIT2; // STE
    P3REN |= BIT2;
    
    // mode=(0,0),主设备,MSB 优先,SYNC,4引脚(L), SMCLK
    UCA0CTL0 =(1*UCCKPH)|(0*UCCKPL)| UCMST | UCMSB | UCSYNC | UCMODE_2;
    UCA0CTL1 = UCSSEL_2 | UCSWRST;
    UCA0BRW = 2; // 500kHz,我猜
    UCA0CTL1 &=~UCSWRST;
    
    P3SEL |=(BIT2 | BIT3 | BIT4);// STE、MISO、MOSI
    P2SEL |= BIT7; // SCK
    
    while (1)
    {
    P3OUT |= BIT2; // STE 无效,所以主器件激活
    UCA0TXBUF = 0x55;
    while (UCA0STAT & UCBUSY)/* empty*/;
    P3OUT &=~BIT2;
    _DELAY_CYCLES (2*2*8); //范围
    在 BRW=2时为2个字节的时间}
    /*NOTREACHED*/
    返回(0);
    }
    

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

    好的、感谢 Bruce 的确认。  我将介绍一些 MSP430支持 eUSCI 的功能。