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.

[参考译文] CCS/MSP430FR5969:MSP430FR5969

Guru**** 2595805 points
Other Parts Discussed in Thread: MSP-EXP430FR5969, MSP430FR5969

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/638206/ccs-msp430fr5969-msp430fr5969

部件号:MSP430FR5969
主题中讨论的其他部件:MSP-EXP430FR5969

工具/软件:Code Composer Studio

尊敬的各位:

我正在测试MSP430和UHF RFID IC标签SL900A之间的SPI接口。 问题是:我无法在SL900A中写入/读取数据。 硬件方面存在一个大问题。 我不知道为什么。 请在这方面帮助我。 非常感谢。

1)硬件设置:
* MSP430:我使用MSP-EXP430FR5969和eUSI_A1 SPI模块:WFP 2.4 :UCA1CLK (32 kHz);2.5 :UCA1SIMO;WFP 2.6 :UCA1SOMI;MCU使用CLK = 1MHz
* SL900A:如下所示,除了引脚2连接到引脚8 (在第3页数据表中推荐)。 电池为2.5V (但MCU通过USB直接连接到计算机,因此SL900A和MCU的Vcc不同)。

2)编码:

#include <MSP40.0>

volatile unsigned char RXData =0;
volatile unsigned char TXData;
volatile unsigned char var=0;
volatile unsigned int count=0;

int main(void)
{
WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器

//配置GPIO
P2SEL1 |= BIT4;// USCI_A1操作
P2SEL1 P2SEL1 |= BIT5| BIT5; // USICI_A1 operation
PJSEL0 |= BIT4| BIT5;//对于XT1

P1DIR |= BIT4 + BIT0;
//禁用GPIO通电默认高阻抗模式以激活
//先前配置的端口设置
PM5CTL0 &=~LOCKLP5;

// XT1设置
CSCTL0_H = DCSCSEL1=解锁DCSCSEL0;
//将DCO设置为1MHz
CSCTL2 = LAST__LFXTCLK | SELL__DCOCLK | SELM__DCOCLK;
CSCTL3 = DIVA__1 | DIV__1 | DIVM__1;//设置所有分频器
CG1 SCTL4 &=~OFTOFF;
DO
{ CSCTL5&FFFG=
~

FASTF0 ~FASTF0 FASTF0;FASTF0 FASTF0;FAST= FASTFF1 F0;FASTAULLFF1 F0
//锁定CS寄存器

//为SPI操作配置USCI_A0
UCA1CTLW0 = UCSWRST;//**将状态机置入复位**
UCA1CTLW0 |= UCSSEL | UCSYNC | UCMSB;// 3引脚,8位SPI主控,MSB优先
//时钟极性:数据通过第一个低到高的CALW_UCCLSK转换进行更改
; // aclk
UCA1BR0 = 0x00;// fclk = 32kHz
UCA1BR1 = 0;//
UCA1MCTLW = 0;//无调制
UCA1CTLW0 &=~UCSWRST;//**初始化USCI状态机_UCA1IE
|= UCRXOUT;//启用UCA1SEN





=启用UCSWSRE; CA1=启用UC1UCIE 1UCA1UCIE

__bis_sr_register(LPM0_bits | GIE);// cpu off, enable interrupts

__delay_cycles(2000);// delay before next transmission
P1OUT ^= BIT0;
}
#if

defined(__TI_Compiler_version__)|| defined(__IAR_SYSTEMS _ICC__)
#pragma vector=UIT0;}#SCI_void IS_Is_Is_Is_Isr_Isr_Isr_Isr_Isr_Isr_version__)





#endif
{
SWITCH(__EIN_RANGE(UCA1IV, USCI_SPI_UCTXIFG)){

CASE USI_NONE: Break;
CASE USI_SPI_UCRXIFG:
RXData = UCA1RXUF;
UCA1IFG &=~UCRXIFG;__BIC_SR_UCRXSPI= UCRX64;
CA0= USCXSPF= UCA0;CA1= UTXF= UCA1= UCA1= UCAXSPXXXSPF0





;CA0;CA1= UCA1= UCAXSP_CA1= CAXSPXXXXSPF0;CA0;CA1= UCAXSPF= UCA1= UCA1= UCA1= UCA1= UCA1= UCA1= UCA1=




UCA1TXUF = TXData;//传输字符
var++;
}
否则为(var ==2){
TXData = 0x55;
UCA1TXBUF = TXData;//传输字符
++;
}
UCA1IE &=~UCTXIE;
__BIC_SR_REGISTER_ON_EXIT (LPM0_bits);中断设置




;}下一个TX:默认值 

3)问题:

