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.

[参考译文] MSP430FR4133:Miso卡在0

Guru**** 2549390 points
Other Parts Discussed in Thread: AFE4300

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/664655/msp430fr4133-miso-stuck-at-0

部件号:MSP430FR4133
主题中讨论的其他部件:AFE4300

我正在尝试将MSP430启动板与AFE4300评估板连接起来,以建立SPI通信。 我知道我的硬件连接是正确的,就像使用相同的连接一样,我可以从提供的AFE4300 GUI中读取和写入AFE中的寄存器,AFE4300也使用SPI。

下面是我的代码。 该代码尝试将0x0408写入0x0A寄存器,然后读取该地址的值。 我用示波器探测Miso,MOSI,SCLK和STE (WFP 5.0)的信号。 问题仅与味增有关。 当STE变低时,Miso会变高。 当MSP430开始传输时,它将返回零。 在下次STE降低之前,它将保持低电平。 我检查了状态标志。 我会遇到超限错误。 为了纠正这种情况,我在ISR内添加了这一行代码(在某个论坛上看到有人使用它),"同时(UCB0STAT和UCBUSY);"。 我的传输缓冲区采用正确的值并正确传输,但我始终读取零。 请帮我解决问题。 我本来会使用eUSI_A0而不是eUSI_B0进行验证,但是MSP430的启动板在WFP 1.2 上有一个复位按钮,在WFP 1.0 上有一个红色LED。

#include <MSP4S.h>

无符号字符RXData =0;
未签名的char TXData;
内部主(无效)

WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器

P5SEL0 || BIT1 | BIT2 | BIT3;    //将3-SPI引脚设置为第二个函数

UCB0CTLW0 |= UCSWRST;      //**将状态机置于复位**
                           // 4引脚,8位SPI主控
UCB0CTLW0 |= UCMST|UCSYNC|UCCKPH|UCMSB|UCMODE_1|UCSTEM;
                                                             //时钟极性高,MSB
UCB0CTLW0 |= UCSSEL__SMCLK;                                 //选择SMCLK
UCB0BR0 = 0x04;                                               ///2,fBitClock = fBRCLK/(UCBRx+1)。 SCLK的时间段为4US
UCB0BR1 = 0;
//UCA0MCTLW = 0;                                               //无调制
UCB0CTLW0 &=~UCSWRST;                                      //**初始化USCI状态机**


PM5CTL0 &=~LOCKLPM2;                                        //禁用GPIO开机默认高阻抗模式 以激活先前配置的端口设置
P5DIR || BIT0;              //芯片选择

//将0x0408写入0x0A寄存器
P5OUT &=~BIT0;       //芯片选择低  
TXData = 0x0A;         //选择要传输的地址
UCB0IE |= UCTXIE;      //启用TX中断
__bis_sr_register(GIE);//启用中断
__DELAY周期(100);   //下一次传输前的延迟
TXData = 0x04;         //选择要传输的MSB
UCB0IE |= UCTXIE;    //启用TX中断
__bis_sr_register(GIE);//启用中断
__DELAY周期(100);
TXData = 0x08;        //传输LSB
UCB0IE |= UCTXIE;    //启用TX中断
__bis_sr_register(GIE);//启用中断
__DELAY周期(100);   //下一次传输前的延迟
P5OUT |= BIT0;        //芯片选择高
__DELAY周期(100);

//从同一个寄存器读取
P5OUT &=~BIT0;          //芯片选择低
//将TXdata发送到缓冲区
TXData =(0x20 | 0x0A);    //保留启用了读取位的地址
UCB0IE |= UCTXIE;        //启用TX中断
__bis_sr_register(GIE);   //启用中断
__DELAY周期(100);       //下一次传输前的延迟
UCB0IE |= UCRXIE;       //启用USI_B0 RX中断
__bis_sr_register(GIE);   //启用中断

TXData = 0x00;          //传输虚拟数据
UCB0IE |= UCTXIE;       //启用TX中断
__bis_sr_register(GIE);  //启用中断
__DELAY周期(100);      //下一次传输前的延迟
//接收MSB
UCB0IE |= UCRXIE;      //启用USI_B0 RX中断
__bis_sr_register(GIE); //启用中断

TXData = 0x00;         //传输虚拟数据
UCB0IE |= UCTXIE;     //启用TX中断
__bis_sr_register(GIE);//启用中断
__DELAY周期(100);   //下一次传输前的延迟
//接收LSB
UCB0IE |= UCRXIE;    //启用USI_B0 RX中断
__bis_sr_register(GIE);//启用中断
//芯片选择高
P5OUT |= BIT0;
__DELAY周期(100);
}

