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.

[参考译文] MSP430F5438A:从外部 PCM1804 ADC 读取数据时出现问题

Guru**** 2538950 points
Other Parts Discussed in Thread: PCM1804, MSP430F5438A

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/972879/msp430f5438a-problem-reading-data-from-external-pcm1804-adc

器件型号:MSP430F5438A
主题中讨论的其他器件: PCM1804

大家好、

我目前正在进行一个项目 、在该项目中、我需要使用4引脚 SPI 接口从 MSP430F5438A 的外部 ADC (PCM1804)采样数据。 硬件当前设置为使 ADC 成为 SPI 通信的主器件、MSP430作为从器件。 ADC 的电流采样率约为1kHz、与器件的能力相比、这种速度非常慢、但计划在未来提高采样速度。 我正在读取中的数据、但它与从 ADC 中获得的数据不匹配。

通道1:来自 PCM1804的 L/R CLK

通道2:MSP 从器件的 STE 信号(源自 L/R CLK)

通道3:PCM1804的数据输出

通道4:数据 CLK

当 STE 信号为高电平时、发送4个字节。 下面是我从总线读取的4个字节、这是不正确的。 我有一个直流信号在 ADC 中播放、因此输出是恒定的、但每次读取时、我都会得到4个不同的字节。  

这是我第一次尝试使用 MSP 读取外部 ADC、我查看了 TI 提供的示例代码、但没有一个真正的帮助。 是否有人对在这里要做什么或我应该继续阅读此数据有任何建议? 提前感谢您的所有帮助。 下面是 SPI 设置和尝试读取 ADC 的代码。 如果需要更多信息、请随时提问、因为我确定在发布帖子时忘记了一些内容。

void SPI_CONFIG_ADC ()
{
ASPI_CTL1 |= UCSWRST; //为配置
ASPI_CTL0设置复位位|=(UCMSB | UCSYNC | UCMODE_1); // MSB 优先、同步模式、4引脚 SPI STE 高电平有效

ASPI_CTL1 &=~Ω UCSWRST; //清除复位位位释放 USCI 以进行操作
} 

void main (void)
{
WDTCTL = WDTPW + WDTHOLD;//停止看门狗计时器以防止超时复位
Init_Startup(); //调用初始化端口、USCI 和时钟

ASSERT_ADC_RST; //将 ADC 置于复位状态
UART0_IE |= UCRXIE; //启用 UART0中断
UART2_IE |= UCRXIE; //启用 UART2中断
__ENABLE_INTERRUPT (); //启用全局中断
取反_ADC_RST; //将 ADC 从复位状态中拉出

Timer_B_DELAY (65000);//延迟大约1.2秒以等待来自 ADC 的有效数据。

__no_operation(); //用于调试

int 计数器= 0; //同步到自由运行的 L/R CLK
while (counter < 3)
{
计数器+= 1;
while (!(P10IN & ADC_LR)){;}
}}


while (!(UCB1IFG & UCRXIFG)){;}//从 ADC 读取4个字节的原始方式。 这是不正确的吗?
ADCOUT[0]= ASPI_RXBUF;
while (!(UCB1IFG & UCRXIFG)){;}
ADCOUT[1]= ASPI_RXBUF;
while (!(UCB1IFG & UCRXIFG)){;}
ADCOUT[2]= ASPI_RXBUF;while (UCB1IFG & UCRXIFG


){;}ADCOUT[2]= ASPI_RXBUF (UCB1IFG = UCB1IFG);while (UCB1UCB1IFG = UCRUCRST_RST_RST_UCRF);ADCST_UCB1 //在读取4个字节
__no_operation ()后将 ADC 重新置位; //用于调试断点
。} 

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

    您好、Matthew、

    MSP 是否是您系统中唯一的主器件? 我问的是、通常使用3线模式、我们有3线 SPI 主控模式的示例、可在 Resource Explorer 中找到这些示例:

    https://dev.ti.com/tirex/explore/node?node=ABdg0SXqb5cLjFUxKAAA2g__IOGqZri__LATEST 

    BR、

    Leo

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

    您好、Leo、

    在这个系统中、MSP 被用作从器件。 我需要使用4引脚的原因是、PCM1804 ADC 在 L/R CLK 的高电平时间和低电平时间输出数据、并且我只希望在 L/R CLK 的高电平时间输出数据。 通过使用4引脚、USCI 仅在该线路为高电平时打开并收集数据。  

    切换到3引脚是否会使其更易于处理?

    谢谢、

    Matt

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

    您好、Matt、

    从3线模式开始、您可以从 Resource Explorer 中的工作主从示例开始(您可以将两个 Launchpad 连接在一起以查看此通信是否正常)。  根据我的经验、从工作示例开始并根据需要进行增量更改更容易。

    BR、
    Leo

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

    在我阅读 PCM1804数据表(SLES022C)图37时、我认为您需要设置 UCCKPH=1。

    我不确定"计数器"循环的作用是什么。 它看起来是轮询 STE、但我看不到"3"的来源。 您是否相当确定它在执行您的目标? 在 STE 被置为有效前、SPI 单元将处于非激活状态(包括 RXIFG)。

    如果我正在正确读取示波器跟踪、SCK 大约为60kHz、这将为您提供133 μ s (相当长)的时间来获取每个 Rx 字节。 随着您加速该时钟、您可能会发现 DMA 很有用。  

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

    我一定会尝试不同的捕获、看看这是否有助于我尝试过的结果。

    至于在网上阅读不同论坛的其中一个之后的计数器循环、有人提到必须"同步"到自由运行时钟、这是我实现的目的、以查看这是否会起作用。 数字"3"是到时钟"同步"的任意周期数。

    是的、目标是以更快的速度收集数据、但我无法以快速的速度正确读取数据、因此我减慢了 ADC、希望能够更轻松地读取数据。 那么、您认为 STE 的时序可能会导致 USCI 丢失数据吗? 感谢您花时间查看我的帖子。

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

    我还注意到、您的从器件在整个复位/启动延迟期间启用。 似乎可以提供一些样本、这意味着示波器跟踪可能与您捕获的数据对应、也可能不对应。

    我想知道、在(a) ADC 完全启动且(b) STE=0 (置为无效)之前、您是否会更好地使 SPI 单元处于复位状态(UCSWRST=1)。 然后、您可以非常确定看到的接下来的4个字节将是单个样本的一部分。

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

    Bruce、

    我现在正在读取预期的数据。 切换 UCCKPH=1并且在 ADC 完全启动并且 STE=0之前也不启用 SPI 接口、这似乎已经解决了这个问题。 现在、我将开始进一步扩展、以读取更多样本、并更快地读取它们。 我很可能会采纳您的建议并使用 DMA 以实现更快的收集速度。  

    我对具有192KHz 采样率的 PCM1804还有一个问题、MSP 实际上可以跟上的最大采样率是多少?

    感谢您付出的时间和努力、我非常感谢您的参与。

    -Matt

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

    使用1MHz MCLK 采集(称为) 200k 样本/秒会为每个样本(字)提供5个 CPU 时钟;您不会成功。

    使用25MHz MCLK、每个样本(字)可获得125个 CPU 时钟;这可能足以进行一些简单的算术。