*读数:当我尝试从FIFO (使用Direct Command)读取数据时,我只听到了噪音。 请看下面的图片,当(1):SPI CLK,(2):WFP 2.6 (UCA1SOMI)。 还有一件事:我必须断开SL900A和MCU之间的GND。 如果它们的GND已连接,我就没有CLK (只有峰值而不是位0-1)。

*写入:我尝试将数据(0x55)写入SL900A的用户内存,从0x064的地址开始。 这是我写入SL900A的3个字节。 但是,当我从阅读器(RFID接口)读取用户内存时,数据全部为0。
(1):SPI CLK;(2):WFP 2.5 (UCA1SIMO)

字节1:0x00 (写入命令)


字节2:0x64 (SL900A EEPROM的地址)

字节3:0x55 (要写入的数据)


我很困惑。 请帮我解释这些事情。 非常感谢。

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

    您在每个引脚处的VCC +/- 0.3 V的建议通信操作条件之外工作, 由于MSP430为3.3 V,SL900A为2.5 V。您的代码未正确附加,但您需要确保两个器件之间的时钟相位和极性设置对齐,尽管从屏幕截图看它似乎是正确的。 我注意到CS引脚也应处于活动状态高。 请务必参考MSP430FR5969 SPI示例以及您可能找到的任何SL900A资源。

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

    尊敬的Ryan:

    非常感谢您的回复。 这是我的编码。 是的,CS (SL900A案例中的SEN引脚)在整个交易过程中处于活动状态。 时钟极性已配置:UCCKPH = UCCKPL = 0,因此数据将在每个CLK的第一个上升沿上进行更改,并与SL900A计时配合使用(请参阅下图)。

    ========= coding=========

    #include <MSP4S.h>

    volatile unsigned char RXData = 0;
    volatile unsigned char TXData;
    volatile unsigned char var=0;
    volatile unsigned int count=0;

    内部主(无效)

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

    //配置GPIO
    P2SEL1 || BIT4;// USI_A1操作
    P2SEL1 || BIT5 | BIT6;// USI_A1操作
    PJSEL0 || BIT4 | BIT5;//用于XT1

    P1DIR || BIT4 + BIT0;
    //禁用GPIO开机默认高阻抗模式以激活
    //以前配置的端口设置
    PM5CTL0 &=~LOCKLPM2;

    // XT1设置
    CSCTL0_H = CSOKEY >> 8;//解锁CS寄存器
    CSCTL1 = DCOFSEL_0;//将DCO设置为1MHz
    CSCTL2 =拉美经济体系_ LFXTCLK | SELS__DCOCLK | SELM__DCOCLK;
    CSCTL3 = DIVA__1 | DIVs__1 | DIVM__1;//设置所有分隔线
    CSCTL4 &=~LFxTOFF;


    CSCTL5 &=~LFxTOFFG;//清除XT1故障标志
    SFRIFG1 &=~OFIFG;
    } While (SFRIFG1&OFIFG);//测试振荡器故障标志
    CSCTL0_H = 0;//锁定CS寄存器

    //为SPI操作配置USI_A0
    UCA1CTLW0 = UCSWRST;//**将状态机置于复位**
    UCA1CTLW0 |= UCMST | UCSYNC | UCMSB;// 3引脚,8位SPI主控,MSB优先
    //时钟极性:数据随CLK的第一个低到高转换而更改
    UCA1CTLW0 |= UCSSEL__ACLK;// ACLK
    UCA1BR0 = 0x00;// fclk = 32kHz
    UCA1BR1 = 0;//
    UCA1MCTLW = 0;//无调制
    UCA1CTLW0 &=~UCSWRST;//**初始化USCI状态机**
    //UCA1IE |= UCRXIE;//启用USI_A0 RX中断

    P1OUT || BIT4;
    _DELAY周期(200);

    同时(1)

    UCA1IE |= UCTXIE;
    __bis_sr_register(LPM0_bits | GIE);// CPU关闭,启用中断

    __DELAY周期(2000);//下一次传输前的延迟
    P1OUT ^= BIT0;
    }
    }

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

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

    案例USI_NONE:中断;
    案例USI_SPI_UCRXIFG:
    RXData = UCA1RXBUF;
    UCA1IFG &=~UCRXIFG;
    __BIC_SR_REGISTER_ON_EXIT (LPM0_bits);//唤醒以设置下一个TX
    中断;
    案例USI_SPI_UCTXIFG:
    COUNT++;
    如果(var=0){
    TXData = 0;
    UCA1TXBUF = TXData;//传输字符
    VAR++;
    }
    否则,如果(var == 1){
    TXData = 0x64;
    UCA1TXBUF = TXData;//传输字符
    VAR++;
    }
    否则,如果(var ==2){
    TXData = 0x55;
    UCA1TXBUF = TXData;//传输字符
    VAR++;
    }
    UCA1IE &=~UCTXIE;
    __BIC_SR_REGISTER_ON_EXIT (LPM0_bits);//唤醒以设置下一个TX

    中断;
    默认值:中断;
    }
    }

    我不知道我做错了什么。 感谢您提供任何建议TT_TT

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

    SPI初始化看起来很好,几乎直接从代码示例中复制。 但您仍需要解决硬件设置的电压差问题。 在进一步阅读SL900A数据表时,也可能会找到更多信息。

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

    您好,Ryan:

    感谢您的评论。 我发现了硬件问题。 因为SL900A的引脚VBAT (引脚13)连接到其他"空" IC (IC位置 ,但没有IC),我无法控制。 所以我切断了VBAT与其他IC的连接,现在电压水平是正确的。 一个用于MCU和SL900A的电池,不再有奇怪的逻辑电平。

    但是,我仍然无法在SL900A中写入/读取数据。 在SPI写入模式下,我在传输所有数据后未观察到"ACK"(DOUT中的高脉冲),如芯片数据表中所示:

    出现此问题的原因可能有:

    -SPI CLK过低? (32kHz)数据表显示无最小SPI CLK,仅显示上限(1-2MHz)

    -传输完成后SEN针脚未停用-->我已经测试过。 它不会导致任何变化,即即使在写入后SEN已停用,也没有数据写入SL900A。  

    ——写作后会有一些延迟?  -->我在每个Tx之后输入10ms (在我的情况下为3字节:0x00 -->写模式,0x64 --> SL900A用户内存的物理地址,0x18 -->要写入的数据)。  

    TT_TT仍不工作

    顺便说一下:我正在使用另一个帐户。 我还是作者。

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

    可以随意调整SPI CLK频率和延迟计时。 本论坛的重点是MSP430问题,但您的问题似乎围绕SL900A。 我可以说,通常会轮询TXIFG标志,而不是以代码运行的方式使用中断,但是这不是您遇到困难的原因。

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

    您好,Ryan:

    感谢您的建议。 我会试试这个。 我使用中断是因为我的应用程序需要大量节能。  

    顺便说一下,您能否详细说明LPM如何在MSP430中运行? 据我所知,在使用命令__bis_sr_register(LPM0_bits | GIE)输入LMP后,在 执行__BIC_SR_REGISTER_ON_EXIT(LPM0_bits)命令之前,所有命令(在主循环中)都不会执行。

    -   如果在中断服务例程期间没有__BIC_SR_REGISTER_ON_EXIT (LPM0_bits)命令,从中断服务例程返回后,设备将再次进入休眠状态,并在 __bis_sr_register (LPM0_bits| GIE命令等待? 我的意思是不会执行主循环中的其他命令?

    -因此,如果出现其它中断情况,中断服务例程将多次反复实施。 设备从不退出LPM,主循环始终在输入LPM命令时等待,如上所示。

    我对吗? 感谢您的任何解释。  

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

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

    非常感谢你能抽出时间。 我终于解决了问题,SL900A已经成功了。 问题与SPI接口有关。 我没有识别SPI读取,我必须写入虚拟字节才能接收数据。 所以我修复了我的编码,它起了作用:)