#if defined(__TI_Compiler_version__)|| defined(__IAR_SYSTEMS _ICC__)
#pragma vector=USI_B0_vector
__interrupt void USI_B0_ISR(void)
#Elif已定义(__GMNU__)
void __attribute__((interrupt (USI_B0_vector)) USI_B0_ISR (void)
#否则
错误编译器不受支持!
#endif

Switch(__偶 数_in_range(UCB0IV,USI_SPI_UCTXIFG))

案例USI_NONE:Break;// Vector 0 - NO INTERRUPT
案例USI_SPI_UCRXIFG:
期间(UCB0STAT和UCBUSY);
RXData = UCB0RXBUF;
UCB0IFG &=~UCRXIFG;
中断;
案例USI_SPI_UCTXIFG:
UCB0TXBUF = TXData;//传输字符
UCB0IE &=~UCTXIE;
中断;
默认值:中断;
}
}

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

    您好,

    您可以使用官方代码示例进行测试。  CCS中有许多代码示例和其他资源可以帮助您的开发。 您可以在“查看->资源管理器”中访问它们。  下面是其中一个SPI主代码示例。  

    //************************************************************************************************
    // MSP430FR413x演示- eUSI_A0,SPI 4线主控增量数据
    ////
    说明:SPI主控使用4线模式与SPI从属设备进行通信。 增量
    //数据由主服务器从0x01开始发送。 接收到的数据应
    //与先前传输的TXData = RXData-1相同。
    //从属选择信号被设置为活动高电平。
    // USCI RX ISR用于处理与CPU的通信,通常在LPM0中。
    // ACLK =~32.768kHz,MCLK = SMCLK = DCO ~1MHz。 BRCLK = ACLK/2。
    ////////
    
    MSP430FR4133
    // --------
    // /|\\| |//
    || |//
    --|RST |//
    | |//
    | WFP 1.0 (UCA0SIMO)|-> Data Out (UCA0SIMO)
    //(数据输出) | WFP 1.1 |<-数据输入(UCA0SOMI)
    // | WFP 1.2 Tm|->串行时钟输出(UCA0CLK)
    // | WFP ADAMSKY|-> 1.3 Slave Select (UCA0STE)
    //////
    
    Kathryn Adamsky
    //德州仪器(TI)
    // 2016年6月(更新) | 2013年6月(创建)
    //使用IAR嵌入式工作平台,5.60 和代码编辑器,Studio 5.5 和
    //**************************************************************************************
    #include <MSP40.0>
    
    unsigned char RXData =0;
    unsigned char TXData;
    
    int main(void){
    
    WDTCTL = WDTPW | WDTHOLD; //停止看门狗计时器
    
    P1SEL0 || BIT0 | BIT1 | BIT2 | BIT3; //将4-SPI引脚设置为第二个函数
    
    UCA0CTLW0 |= UCSWRST; //**将状态机置于复位**
    // 4引脚,8位SPI主控
    UCA0CTLW0 |= UCMST|UCSYNC|UCCKPL|UCMSB|UCMODE_1|UCSTEM;
    //时钟极性高,MSB
    UCA0CTLW0 |= UCSSEL__SMCLK; //选择SMCLK
    UCA0BR0 = 0x01; ///2,fBitClock = fBRCLK/(UCBRx+1)。
    UCA0BR1 = 0;
    UCA0MCTLW = 0; //无调制
    UCA0CTLW0 &=~UCSWRST; //**初始化USCI状态机**
    UCA0IE |= UCRXIE; //启用USI_A0 RX中断
    TXData = 0x01; //保存TX数据
    
    PM5CTL0 &=~LOCKLPM2; //禁用GPIO开机默认高阻抗模式
    //以激活先前配置的端口设置
    同时(1)
    {
    UCA0IE |= UCTXIE; //启用TX中断
    __bis_sr_register (LPM0_BITS | GIE); //输入LPM0,启用中断
    __no_operation(); //对于调试,保留在LPM0中
    __delay_cycles (2000年); //下一次传输前的延迟
    TXData++; //增量传输数据
    }
    #if
    
    defined(__TI_Compiler_version__)|| defined(__IAR_SYSTEMS _ICC__)
    #pragma vector=USI_A0_vector
    __interrupt void USI_A0_ISR(void)
    #Elif defined(__GNUC__)
    void __attribute__((interrupt (USCI_A0_ECH_Univer))#void)
    
    
    #endif
    {
    SWITCH(__EIN_RANGE(UCA0IV,USI_SPI_UCTXIFG)){
    
    案例USI_NONE:中断; //矢量0-无中断
    案例USI_SPI_UCRXIFG:
    RXData = UCA0RXBUF;
    UCA0IFG &=~UCRXIFG;
    __BIC_SR_REGISTER_ON_EXIT (LPM0_BITS);//唤醒以设置下一个TX
    中断;
    案例USI_SPI_UCTXIFG:
    UCA0TXBUF = TXData; //传输字符
    UCA0IE &=~UCTXIE;
    中断;
    默认值:break;
    }
    } 

    如果我的帖子有助于解决您的问题,请单击  验证答案    按钮 

    冬季,

    搜索 E2E! 您的问题可能已得到解答!  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您的帮助,Winter,但我已经在使用经过一些修改的官方代码。
    Q1)对于上述代码,重置连接到何处? (电源/接地?)
    Q1)您是否有eUSI_B0的SPI示例代码?
    Q2)如果我必须以主中继器的身份读取MSP430的数据,我是否必须启用中断,或者我是否可以直接读取UCB0RXBUF?
    UCB0IE |= UCRXIE; //启用USI_B0 RX中断
    __bis_sr_register(GIE);//启用中断
    我注意到,当我尝试阅读时,UCRXIFG标志未设置。
    请帮助我调试该问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,

    a1) RST用于重置MSP430,连接到如下的重置或SBW调试 电路。 它独立于SPI模块。  

    a2)有使用MSP430驱动程序库的eUSI_B0的SPI示例代码。 您可以使用驱动程序库更轻松地实现您的软件。 驱动程序库包含用户指南,用于说明如何使用API函数。  

    A3)您不需要使用中断来读取数据。 等待UCRXIFG设置和读取UCB0RXBUF 也正常。  

    如果我的帖子有助于解决您的问题,请单击  验证答案    按钮 

    冬季,

    搜索 E2E! 您的问题可能已得到解答!  

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

    您好,

    您可以在 下图中的某个位置找到使用MSP430驱动程序库的eUSI_B0代码示例。