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.

[参考译文] MSP430FR5969:SPI,带加速计

Guru**** 2553450 points
Other Parts Discussed in Thread: MSP430FR5969

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/663853/msp430fr5969-spi-wiht-accelerometer

部件号:MSP430FR5969
hiyi.. 
我的主控制器是msp430fr5969,从控制器是ADXL345,我正在使用SPI协议与从控制器通信,这是我的代码.....
当我使用此程序读取设备ID时,我将得到正确的信息,但当读取从属设备中另一个寄存器的值时,我仍然得到相同的设备ID值.....那么如何读取中所有有效寄存器值的值
奴隶...任何人都请帮助我...

P1OUT |= 0x08;//设置为高以取消选择IC
P1DIR |= 0x08;//设置为CS for SPI
//设置USIB
P1SEL |= BIT7 + BIT6 + BIT5;
P1SEL2 |= BIT7 + BIT6 + BIT5;
UCB0CTL0 |= UCCKPL + UCSB + UNCS // 3引脚,8位SPI master
UCB0CTL1 |= UCSSEL_2;// SMCLK
UCB0BR0 |= 0x02;
UCB0BR1 = 0;
UCB0CTL1 &=~UCSWRST;


while (!(UCB0IFG&UCTXIFG)); UCB0TXBUF=0x00;
while (!(UCB0IFG&UCRXIFG));
value=UCB0RXBUF;///这将提供正确的设备ID/// 
////// 访问如下所示的值时,我仍获得相同的设备ID//
while (!(UCB0IFG&UCTXIFG));
UCB0TXBUF=0X30;//// 这将给出0x02///的值 
while (!(UCB0IFG&UCRXIFG));
value=UCB0RXBUF; 
//运行上述四行,我仍然得到DEVICEID值//


