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.

[参考译文] MSP430F5418A:尝试使 LIS2DE12 MEMS 传感器正常工作

Guru**** 2511415 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/987103/msp430f5418a-trying-to-get-the-lis2de12-mems-sensor-to-work

器件型号:MSP430F5418A

我设置了 SPI -我发送2个字节- 0x0F 和一个虚拟字节。

我读取 RXBUF 并不断返回0xFF

有人有代码吗?

我使用 TMS320成功地查询传感器。 现在我有一个 MSP430项目、器件没有响应。

///初始化 SPI


UCB0CTL1 |= UCSWRST;//**将状态机置于复位状态**

UCB0CTL0 = UCSYNC + UCMSB + UCMODE_0 + UCMST + UCCKPH;//主器件、同步模式
//时钟极性高、MSB 优先
UCB0CTL1 = UCSSEL_2;//使用 SMCLK
UCB0BR0 = 12;// fSCL = SMCLK/12 =~ 100kHz
UCB0TXBUF = 0x01;

(笑声)

(笑声)

#define SPI_buffer_size 5 /*字节*/
#define SPI_buffer_initial{0x00、0x00、0x00、0x00、0x00}

空 Init_MEMS (空)

字 init = 0、BTX、BRX = 0;

BTX = 0xAA0F;// whoami - AA 是虚拟字节

DoSPI_IO (&BTX、&BRX、2);

如果(BRX==0x33)

INIT = 1;

