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.

[参考译文] LP5890:CCSI 通信

Guru**** 2552050 points
Other Parts Discussed in Thread: LP5890

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

https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/1219233/lp5890-ccsi-communication

器件型号:LP5890

您好、TI 团队、

我想知道能否向我发送用于控制 LP5890的 CCSI 通信协议的幻灯片。 我还想知道该协议是否可以使用 SPI 接口在 ST Nucleo-G071RB 上实施。

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

    您好、Evan:

    1. 抱歉、您提到了哪些幻灯片?   有关 CCSI 的一些提示、请查看此[FAQ]中的[Q4]。  
    2. 可以在您提到的 ST 器件上实施 CCSI。 您可以参考我们的示例代码(从上面的[FAQ]中勾选[Q2])。 您可以检查 MSP430版本示例代码(链接: LP5890EVM-SW-F5529)、我们在其中使用 SPI 和另一个 GPIO 引脚来模拟 CCSI。

    此致、

    周老师

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

    周老师、您好!

    感谢您的反馈。 我在 这里看到过 TI 的其他人在另一封表格帖子中引用 CCSI 幻灯片。 不确定它们是否存在。 我还有一些关于在 ST 板上设置 CCSI 协议的问题。

    1.如何设置计时器? 以下是在您参考的示例代码中设置计时器的代码。 我不熟悉 MSP430、因此我想知道如何将其转换为 ST。 如果我理解正确、 这里的 TA2.1计时器设置为 SPI 时钟、而 TA0正与 main.c 中的中断一同使用以控制帧速率。 我认为我的主要问题是输出模式(OUTMOD_2、OUTMOD_0)如何转换为 ST 计时器的设置? 此外、第4行上的注释(LP589x 首次试用将 SCLK 增加至12MHz)意味着什么?我当时想、由于没有应用时钟分频、我们将在24MHz 上运行?

     

    void timerInitial()
    {
        TA2CTL |= TASSEL_2 + MC_0; //select SMCLK clock source, select /1 =24MHz, divider, select stop mode
        // First trial for LP589x to increase SCLK to 12 MHz
        TA2CCTL1 |= OUTMOD_2; //TA2.1 select toggle/reset mode//OUTMOD_2
    #ifdef TLC698X
        TA2CCR0 = 3;
        TA2CCR1 = 2;
    #endif
    #ifdef LP589X
        TA2CCR0 = 1;
        TA2CCR1 = 1;
    #endif
    
        P2DIR |= BIT4; //P2.4 set as output
        P2SEL |= BIT4;//P2.4 -> TA2.1
        TA2CTL |= MC_1; //select up mode to start timer
    
        // Timer 0 setup for frame rate control
        TA0CTL = TASSEL__SMCLK + ID_2 + MC_0; //select SMCLK clock source, select /4 = 6MHz, divider, select stop mode
        TA0CCTL0 = OUTMOD_0;
        TA0CCR0 = FRAME_PERIOD - 1;
        TA0EX0 = TAIDEX_5; // Select /6 --> 1MHz
        TA0CTL |= MC_1; //select up mode to start timer
        TA0CCTL0 |= CCIE; //enable TA0CCR1 CCIFG interrupt
    }

    这里是我当前两个 ST 计时器之一的设置、我认为它与 TA2.1类似。 该微控制器的时钟设置为在64MHz 下运行、因此使用2的时钟分频会将其降低至32MHz、从而满足 LP5890上 SCLK 的要求(50MHz 的最大值)。 我不确定的一点是 MasterOutputTrigger 和 OCMode 的选择、以及我选择的功能是否有效。

    htim2.Instance = TIM2;
      htim2.Init.Prescaler = 0;
      htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
      htim2.Init.Period = 1;
      htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV2;
      htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
      if (HAL_TIM_Base_Init(&htim2) != HAL_OK)
      {
        Error_Handler();
      }
      sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
      if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK)
      {
        Error_Handler();
      }
      if (HAL_TIM_OC_Init(&htim2) != HAL_OK)
      {
        Error_Handler();
      }
      sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
      sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
      if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
      {
        Error_Handler();
      }
      sConfigOC.OCMode = TIM_OCMODE_TOGGLE;
      sConfigOC.Pulse = 0;
      sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
      sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
      if (HAL_TIM_OC_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
      {
        Error_Handler();
      }

    2.设置的 SPI 的实际 SCLK 是否完全被忽略?

    3.我们怎么知道 SOMI 和 SIMO 通道与定时器输出同步呢? 两者之间有什么关系? 在上面的定时器初始化代码中、 看起来 TA2.1 没有应用时钟分频、所以它是24MHz。 然而、当查看下面的 SPI 初始化函数时、UCBxBR0被设定为2、这表示 SPI 运行频率为12MHz 的一半。

    void spiInitial()
    {
    
        UCB0CTL1 |= UCSWRST; //USCI rest software
        UCB0CTL0 |= UCCKPL + UCMSB + UCMST;//UCCKPH = 0, UCCKPL = 1;
        UCB0CTL1 |= UCSSEL__SMCLK ; //UCLK = SMCLK = 24MHz
        //UCB0BR0 = 2;
    #ifdef TLC698X
        UCB0BR0 = 2;//fBitClock = 24/2 = 12MHz --> With double edge this means SCLK is 6 MHz
    #endif
    #ifdef LP589X
        UCB0BR0 = 2;//fBitClock = 24/2 = 12MHz --> With rising-edge this means SCLK is 12 MHz
    #endif
        UCB0BR1 = 0;
        P3DIR |= BIT0 + BIT2; //P3.0 -> SIMO, P3.2 -> SPICLK;
        P3DIR &= ~ BIT1; //P3.1 -> SOMI;
        P3SEL |= BIT0 + BIT1 + BIT2;
        UCB0CTL0 &= ~UC7BIT; //8-bit character length
        UCB0CTL1 &= ~UCSWRST; //USCI rest released for operation
    }

    提前感谢您回答我的问题。 如果您需要更多信息、请告诉我、以便回答这些问题。

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

    您好、Evan:

    您是否参阅此主题: LP5890:Lp5890 CCSI 通信-电源管理论坛-电源管理- TI E2E 支持论坛

    同时、我将在我们的团队中找到一位专家、让他/她回答您的软件相关问题。

    此致、

    周老师

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

    是的、我曾尝试将这个主题链接到他们引用幻灯片的位置。

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

    您好、Evan:

    明白了。 我会和 Monet 讨论这个问题。

    BR、Steven

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

    您好、Evan:

    我在此 E2E 论坛上向您发送了一个友谊申请、并附上我的电子邮件。 请发送电子邮件给我、我将给您发送 CCSI 幻灯片。

    此致、

    周老师

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

    您好、Evan:

    使用 ST MCU 时、我建议您检查是否使用 SAI 外设(或 I2S)。

    1. MSP430代码依赖 CPI、计时器和 SPI 外设获得相同系统时钟的时钟系统结构。
      1. TA2确实用于生成连续时钟。 该模式设置的输出每2个时钟周期切换一次。 因此、时钟变为系统时钟的一半。
      2. 第4行上的注释可忽略不计。 在较早版本的代码中、连续时钟以较低频率运行。
      3. TA0实际上是在每个帧周期生成中断以启动 VSYNC 命令发送的计时器。
    2. SPI 接口的输出未使用。 但是、仍需要设置时钟来生成与计时器频率相同的数据输出。
    3. 我们 根据计时器计数值启动 DMA、因此 SPI 数据与计时器时钟输出的下降沿同时移出。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Ben:

    谢谢你的答复,我开始明白这是如何工作的。 由于一直在尝试在 ST 板上实现此功能、我遇到的其他一些问题还有:

    为什么建议我通过 SPI 使用 I2S?

    2.我知道 DMA 是由 TA2计时器计数触发的,但是在以下代码中,将 DMA0CTL 存储在 dma0ctl_val 中有什么意义呢?

    void dmaTransfer(unsigned int dmaTxSize, unsigned int dmaRxSize, unsigned int checkResponse)
    {
        uint16_t idx = 0;
        uint16_t startLoop = 0;
        uint16_t endLoop = 0;
        volatile uint16_t timer_val = 0;
        volatile uint16_t dma0ctl_val = 0;
    
        if(firstTransfer == FALSE){
            while(!(DMA0CTL&DMAIFG)); //Wait until send all command bytes
            DMA0CTL &= ~(DMAEN + DMAIFG);//disable DMA0
        }
        else
            firstTransfer = FALSE;
        
        if(checkResponse==TRUE) {
            // Ensure that rest of transmit data is all 0xFFFF
            if(dmaTxSize < dmaRxSize) {
                startLoop = (dmaTxSize >> 1) + (dmaTxSize & 0x1);
                endLoop = (dmaRxSize >> 1) + (dmaRxSize & 0x1);
                for(idx = startLoop; idx <= endLoop; idx++){
                    ledXmtBuffer[0][idx] = 0xFFFF;
                }
            }
            DMA0SZ = dmaRxSize;
            DMA1SZ = dmaRxSize;
        }
        else {
            DMA0SZ = dmaTxSize;
        }
    
        dma0ctl_val = DMA0CTL;
        dma0ctl_val |= DMAEN;
        timer_val = TA2R;
    
        while(timer_val > 0){
            timer_val--;
        }
    
    #ifdef LP589X
        __no_operation();
    #endif
    
        DMA0CTL = dma0ctl_val;
    
        if(checkResponse==TRUE)
        {
            DMA1CTL |= DMAEN; //enable Rx DMA
            while(!(DMA0CTL&DMAIFG)); //Wait until send all command bytes
            while(!(DMA1CTL&DMAIFG)); //Wait until receive all response byte
            DMA1CTL &= ~(DMAEN + DMAIFG); //disable DMA1
            DMA0CTL &= ~(DMAEN); //disable DMA0
        }
    }

    再次感谢您花时间回答这些问题。

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

    嗨、偶!

    1. SAI 和 I2S 等串行音频接口具有一个连续时钟、其中的数据自动与该时钟对齐。 我自己还没有使用这些接口、因为 MSP430 MCU 没有这些接口。
    2. 首次读取和准备寄存器值有助于更好地控制 CPU 周期数。 实际上、最好用汇编语言编写这部分代码、而不允许对该部分进行任何代码优化以完全控制 CPU 周期。