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.

[参考译文] TM4C1294NCPDT:ADC 采样率设置和 i2c 数据

Guru**** 1797640 points
Other Parts Discussed in Thread: TIDM-TM4C129POEAUDIO
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/575007/tm4c1294ncpdt-adc-sample-rate-set-and-i2c-data

器件型号:TM4C1294NCPDT
主题中讨论的其他器件:TIDM-TM4C129POEAUDIO

大家好、

plz 帮助我解决我的问题。

1-如何设置 ADC 时钟速度? 我能否为 ADC0和 ADC1配置不同的采样率?

2-我正在将 ADC0 & ADC1用于序列发生器0,当启用 DMA 以将数据从 FIFO 获取到全局缓冲区时,我会为两个 ADC 获得相同的值。

3 -我在从模式下使用 I2C。 我从主器件接收到正确的数据、但当我向主器件发送数据时、它将无法正常工作、我可以为其做什么。

谢谢你。  

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

    ADC 时钟速度通过使用 ADCClockConfigSet API 调用进行配置。 要设置不同的采样率、具体取决于触发 ADC 的方式。 这是您在此处未提及的内容。
    不能将 ADC0和 ADC1用于 Sequencer0。 每个 ADC 都有自己的序列发生器。
    对于 I2C 问题、您需要检查用于发送数据的函数、并将其与示波器或 LA 上的总线值进行比较。 同样、没有代码可关联您遇到的问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Amit、您好!

    1 -我通过配置了系统时钟

    SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz |SYSCTL_OSC_MAIN | SYSCTL_USE_PLL |
    SYSCTL_CFG_VCO_480)、120000000);

    和 DMA 配置

    #define MEM_buffer_size 8.

    静态 uint32_t g_ui32Src3ABuf[MEM_buffer_size];
    静态 uint32_t g_ui32Src0BBuf[MEM_buffer_size];
    静态 uint32_t g_ui32Src3ABuf[MEM_buffer_size];
    静态 uint32_t g_ui32Src0BBuf[MEM_buffer_size]

    SysCtlPeripheralEnable (SYSCTL_Periph_ADC0);
    SysCtlPeripheralEnable (SYSCTL_Periph_ADC1);
    ADCClockConfigSet (ADC0_BASE、ADC_CClock_SRC_ALTCLK | ADC_CClock_RATE_FULL、8);
    ADCClockConfigSet (ADC1_base、ADC_CClock_SRC_PLL | ADC_CClock_RATE_FULL、8);
    SysCtlPeripheralEnable (SYSCTL_Periph_UDMA);

    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB);
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOD);
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOE);

    GPIOPinTypeADC (GPIO_Porte _BASE、GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 |GPIO_PIN_3);
    GPIOPinTypeADC (GPIO_PORTD_base、GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 |GPIO_PIN_7);
    GPIOPinTypeADC (GPIO_Porte _BASE、GPIO_PIN_4 | GPIO_PIN_5);
    GPIOPinTypeADC (GPIO_PORTB_BASE、GPIO_PIN_4 | GPIO_PIN_5);
    GPIOPinTypeADC (GPIO_PORTD_base、GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 |GPIO_PIN_3);

    ADCSequenceStepConfigure (ADC0_BASE、0、0、ADC_CTL_CH0);
    ADCSequenceStepConfigure (ADC0_BASE、0、1、ADC_CTL_CH1);
    ADCSequenceStepConfigure (ADC0_BASE、0、2、ADC_CTL_CH2);
    ADCSequenceStepConfigure (ADC0_BASE、0、3、ADC_CTL_CH3);
    ADCSequenceStepConfigure (ADC0_BASE、0、4、ADC_CTL_CH4);
    ADCSequenceStepConfigure (ADC0_BASE、0、5、ADC_CTL_CH5);
    ADCSequenceStepConfigure (ADC0_BASE、0、6、ADC_CTL_CH6);
    ADCSequenceStepConfigure (ADC0_BASE、0、7、ADC_CTL_CH7 | ADC_CTL_END);
    ADCSequenceStepConfigure (ADC1_base、0、0、ADC_CTL_CH8);
    ADCSequenceStepConfigure (ADC1_base、0、1、ADC_CTL_CH9);
    ADCSequenceStepConfigure (ADC1_base、0、2、ADC_CTL_CH10);
    ADCSequenceStepConfigure (ADC1_base、0、3、ADC_CTL_CH11);
    ADCSequenceStepConfigure (ADC1_base、0、4、ADC_CTL_CH12);
    ADCSequenceStepConfigure (ADC1_base、0、5、ADC_CTL_CH13);
    ADCSequenceStepConfigure (ADC1_base、0、6、ADC_CTL_CH14);
    ADCSequenceStepConfigure (ADC1_base、0、7、ADC_CTL_CH15 | ADC_CTL_END);

    ADCSequenceConfigure (ADC0_BASE、0、ADC_TRIGGER_ALE一直、0);
    ADCSequenceConfigure (ADC1_base、0、ADC_TRIGGER_ALE一直、1);

    ADCReferenceSet (ADC0_BASE、ADC_REF_EXT_3V);
    ADCReferenceSet (ADC1_base、ADC_REF_EXT_3V);
    ADCSequenceEnable (ADC0_BASE、0);
    ADCSequenceEnable (ADC1_BASE、0);

    uDMAEnable();
    uDMAControlBaseSet (udmaCtrlTable);

    uDMAChannelAssign (UDMA_CH24_ADC1_0);

    ADCSequenceDMAEnable (ADC0_BASE、0);
    ADCSequenceDMAEnable (ADC1_BASE、0);

    // uDMAChannelAttributeDisable (UDMA_CHANGE_ADC0、UDMA_ATTR_ALL);
    // uDMAChannelAttributeDisable (UDMA_SEC_CHANGE_ADC10、UDMA_ATTR_ALL);
    // uDMAChannelAttributeEnable (UDMA_CHANGE_ADC0、UDMA_ATTR_USEBURST);
    // uDMAChannelAttributeEnable (UDMA_SEC_CHANGE_ADC10、UDMA_ATTR_USEBURST);

    uDMAChannelControlSet (UDMA_CHANNEL_ADC0 | UDMA_PRI_SELECT、UDMA_SIZE 32 | UDMA_SRC_INC_NONE | UDMA_DST_ARC_32 | UDMA_INC_1);
    uDMAChannelControlSet (UDMA_CHANNEL_ADC0 | UDMA_ALT_SELECT、UDMA_SIZE_32 | UDMA_SRC_INC_NONE | UDMA_DST_ARC_32 | UDMA_INC_1);
    uDMAChannelControlSet (UDMA_SEC_CHANNEL_ADC10 | UDMA_PRI_SELECT、UDMA_SIZE_32 | UDMA_SRC_INC_NONE | UDMA_DST_INC_32 | UDMA_ARB_1);
    uDMAChannelControlSet (UDMA_SEC_CHANNEL_ADC10 | UDMA_ALT_SELECT、UDMA_SIZE_32 | UDMA_SRC_INC_NONE | UDMA_DST_INC_32 | UDMA_ARB_1);

    uDMAChannelEnable (UDMA_CHANGE_ADC0);
    uDMAChannelEnable (UDMA_SEC_CHANGE_ADC10);

    uDMAChannelTransferSet (UDMA_CHANGE_ADC0 | UDMA_PRI_SELECT、UDMA_MODE_PINGONG、(void *)(ADC0_BASE + ADC_O_SSFIFO0)、g_ui32SNABuf、sizeof (g_ui32SrcBABuf);
    uDMAChannelTransferSet (UDMA_CHANGE_ADC0 | UDMA_ALT_SELECT、UDMA_MODE_PINGONG、(void *)(ADC0_BASE + ADC_O_SSFIFO0)、g_ui32Src0BBuf、sizeof (g_ui32Src0BBuf));
    uDMAChannelTransferSet (UDMA_SEC_CHANGE_ADC10 | UDMA_PRI_SELECT、UDMA_MODE_PINGONG、(void *)(ADC1_BASE+ADC_O_SSFIFO0)、g_ui32Src1ABuf、sizeof (g_ui32Src1ABuf);
    uDMAChannelTransferSet (UDMA_SEC_CHANGE_ADC10 | UDMA_ALT_SELECT、UDMA_MODE_PINGONG、(void *)(ADC1_BASE+ADC_O_SSFIFO0)、g_ui32Src1BBuf、sizeof (g_ui32Src1BBuf);

    uDMAChannelRequest (UDMA_CHANGE_ADC0);
    uDMAChannelRequest (UDMA_SEC_CHANGE_ADC10);

    ADCIntEnableEx (ADC0_BASE、ADC_INT_DMA_SS0);
    ADCIntEnableEx (ADC1_base、ADC_INT_DMA_SS0);
    ADCIntEnable (ADC0_BASE、0);
    ADCIntEnable (ADC1_BASE、0);
    IntEnable (INT_ADC0SS0);
    IntEnable (INT_ADC1SS0);

    IntEnable (INT_UDMA);

    这将提供 ADC 数据、但始终不正确。 这是否有任何错误?

    我尝试了很多次、但从未得到正确的结果  

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

    首先、将突发大小更改为8、以便一次性从序列发生器读取数据、而不是仲裁每个数据。

    当您提到 ADC 数据始终不正确时、请解释您是如何检查的。 您是否在测试期间提供静态输入?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我正在调试中读取数据。

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

    是的、没错。 此外、在调试此类问题时、请确保您有2个地方、即激励和控制

    此处未将输入信号定义为静态值或不断变化的值。 始终具有静态值、因此结果是固定的
    2.不要总是触发导致您无法控制转换,而是使用处理器或 GPIO 触发器之类的东西,在调试期间可以在其中控制触发器。

    请查看 TIDM-TM4C129POEAUDIO 中应用驱动程序中的软件文件。

    当 ADCClockConfigSet 用于 ADC1时、您使用的是 PLL。 除以8会出现问题、具体取决于哪个 TIVaWare 版本。 如果使用 TivaWare 2.1.2或更早版本、则会导致 ADC 的频率为60MHz、超出规格。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Amit、您好!

    1 -如果我可以将 Trigger 更改为处理器、那么这将取决于软件而不是硬件、我需要使用触发器_always。

    2-我使用的是 TIWAware 的早期版本。 此设计中有任何其他更改。 我可以将触发级别更改为处理器、但并非总是如此。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Prateek

    如果您的应用程序不工作、则调试要求将示例代码细分为更简单、更易于管理的块。 我只能提供有关如何调试相同内容的建议。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Amit、您好!

    我也会采纳您对我们的应用的建议。 我正在尝试许多事情、通过这些事情我可以完成大部分设计、但该部件无法正常工作。

    只需查看一下这个
    uDMAChannelControlSet (UDMA_SEC_CHANNEL_ADC10 | UDMA_PRI_SELECT、UDMA_SIZE_32 | UDMA_SRC_INC_NONE | UDMA_DST_INC_32 | UDMA_ARB_8);

    在中、源地址将递增或目标地址。

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

    由于源是 ADC 的 FIFO 寄存器、因此它"必须"不会递增。 目标地址可以递增32或16位、因为要读取12位数据。 传输的大小也可以是16位。