/**
*它通过 SPI 针对给定数量的输入和输出执行数据交换
*@传输缓冲区的 param TX 指针或0。 如果为0、则发送虚拟字节(0x81)
*@param RX 指针到接收缓冲区或0
*@param IOcount 接收和发送字节的总数
*
void DoSPI_IO (bytes* TX、bytes* RX、byte IOcount)

字节虚拟= 0x81;
字节 RXCOUNT、TXCOUNT;

RXcount = TXcount = IOcount;

if ((TX =0)&&(RX =0)) return;

P2OUT |= 0x20;//P5.5
P2OUT &=~0x02;// CS 低电平有效
//
//延迟(500);

while (RXcount > 0 || TXcount > 0)

while (!(UCB0IFG & UCTXIFG));// USCI_B0 TX 缓冲区准备就绪?

// if (UCB0IFG & UCTXIFG)

if (TX = 0 || TXcount = 0)

UCB0TXBUF =虚拟;//虚拟写入

其他

UCB0TXBUF =* TX++;
TXCOUNT--;

//延迟(20);//将传输之间的时间添加到
//确保从机可以处理信息

while (!(UCB0IFG & UCRXIFG));// USCI_B0 TX 缓冲区准备好了?

// if (UCB0IFG & UCRXIFG)

if (RX =0 || RXcount =0)

虚拟= UCB0RXBUF;//虚拟读取

其他

* RX++= UCB0RXBUF;
RXCOUNT--;


while (UCBUSY 和 UCB0STAT);//等待 SPI 不再忙

//虚拟= UCB0RXBUF;//虚拟读取以清空 RX 缓冲区中的任何剩余数据
//
延迟(500);

P2OUT &=~0x20;//P5.5

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

    我建议你一次做一个字节--写一个字节,然后读一个字节--这样你就可以确定你正在接收的字节。 当您想要读取 FIFO (一步读取)(6个字节)时、您拥有的结构不会缩放。

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

    您好!

    我们没有此传感器的示例代码、但我们在这里有基本的 SPI 主器件示例项目: https://dev.ti.com/tirex/explore/node?node=AJqCfh18z-v2MIe2Blcnfg__IOGqZri__LATEST 

    我们还在此处提供了一个更高级的标准 SPI 主器件示例: https://dev.ti.com/tirex/explore/node?node=AOyGTLP2iPrMxHioCGFJ9w__IOGqZri__LATEST 

    此外、什么数据类型是字节?  TX 和 RX BUF 寄存器仅为8位、但看起来您正在尝试向其写入16位值、因此请注意这一点。   

    谢谢、

    JD

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

    我只发送1个字节-我对获取 XYZ 不感兴趣-这将在将来。 现在、我只想发送"whoami"并获取0x33答案。

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

    将此代码粘贴到 CCS 并重新格式化后、我可以看到它实际上每次执行一个字节。 其他意见:

    --------

    >UCB0CTL0 = UCSYNC + UCMSB + UCMODE_0 + UCMST + UCCKPH;  

    LIS2DE12数据表(DocID027326修订版2) 第6.2节介绍了 CPOL=1、CPHA=1、因此这应该是:

    >UCB0CTL0 = UCSYNC + UCMSB + UCMODE_0 + UCMST +(1*UCCKPL)+(0*UCCKPH);// SPI 模式=3

    --------

    >UCB0CTL1 = UCSSEL_2;//使用 SMCLK
    >UCB0BR0 = 12;// fSCL = SMCLK/12 =~ 100kHz

    这会设置 UCSWRST=0、然后设置 br0。 BR0只能通过 UCSWRST=1进行设置[参考 UG (SLAU208Q)修正37-18]。 您应该颠倒这两个语句的顺序。  

    ------
    > UCB0TXBUF = 0x01;

    我不知道你在这里打算做什么,但你应该删除这一行。 更一般而言、当 CS=1 (未置位)时、应小心不要摆动 SPI 线路、因为它会将 LIS2DE12切换到 I2C 模式。

    --------

    > P2OUT &=~0x02;// CS 低电平有效

    您需要在结束时取消 CS (P2.1)的置位、否则器件将无法识别第二个事务。

    --------

    > IF (BRX== 0x33)

    我无法告诉您高字节将是什么。 尝试:

    > IF (((BRX & 0xFF)== 0x33)

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

    非常感谢您查看该代码(尽管在新的 e2e 应用中该代码的格式设置不是很好)。

    我执行了你的所有建议。

    我还再次阅读数据表-我看到 MSB 必须为1才能读取。

    不过、我仍然无法成功读取器件的 ID。

      UCB0CTL1 |= UCSWRST;                      // **Put state machine in reset**
    
      UCB0CTL0 =  UCSYNC +  UCMSB + UCMODE_0 + UCMST + UCCKPL;   // Master, synchronous mode
      // Clock polarity high, MSB first
      UCB0CTL1 = UCSSEL_2 | UCSWRST; // Use SMCLK
      UCB0BR0 = 12; // fSCL = SMCLK/12 = ~ 100khz
    
      UCB0CTL1 &= ~UCSWRST;

    (我也不知道如何包括示波器的屏幕截图...)

    接下来要检查的是硬件和连接...

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

    我将此代码(通过指定的更改)放在带有 LIS3DH 的 F5529上、我得到的是世卫组织_AM_I = 0x33 (奇怪的是、与 LIS2相同)。

    我提供了自己的引脚配置、因此这可能是需要检查的东西。

    这是 MOSI (顶部)和 MISO (底部)。 [我使用了“插入”->“图像/视频”,然后单击“上载”按钮以获取文件选择器框。]

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

    我解决了这个问题...同一个 UCB 时钟上还有一个具有不同相位的 I2C。

    当我只使用 SPI 和 LIS2DE 编写一个小程序时、我就能得到了 WHO - AM - I

    现在、我必须弄清楚这两个外设如何能够舒适地共同生活-为彼此提供所需的空间...听起来像是一个情侣工作室...

    在降低 CS 之前、我尝试添加这些线路(以便时钟在空闲状态下处于高电平):

            UCB0CTL1 |= UCSWRST; //  **Put state machine in reset**
            UCB0CTL0 =  UCSYNC + UCMSB + UCMODE_0 + UCMST + UCCKPL;   // Master, synchronous mode
            UCB0CTL1 &= ~UCSWRST;   // enable - take out of reset
    

    但这并不能帮助 CLK 仅在我发送第一个字节后上升至高电平。

    我找到了一种解决方法-但想知道是否有更巧妙的方法...

    我发送命令两次-第一次失败、第二次有效。

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

    我不太确定我是否理解您所描述的内容、但这些双模器 件在多点 SPI 上无法正常工作、因为未选择的器件通常会根据所选器件的流量切换到 I2C 模式。

    由于我需要 多点、因此我最终切换到了 I2C。 我希望您的交易比较短、因此速度差异可能无关紧要。