如果我使用的是伪值,我只会得到一次COREECT值,而且它不是一种通过一直使用伪值进行编程的正确方式。

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

    通过查看ADXL345的数据表和您的代码,您似乎打算将SPI通信模式与MSP430FR5969上的WFP 1.3 一起用作芯片选择引脚(启用串行端口)。 根据ADXL345数据表,CS引脚必须在每次事务开始前切换到逻辑低电平,并在每次事务结束时切换回逻辑高电平。 查看代码后,您在开始时将WFP 1.3 设置为高,然后在代码执行期间将其设置为高。 您的代码中是否内置了CS控件?

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

    谢谢你Walter Schoor....

    在你的建议之后,我写了如下代码,但仍然遇到同样的问题,请检查这个......

    #include <MSP4S.h>
    void clockinit(void);
    void spinit(void);
    unsigned char rx_value;
    内部主(无效)

    WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器
    PM5CTL0 &=~LOCKLPM2;

    clockinit();
    spinit();

    __bis_sr_register (GIE);
    P1OUT &=(~BIT5);//芯片选择低
    // while (!(UCB0IFG &UCTXIFG));
    // UCB0TXBUF=0x00;
    //如果我执行这两行,我将得到正确的DevID,但在我用0x2C更改了TXBUF值后,我将只得到相同的DevID。

    它没有给出0x2C中的值...并且我在ADXL345 0X30中更改了地址,如0x2C

    while (!(UCB0IFG &UCTXIFG));
    UCB0TXBUF=0x2C
    //while (!(UCB0IFG &UCRXIFG));/////I也检查 了伪值。
    // UCB0TXBUF=0xff;

    while (!(UCB0IFG &UCRXIFG));
    RX_value=UCB0RXBUF;
    //while (UCB0STATW&UCBUSY);////// 我也检查了忙号..
    UCB0CTLW0 = UCSWRST;
    P1OUT |=BIT5;

    同时(1);

    }
    void spinit()(无效spinit())

    P1SEL1 || BIT6 | BIT7;// MOSI和Miso// USI_A0操作
    P2SEL1|=BIT2;//CLK
    P1DIR|=BIT5;//芯片选择
    UCB0CTLW0 = UCSWRST;//**将状态机置于复位**
    UCB0CTLW0 || UCMST | UCSYNC |UCCKPL |UCMSB;// 3引脚,8位SPI主控制器
    //时钟极性高,MSB
    UCB0CTLW0 |= UCSSEL__SMCLK;// ACLK
    UCB0BR0 = 0x02;///2
    UCB0BR1 = 0;//
    // UCB0MCTLW = 0;//无调制
    UCB0CTLW0 &=~UCSWRST;//**初始化USCI状态机**

    }
    void clockinit()函数

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

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

    在你的建议之后,我写了如下代码,但仍然遇到同样的问题,请检查这个......

    #include <MSP4S.h>
    void clockinit(void);
    void spinit(void);
    unsigned char rx_value;
    内部主(无效)

    WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器
    PM5CTL0 &=~LOCKLPM2;

    clockinit();
    spinit();

    __bis_sr_register (GIE);
    P1OUT &=(~BIT5);//芯片选择低
    // while (!(UCB0IFG &UCTXIFG));
    // UCB0TXBUF=0x00;
    //如果我执行这两行,我将得到正确的DevID,但在我用0x2C更改了TXBUF值后,我将只得到相同的DevID。

    它没有给出0x2C中的值...并且我在ADXL345 0X30中更改了地址,如0x2C

    while (!(UCB0IFG &UCTXIFG));
    UCB0TXBUF=0x2C
    //while (!(UCB0IFG &UCRXIFG));/////I也检查了伪值。
    // UCB0TXBUF=0xff;

    while (!(UCB0IFG &UCRXIFG));
    RX_value=UCB0RXBUF;
    //while (UCB0STATW&UCBUSY);////// 我也检查了忙号。
    P1OUT |=BIT5;

    同时(1);

    }
    void spinit()(无效spinit())

    P1SEL1 || BIT6 | BIT7;// MOSI和Miso// USI_A0操作
    P2SEL1|=BIT2;//CLK
    P1DIR|=BIT5;//芯片选择
    UCB0CTLW0 = UCSWRST;//**将状态机置于复位**
    UCB0CTLW0 || UCMST | UCSYNC |UCCKPL |UCMSB;// 3引脚,8位SPI主控制器
    //时钟极性高,MSB
    UCB0CTLW0 |= UCSSEL__SMCLK;// ACLK
    UCB0BR0 = 0x02;///2
    UCB0BR1 = 0;//
    // UCB0MCTLW = 0;//无调制
    UCB0CTLW0 &=~UCSWRST;//**初始化USCI状态机**

    }
    void clockinit()函数

    CSCTL0_H = CSOKEY >> 8;//解锁CS寄存器
    CSCTL1 = DCOFSEL_0;//将DCO设置为1MHz
    CSCTL2 =拉美经济体系_ LFXTCLK | SELS__DCOCLK | SELM__DCOCLK;
    CSCTL3 = DIVA__1 | DIVs__1 | DIVM__1;//设置所有分隔线
    CSCTL0_H = 0;//锁定CS寄存器
    }
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Harikrishna,您好!

    您是否有逻辑分析仪或示波器可用于捕获IO上发生的情况?

    我将您的代码按当前状态执行,并在硬件上运行它以捕获逻辑跟踪。  请参阅下面的,了解您的代码目前的执行情况。

    根据代码的运行方式,选择行在第一个事务之前从未设置为高,这意味着它可能是高或低,具体取决于先前的活动。  在此捕获中,在设置时钟极性之前,它处于低电平状态。  我添加了一些代码来纠正此问题,并在下面给出了捕获结果。

    从这一点来看,由于您在释放CS之前在SPI上设置了RST,因此总线上存在一些到从属设备的转换,这可能会使其混淆。  我对SWRST行进行了注释,给出了以下内容:

    现在,我们有一个正确的1字节事务,其中写入0x2C (我的分析仪设置为前导边,而不是尾随边,因此此处的'3E'实际上是'2C'。

    这让我们进入下一步。  由于要实际读取设备寄存器,因此需要写入要读取的寄存器(此处假定为0x2C),然后需要写入一个伪字节以实际读取它。  修改此设置的代码将提供以下信息:

    这是您需要获取的捕获(此捕获是为后缘捕获而设置的)。  现在,我没有为此连接从属设备,因为我没有你的硬件,但是如果你的所有设置都正确,那么在这种情况下,从属设备应该用数据对第二个字节作出响应。

    以下是您最初发布的代码,但经过修改以获取上述捕获:

    #include <MSP430-h>
    
    void clockinit(void);
    void spinit(void);
    
    unsigned char rx_value;
    
    int main(void){
    
    WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器
    PM5CTL0 &=~LOCKLPM2;
    
    clockinit();
    spinit();
    
    __bis_sr_register(GIE);
    
    // while (!(UCB0IFG &UCTXIFG);//
    UCB0TXBUF=0x00;//
    如果我执行这两行,我将获得正确的DevID,但当我用0x2C更改TXBUF值后,我将只获得相同的DevID。
    
    /*
    是的
    不给予
    值
    英寸
    0x2c...和
    我改变了
    地址
    喜欢
    0x2C
    有一些
    其他寄存器
    在ADXL345中
    0X30..etc ///
    */
    
    //芯片选择低
    P1OUT &=(~BIT5);
    
    //写入寄存器以从从属设备获取
    while (!(UCB0IFG和UCTXIFG));
    UCB0TXBUF = 0x2C;
    同时(!(UCB0IFG和UCRXIFG));
    RX_VALUE = UCB0RXBUF;
    
    //从从属设备读取值
    while (!(UCB0IFG和UCTXIFG));
    UCB0TXBUF = 0x00;
    同时(!(UCB0IFG和UCRXIFG));
    RX_VALUE = UCB0RXBUF;
    
    //芯片选择高
    P1OUT || BIT5;
    
    while (1);
    }
    void spinit()
    {
    P1OUT || BIT5;
    P1DIR || BIT5;//芯片选择
    P1SEL1 || BIT6 | BIT7;// MOSI和Miso// USI_A0操作
    P2SEL1 || BIT2;//CLK
    UCB0CTLW0 = UCSWRST;//**将状态机置于复位**
    UCB0CTLW0 || UCMST | UCSYNC | UCCKPL | UCMSB;// 3引脚,8位SPI主控
    //时钟极性高,MSB
    UCB0CTLW0 |= UCSSEL__SMCLK;// ACLK
    UCB0BR0 = 0x02;///2
    UCB0BR1 = 0;//
    // UCB0MCTLW = 0;//无调制
    UCB0CTLW0 &=~UCSWRST;//**初始化USCI状态机**
    
    }
    void clockinit()
    {
    CSCTL0_H = CSOKEY >> 8;//解锁CS寄存器
    CSCTL1 = DCOFSEL_0;//将DCO设置为1MHz
    CSCTL2 =拉美经济体系_ LFXTCLK | SELS__DCOCLK | SELM__DCOCLK;
    CSCTL3 = DIVA__1 | DIVs__1 | DIVM__1;//设置所有分隔线
    CSCTL0_H = 0;//锁定CS寄存器
    }
    

    我建议您详细阅读ADXL345数据表,以充分了解其对SPI通信的要求,特别是R/W控制,寄存器寻址,多字节事务设置和芯片选择用法。


    此致,
    沃尔特

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

    我只是想查看上面的任何指南是否能帮助您解决您的问题。

    谢谢!
    沃尔特
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    HII.. Walter Schnoor...很抱歉耽误你的时间...
    感谢您的宝贵价值information...it真的帮了我很多...最后我在地址中得到了正确的值...
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很高兴听到这个消息!

    沃尔特