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/LDC1041EVM:MSP432有问题

Guru**** 2616675 points

Other Parts Discussed in Thread: LDC1041

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/669125/ccs-ldc1041evm-issue-with-msp432

器件型号:LDC1041EVM

工具/软件:Code Composer Studio

您好!

我正在尝试将 LDC1041EVM 与寄存器级的 MSP432P401R 搭配使用。 我面临一个问题:我首先尝试获取器件的 ID (通过 defaut 获取0x84)。 为此、我将向 LDC1041发送0x80、它对应于要读取的代码、然后是寄存器的地址。 我可以检查我的要求是否正确、但我没有 LDC1041的任何答案。

我曾尝试对 CSB 进行编程,但它一直到很早:这是否是问题的原因? 它不能随时位于地面上?

另一个想法是、当我只需要 ID 时、我不会为 TBCLK 引脚上的 LDC1041提供任何频率。 器件是否绝对需要频率才能工作?

提前感谢您

S.D.

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

    这是我的代码

    STE 信号似乎太早了:是否有要配置的时钟?

    #include "ti/devices/msp432p4xx/inc/msp.h"
    #include

    uint8_t RXData = 0;
    uint8_t TXData;

    int main (空)

       volatile uint32_t i;
       uint8_t 先前的数据;

       WDT_A->CTL = WDT_A_CTL_PW |            //停止看门狗计时器
               WDT_A_CTL_HOLD;

       P1->OUT &=~BIT0;
       P1->DIR |= BIT0;                       //将 P1.0 LED 配置为输出

       P1->SEL0 |= BIT4 | BIT4 | BIT6 | BIT4; //将4-SPI 引脚设置为第二功能

       EUSCI_B0->CTLW0 |= EUSCI_B_CTLW0_SWRST;//将状态机置于复位状态

       EUSCI_B0->CTLW0 = EUSCI_B_CTLW0_SWRST |//保持复位状态
               EUSCI_B_CTLW0_MST |            // SPI 主器件
               EUSCI_B_CTLW0_SYNC |           //同步模式

               EUSCI_B_CTLW0_CKPL |           //时钟极性高电平
               EUSCI_B_CTLW0_MSB |            // MSB 优先
               EUSCI_B_CTLW0_MODE_2 |         // 4引脚模式
               EUSCI_B_CTLW0_STEM |           // STE 模式选择
               EUSCI_B_CTLW0_ssel_SMCLK;      // smCLK

       //EUSCI_B0->BRW = 0x01;                  ///2、fBitClock = fBRCLK/(UCBRx+1)。
       EUSCI_B0->CTLW0 &=~EUSCI_B_CTLW0_SWRST;//**初始化 USCI 状态机**
       EUSCI_B0->IE |= EUSCI_B_IE_RXIE;       //启用 USCI_B0 RX 中断
       TXData = 0xA2;                         //保留 TX 数据

       //启用全局中断
       __ENABLE_IRQ();

       //在 NVIC 模块中启用 eUSCIA1中断
       NVIC->ISER[0]= 1 <<((EUSCIB0_IRQn)& 31);



       while (1)
       {
           EUSCI_B0->IFG |= EUSCI_B_IFG_TXIFG;//清除 TXIFG 标志
           EUSCI_B0->IE |= EUSCI_B_TXIE;     //启用 TX 中断
           __no_operation();                   //进行调试


       }


    // SPI 中断服务例程
    空 EUSCIB0_IRQHandler (空)

       IF (EUSCI_B0->IFG 和 EUSCI_B_IFG_TXIFG)
       {
           //发送字符
           EUSCI_B0->TXBUF = TXData;

           //禁用 TX 中断
           EUSCI_B0->IE &=~EUSCI_B_TXIE;

           //等待字符被接收
           while (!(EUSCI_B0->IFG 和 EUSCI_B_IFG_RXIFG));

           //将数据移动到临时缓冲区
           RXData = EUSCI_B0->RXBUF;

           //清除接收中断标志
           EUSCI_B0->IFG &=~EUSCI_B_IFG_RXIFG;

       }


  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这是我尝试过的另一个代码、但它不起作用。 目标是用 I/O 信号替换 STE 信号

    #include "ti/devices/msp432p4xx/inc/msp.h"
    #include

    uint8_t RXData = 0;
    uint8_t TXData;

    int main (空)

    volatile uint32_t i;
    uint8_t 先前的数据;

    WDT_A->CTL = WDT_A_CTL_PW | //停止看门狗计时器
    WDT_A_CTL_HOLD;

    P1->OUT &=~BIT0;
    P1->DIR |= BIT0; //将 P1.0 LED 配置为输出

    P1->SEL0 |= BIT4 | BIT4 | BIT6 | BIT4;//将4-SPI 引脚设置为第二功能

    EUSCI_B0->CTLW0 |= EUSCI_B_CTLW0_SWRST;//将状态机置于复位状态

    EUSCI_B0->CTLW0 = EUSCI_B_CTLW0_SWRST |//保持复位状态
    EUSCI_B_CTLW0_MST | // SPI 主设备
    EUSCI_B_CTLW0_SYNC | //同步模式

    EUSCI_B_CTLW0_CKPL | //时钟极性高
    EUSCI_B_CTLW0_MSB | // MSB 优先
    EUSCI_B_CTLW0_ssel_SMCLK; // smCLK

    //EUSCI_B0->BRW = 0x01; ///2、fBitClock = fBRCLK/(UCBRx+1)。
    EUSCI_B0->CTLW0 &=~EUSCI_B_CTLW0_SWRST;//**初始化 USCI 状态机**
    EUSCI_B0->IE |= EUSCI_B_IE_RXIE; //启用 USCI_B0 RX 中断
    TXData = 0x80; //保留 TX 数据

    //启用全局中断
    __ENABLE_IRQ();

    //在 NVIC 模块中启用 eUSCIA1中断
    NVIC->ISER[0]= 1 <<((EUSCIB0_IRQn)& 31);



    while (1)

    EUSCI_B0->IFG |= EUSCI_B_IFG_TXIFG;//清除 TXIFG 标志
    EUSCI_B0->IE |= EUSCI_B_TXIE; //启用 TX 中断
    __no_operation(); //进行调试





    // SPI 中断服务例程
    空 EUSCIB0_IRQHandler (空)

    IF (EUSCI_B0->IFG 和 EUSCI_B_IFG_TXIFG)
    {P1->OUT &=~BIT0;
    //发送字符
    EUSCI_B0->TXBUF = TXData;

    //禁用 TX 中断
    EUSCI_B0->IE &=~EUSCI_B_TXIE;

    //等待字符被接收
    while (!(EUSCI_B0->IFG 和 EUSCI_B_IFG_RXIFG));

    //将数据移动到临时缓冲区
    RXData = EUSCI_B0->RXBUF;

    //清除接收中断标志
    EUSCI_B0->IFG &=~EUSCI_B_IFG_RXIFG;
    P1->OUT |= BIT0;


  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Sylvain、
    在第一个代码示例中、您发送的地址与第二个代码示例中的地址不同。 此外、在这两种情况下、您都要持续发送地址(0xA2或0x80)。 这是您打算做的吗? 此外、您选择的芯片选择是否应在发送的地址和接收的数据之间保持相同的状态? 例如、P1.0应该被设定为低电平、然后 eUSCI 缓冲器加载地址和一个虚拟字节(发送器被缓冲、所以负载可以背靠背)、然后在两个字节被接收后、P1.0应该被设定为高电平。

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

    非常感谢您的回答。

    我尝试了几个地址、但没有任何地址起作用。
    如果我对 LDC1041很了解、那么在发送带有读取位的地址的过程中、我必须通过将 CSB 引脚置为低电平来选择芯片、然后我将 CSB 引脚置为低电平并等待响应。 在这两种情况下(是否来自 LDC)、我都将 CSB 引脚恢复为高电平。 我再试一次(只是因为在示波器上更容易看到信号)。

    CSB 是否可以随时处于低电平状态? 或者、我是否必须在时钟的同时将其置为低电平? CSB 的数据表不清楚。

    谢谢你

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

    您好!
    LDC1041使用一个标准4线制 SPI 协议。 当 CSB 从高电平转换为低电平时、它启动 SPI 读取。 然后、它开始寻找上升时钟边沿、以便在 SCLK 的前8个上升边沿上锁存 SDI 的读取/写入位和地址位。 假设发出读取命令(第一个上升时钟边沿上的 SDI 为1)、SDO 引脚将在 SCLK 的最后8个下降边沿上输出来自该寄存器的数据。 SPI 事务完成后、应将 CSB 拉为高电平。 请注意、LDC1041数据表的图2中有一个 CSB、SCLK 和 SDI 信号图、以及一个详细的第7.5.1节 SPI 说明。 首先、我要用示波器确认信号看起来都正确、时序正常。 如果您的 CSB 引脚被拉低、或者在您写入 SDI 之后、则会出现错误行为。
    此致、
    Luke

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Luke 您好、感谢您的回答。
    我完成了所有这些。 MU CSB 变为低电平、然后我发送读取位、再发送要读取的寄存器 I 地址的7位。 之后、为了让 LDC 做出响应、我让 CSB 处于低电平、但我没有任何选择。
    我的问题是:从 CSB 的下降沿到第一个时钟之间是否有时间值得尊重? 我 µs 的是肯定的、但我查看了评估板(MSP430 + LDC1041 +线圈)、这两个边沿之间的时间比数据表中给出的时间大得多(实际上是几 μ s)。

    因此、我所做的正是数据表给出的图表中所写的内容(CSB 下降和第一个时钟之间的时序除外)、频率为3MHz。
    那么、我要回答的是、我必须在 TBCLK 引脚上发送一个频率、或者、当我只要求 LDC 的 ID 时、我是否可以让它没有任何东西?

    我的代码是否正常? 在第二个示例中、我使用 P1.0作为 CSB 信号。 我在发送字节之前将其置为零、并在接收中断(我从未接收到)后将其恢复为高电平。

    非常感谢你的帮助

    Sylvain
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Sylvain、您好!
    您是否可能不满足 LDC1041的 VIH 电平? VIH 等于0.8xVIO、因此如果您在5V 电压下运行并且将 VIO 连接到5V、则 VIH 电平应大于4V。 如果 MSP430在3.3V 电源下运行并且具有3.3V IO、则它不会满足该电平。
    要回答其他问题、您无需使用 TBCLK 进行 SPI 通信。
    此致、
    Luke
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Luke、

    我的模拟电压为5V,I/O 电压为3.3V,我发送的位为3.18V,因此超过0.8*3.3V。 可以吗?

    谢谢你

    Sylvain

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

    您好!

    我终于设法读取了寄存器。 MSP432的程序示例在中断例程中执行了所有操作、因此我使用标志修改了程序、现在可以正常工作。

    我设法读取寄存器、但我必须发送两次命令读取。 了解一下该计划:

    #include "ti/devices/msp432p4xx/inc/msp.h"

    #include

    uint8_t RXData = 0;

    uint8_t TXData1;

    uint8_t TXData2;

    uint8_t flag = 0;

    uint8_t 接收= 0;

    uint8_t SEND = 0;

    uint8_t a = 1;

    int main (空)

      volatile uint32_t i;

      uint8_t 先前的数据;

      WDT_A->CTL = WDT_A_CTL_PW |       //停止看门狗计时器

          WDT_A_CTL_HOLD;

      P1->OUT &=~BIT0;

      P1->DIR |= BIT0;             //将 P1.0 LED 配置为输出

      P1->SEL0 |= BIT4 | BIT4 | BIT6 | BIT4; //将4-SPI 引脚设置为第二功能

      Timer_A0->CCTL[0]= TIMER_A_CCTLN_CCIE;// TACCR0中断被启用

      Timer_A0->CCR[0]= 2000;

      Timer_A0->CTL = TIMER_A_CTL_ssel_SMCLK |// SMCLK,连续模式

          Timer_A_CTL_MC__UP;

      Timer_A1->CCTL[0]= TIMER_A_CCTLN_CCIE;// TACCR0中断被启用

      Timer_A1->CCR[0]= 1700;

      Timer_A1->CTL = TIMER_A_CTL_ssel_SMCLK |// SMCLK,连续模式

          Timer_A_CTL_MC__UP;

      EUSCI_B0->CTLW0 |= EUSCI_B_CTLW0_SWRST;//将状态机置于复位状态

      EUSCI_B0->CTLW0 = EUSCI_B_CTLW0_SWRST |//保持复位状态

          EUSCI_B_CTLW0_MST |       // SPI 主设备

          EUSCI_B_CTLW0_SYNC |       //同步模式

          EUSCI_B_CTLW0_CKPL |       //时钟极性高

          EUSCI_B_CTLW0_MSB |       // MSB 优先

          EUSCI_B_CTLW0_ssel_SMCLK;   // smCLK

      //EUSCI_B0->BRW = 0x01;          ///2、fBitClock = fBRCLK/(UCBRx+1)。

      EUSCI_B0->CTLW0 &=~EUSCI_B_CTLW0_SWRST;//**初始化 USCI 状态机**

      EUSCI_B0->IE |= EUSCI_B_IE_RXIE;    //启用 USCI_B0 RX 中断

      TXData1 = 0x01;              //保留 TX 数据

      TXData2 = 0x55;

      //启用全局中断

      __ENABLE_IRQ();

      //在 NVIC 模块中启用 eUSCIA1中断

      NVIC->ISER[0]= 1 <<((EUSCIB0_IRQn)& 31);

      NVIC->ISER[0]= 1 <<(TA0_0_IRQn)& 31);

      NVIC->ISER[0]= 1 <<(TA1_0_IRQn)& 31);

      while (1)

      {

        如果(A==1)

        {

        P1->OUT |= BIT0;

        //timer_A0->CTL = TIMER_A_CTL_MC__UP;

        Timer_A0->CCR[0]= 2000;        //将偏移添加到 TACCR0

        A=0;

        }

        如果(flag==1)

        {

          P1->OUT &=~BIT0;

          //发送字符

          EUSCI_B0->TXBUF = TXData1;

          EUSCI_B0->TXBUF = TXData2;

          Timer_A1->CCR[0]= 500;        //将偏移添加到 TACCR0

          flag=0;

        }

        如果(接收==1)

        {

          //将数据移动到临时缓冲区

          RXData = EUSCI_B0->RXBUF;

          //清除接收中断标志

          EUSCI_B0->IFG &=~EUSCI_B_IFG_RXIFG;

          接收= 0;

        }

        如果(发送==1)

        {

          //发送字符

          EUSCI_B0->TXBUF = TXData1;

          EUSCI_B0->TXBUF = TXData2;

          //禁用 TX 中断

          EUSCI_B0->IE &=~EUSCI_B_TXIE;

          发送=0;

        }

      }

    // SPI 中断服务例程

    空 EUSCIB0_IRQHandler (空)

      IF (EUSCI_B0->IFG 和 EUSCI_B_IFG_TXIFG)

      {

        //禁用 TX 中断

        EUSCI_B0->IE &=~EUSCI_B_TXIE;

        发送=1;

      }

        //等待字符被接收

        IF (EUSCI_B0->IFG 和 EUSCI_B_IFG_RXIFG)

        {

          //清除接收中断标志

          EUSCI_B0->IFG &=~EUSCI_B_IFG_RXIFG;

          接收= 1;

        }

    void TA0_0_IRQHandler (void){

      FLAG = 1;

     // timer_A0->CTL = timer_A_CTL_MC_stop;

      Timer_A0->CCTL[0]&&~Timer_A_CCTLN_CCIFG;

    void TA1_0_IRQHandler (void){

      A = 1;

     // timer_A0->CTL = timer_A_CTL_MC_stop;

      Timer_A1->CCTL[0]&&~Timer_A_CCTLN_CCIFG;

    我在 wWhile (1)内发送第一条命令、在中断例程内发送第二条命令。 如果我抑制一个或另一个、则什么也不起作用。 有什么想法吗?

    我现在尝试发送两个字节的数据:一个是寄存器地址,另一个是我要写入的数据。 但正如您在下面的图片中看到的、这两个字节被几个 µs 分隔、我不知道原因。

    黄色迹线是 CSB 信号。 绿色轨迹线是我要发送的数据。 如您所见、第一个字节(0x01)在第二个字节(0x55)之前发送几个 µs。 有什么想法为什么? 我认为这两个问题是相关的:第一个问题是无法在 TX 缓冲区内不写两次就发送数据,第二个问题是这两个字节分开的。

    非常感谢你的帮助

    Sylvain

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Sylvain、
    我建议放置一些额外的 GPIO 输出、以便您可以查看中断相对于发送数据时的时序。

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

    好的、我会这样做。 但是、您看一下代码了吗? 有什么问题吗?

    谢谢你

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

    您好!

    我尝试使用 GPIO,但我看不到任何有趣的东西,除了从一个设计到下一个设计,程序似乎花费了很多时间:是否有一个时钟可以调整?

    我不知道为什么、主要问题是我必须发送两倍的 TXBuffer 才能得到响应。 LDC1041的响应与第二个发送的 TXBuffer 同步。 因此、我想知道 LDC1041的答案是否由第二个 TXBuffer 的时钟生成。 在这种情况下、为了发送16个时钟而不是我目前发送的8个时钟、是否需要在 MSP432寄存器中进行调整?

    感谢你的帮助、

    Sylvain

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

    Sylvain、

    这是我在 LDC1041数据表的第15页中找到的数据表(   )。

    MSP432上的 SPI 发送器需要您写入 TX 缓冲器以接收数据(生成时钟)。  没有16位模式、因此您需要向 TX 缓冲区写入两次、一次写入实际地址信息、第二次写入将是"虚拟"写入以接收数据。  在 RX 中断服务例程中、您将在发送地址后获得一个中断、其中 RX 缓冲区的内容毫无意义、然后在发送"虚拟"写入后、将发生另一个 RX 中断、此时 RX 缓冲区将包含读取 数据。  

    此致、

    Chris

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    非常感谢、所有回答都对我有所帮助。 我现在能够读取和写入寄存器。 我遇到的主要问题是、我没有在写入命令和读取命令之间拉高 CSB。
    实际上、我必须下拉 CSB、以发送第一个包含寄存器地址的字节、然后是我要写入的数据。 然后、我将 CSB 拉为高电平、然后再次下拉、我可以发送寄存器地址、第一个位为1、以发送命令读取、并完成发送"虚拟"字节和获取数据的操作。

    谢谢大家

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

    大家好、

    我需要你的帮助。

    我现在能够读取和写入寄存器、但我还有另一个问题。

    这是我用来读取 LDC1041的代码的一部分:

       TXData1 = 0x0B;                         //保持 TX 数据
       TXData2 = 0x01;
       TXData3 = 0xA2;                         //保留 TX 数据
       TXData4 = 0x00;
       TXData5 = 0xA3;                         //保留 TX 数据
       TXData6 = 0x00;
       //启用全局中断
       __ENABLE_IRQ();

       //在 NVIC 模块中启用 eUSCIA1中断
       NVIC->ISER[0]= 1 <<((EUSCIB0_IRQn)& 31);




       while (1)
       {

    if (flag==1)

               P1->OUT &=~BIT0;// CSB 低电平
               //发送字符
               EUSCI_B0->TXBUF = TXData1;
               //发送字符
               EUSCI_B0->TXBUF = TXData2;
               P1->OUT |= BIT0;// CSB 高电平
    flag=0;



               P1->OUT &=~BIT0;// CSB 低电平
               EUSCI_B0->TXBUF = TXData3;
               //发送字符
               EUSCI_B0->TXBUF = TXData4;
               P1->OUT |= BIT0;// CSB 高电平


               P1->OUT &=~BIT0;// CSB 低电平
               EUSCI_B0->TXBUF = TXData5;
               //发送字符
               EUSCI_B0->TXBUF = TXData6;
               P1->OUT |= BIT0;// CSB 高电平


       }


    // SPI 中断服务例程
    空 EUSCIB0_IRQHandler (空)

       IF (EUSCI_B0->IFG 和 EUSCI_B_IFG_TXIFG)
       {
           //禁用 TX 中断
           EUSCI_B0->IE &=~EUSCI_B_TXIE;
       }

           //等待字符被接收
           IF (EUSCI_B0->IFG 和 EUSCI_B_IFG_RXIFG)
           {
               //清除接收中断标志
               EUSCI_B0->IFG &=~EUSCI_B_IFG_RXIFG;
               P3->OUT |= BIT2;
               //将数据移动到临时缓冲区
               RXData = EUSCI_B0->RXBUF;
               //清除接收中断标志
               EUSCI_B0->IFG &=~EUSCI_B_IFG_RXIFG;
               接收= 0;
               P3->OUT &=~BIT2;
           }



    如您所见、我发送了第一个字节、该字节将 LDC 置于激活模式、在该模式下启用了转换。 我使用一个标志来只在这个寄存器内写入一次(在程序开始时)。

    然后、我发送0xA2、因为数据表中写入的数据表明、只有在0x22寄存器上启动读取操作时、数据才会更新。

    然后我发送0xA3以获取频率计数器的 LSB 计数。

    但我没有从 LDC1041、0x22或0x23寄存器接收到任何响应。 我在外部 FREQUENCY 引脚上注入低频率(大约10kHz)。

    对我做错的事有什么想法吗? 还有其他事情要做吗?

    感谢你的帮助

    此致

    S.

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

    Sylvain、您好!
    我会尝试使用逻辑分析仪来更好地了解中断服务例程的调用方式。 在您加载 TX 缓冲区两次后、移位寄存器 TXData1中有一个字节、而 TX 缓冲区 TXData2中有一个字节。 当第一个字节实际完成发送时、将生成接收中断。 当字节 TXData2移动到移位寄存器时、TX IFG 被置位-但在您的情况下、中断未被启用、因此无关。 当 TXData2被发送时、会产生另一个接收中断。

    在您的代码流中、您无法控制是否在发送 TXDATA1之前或之后对发送缓冲区 TXDATA1进行第三次写入。 您可能会覆盖传输缓冲区中的数据。 此外、在中断服务例程中、您不知道您是否正在读取正确的接收字节。

    另一个重要的问题是、仅仅由于已加载发送缓冲区、您不应将 CSB 设置为高电平。 在实际传输数据后、CSB 不应设为高电平。 这将由第二个 RX IFG 指示。 同样、您应该使用逻辑分析仪来确保程序流和通信符合预期。

    此示例可能会为您提供一些有关如何使用睡眠和轮询来控制流量的想法。
    dev.ti.com/.../

    此致、
    Chris

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

    您好 Chris、

    感谢您的回答。

    我正在尝试您向我展示的代码:

    #include "ti/devices/msp432p4xx/inc/msp.h"
    #include

    静态 uint8_t RXData = 0;
    静态 uint8_t TXData[20];
    uint8_t 数据= 0;

    int main (空)

       volatile uint32_t i;
       uint8_t 先前的数据;

       WDT_A->CTL = WDT_A_CTL_PW |            //停止看门狗计时器
               WDT_A_CTL_HOLD;

       P8->DIR |= BIT0;                       // P8.0输出
       P8->SEL1 |= BIT0;                      // P8.0选项选择

       //配置 Timer_A
       Timer_A1->CCTL[0]= TIMER_A_CCTLN_OUTMOD_4;// CCR0切换模式
       Timer_A1->CCR[0]= 4;
       Timer_A1->CTL = TIMER_A_CTL_tassel_2 | // SMCLK
               Timer_A_CTL_MC_3 |             //向上/向下计数模式
               Timer_A_CTL_CLR;               //清除 TAR

       P1->OUT &=~BIT0;
       P1->DIR |= BIT0;                       //设置 P1.0 LED

       P1->SEL0 |= BIT5 | BIT6 | BIT7;        //将 P1.5、P1.6和 P1.7设置为
                                               // SPI 引脚功能

       EUSCI_B0->CTLW0 |= EUSCI_B_CTLW0_SWRST;//将 eUSCI 状态机置位
       EUSCI_B0->CTLW0 = EUSCI_B_CTLW0_SWRST |//保持 eUSCI 状态机处于复位状态
               EUSCI_B_CTLW0_MST |            //设置为 SPI 主设备
               EUSCI_B_CTLW0_SYNC |           //设置为同步模式
               EUSCI_B_CTLW0_CKPL |           //将时钟极性设置为高电平
               EUSCI_B_CTLW0_MSB;             // MSB 优先

       EUSCI_B0->CTLW0 |= EUSCI_B_CTLW0_ssel_SMCLK;// ACLK
       EUSCI_B0->BRW = 0x01;                  ///2、fBitClock = fBRCLK/(UCBRx+1)。
       EUSCI_B0->CTLW0 &=~EUSCI_B_CTLW0_SWRST;//初始化 USCI 状态机

       TXData[0]= 0x02;                         //初始化 TX 数据到0x01
       TXData[1]= 0x3A;
       TXData[2]= 0x03;
       TXData[3]= 0x15;
       TXData[4]= 0x04;
       TXData[5]= 0x17;
       TXData[6]= 0x05;
       TXData[7]= 0x00;
       TXData[8]= 0x07;
       TXData[9]= 0x14;
       TXData[10]= 0x09;
       TXData[11]= 0x12;
       TXData[12]= 0x0A;
       TXData[13]= 0x04;
       TXData[14]= 0x0B;
       TXData[15]=0x01;
       TXData[16]= 0x22;
       TXData[17]= 0x00;
       TXData[18]= 0x23;
       TXData[19]= 0x00;

       //启用全局中断
       __ENABLE_IRQ();

       //在 NVIC 模块中启用 eUSCI_B0中断
       NVIC->ISER[0]= 1 <<((EUSCIB0_IRQn)& 31);

       //从 ISR 退出时唤醒
       SCB->SCR &=~SCB_SCR_SLEEPONEXIT_MSK;

       //确保 SLEEPONEXIT 立即生效
       _DSB();

       while (1)
       {
           EUSCI_B0->IFG |= EUSCI_B_IFG_TXIFG;//清除 TXIFG 标志
           EUSCI_B0->IE |= EUSCI_B_IE_TXIE;   //启用 TX 中断
           _SLEEP();
           __no_operation();                  //用于调试,保留在 LPM0中


           对于(i = 200;i > 0;i-);        //下次传输前延迟
           P1->OUT |= BIT0;// CSB 高电平
       }


    // SPI 中断服务例程
    空 EUSCIB0_IRQHandler (空)

       IF (EUSCI_B0->IFG 和 EUSCI_B_IFG_TXIFG)
       {
           P1->OUT &=~BIT0;// CSB 低电平
           EUSCI_B0->TXBUF = TXData[DATA];          //发送字符
           EUSCI_B0->IE &=~EUSCI_B_TXIE;

           //等待字符被接收
           while (!(EUSCI_B0->IFG 和 EUSCI_B_IFG_RXIFG));
           RXData = EUSCI_B0->RXBUF;
           DATA++;                          //递增发送数据
           if (data==19) data = 0;
           //清除接收中断标志
           EUSCI_B0->IFG &=~EUSCI_B_IFG_RXIFG;
       }


    我可以在示波器上检查我的字节是否正确发送、CSB 正常、外部时钟以190kHz 的频率振荡。 但是、当我尝试从0x23寄存器获取数据时、仍然没有任何结果... 当我从另一个寄存器获取数据时没有问题。 那么、在我看来、我忘记了启动转换的重要内容、或者可能是必须尊重的延迟?

    感谢你的帮助

    Sylvain

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

    Sylvain、

      您是否尝试使用扩展模式读出计数器?

    此致、

    Chris

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

    Chris、

    我会尝试、但我很确定它不起作用、因为我不会读取第一个寄存器0x22上的任何内容...

    我使用两个电源:一个是 MSP432本身、它用3V3为 LDC1041 I/O 供电、另一个使用5V 的 MSP432为 LDC1041的模拟别名供电。 对吗?
    对于 LDC1041、大约180kHz 的外部频率是否可以、或者我是否必须为 LDC 提供更高的频率?

    谢谢、

    Sylvain

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

    刚刚尝试过,但它不起作用...


    Sylvain
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    另一件事是、当我读取寄存器0x20时、位号6始终为1、这意味着"没有可用的新数据"。 这是否意味着我不会发起一项措施?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    我还尝试使用评估板来注入外部频率:我将 LDCLK 时钟连接到我正在使用的 LDC1041之一,并将数字接地连接在一起。 仍然不奏效。 我唯一能看到的是字节0x22和0x23之间的时序太长? 有可能吗?

    您是否有能够读取寄存器0x22至0x25的基本代码?

    谢谢你

    Sylvain

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

    有人吗?

    谢谢你

    Sylvain

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

    LDC1041的预期运行需要几个项目。

    首先、器件默认进入待机(睡眠)模式。 您必须在此模式下配置器件、然后通过设置寄存器将器件设置为活动状态。 您需要了解有关传感器的几个方面、包括最小传感器频率和传感器 RP 的范围。

    设置器件后、您可以通过将寄存器0x0B 设置为0x01进入活动模式。 您需要按照数据表第8.1.3节中的指示设置 CFB 电容器。

    然后、您需要等待转换完成;如果寄存器0x0A 设置为0x04、则可以监控 INTB 引脚是否有效。 INTB 置位后、您可以检索转换数据。

    此致、

    Christo