您好、TI 团队、
我想知道能否向我发送用于控制 LP5890的 CCSI 通信协议的幻灯片。 我还想知道该协议是否可以使用 SPI 接口在 ST Nucleo-G071RB 上实施。
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.
您好、Evan:
此致、
周老师
周老师、您好!
感谢您的反馈。 我在 这里看到过 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:
使用 ST MCU 时、我建议您检查是否使用 SAI 外设(或 I2S)。
尊敬的 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
}
}
再次感谢您花时间回答这些问题。