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.

[参考译文] TMS320F28035:在 C2000问题上读取 ADC128S052

Guru**** 2502205 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/847531/tms320f28035-reading-adc128s052-on-c2000-issues

器件型号:TMS320F28035

您好!

我将具有 ADS128S052的 F28035用作 SPI 上的外部 ADC。

我已按如下方式设置 ADC 外设:

CLK_enableSpiaClock (clk);
//根据 TI spruh18g、我们首先清除 SPI SW 复位以强制复位状态
SPI_RESET (SPI);

//主设备
SPI_setMode (SPI、SPI_Mode_Master);

SPI_setClkPhase (SPI、SPI_ClkPhase_Normal);
SPI_setClkPolarity (SPI、SPI_ClkPolarity_OutputFallingEdge_InputRisingEdge);

SPI_setTriWire (SPI、SPI_TriWire_normalFourWire);
SPI_setCharLength (SPI、SPI_CharLength _16_Bits);
SPI_enableTx (SPI);
SPI_setBaudRate (SPI、SPI_B波特 率_LSPCLK_over_eights);

SPI_setPriority (SPI、SPI_Priority_freRun);

// FIFO 部分
SPI_enableTxFifoEnh (SPI);
SPI_resetTxFifo (SPI);
SPI_resetRxFifo (SPI);
SPI_enableTxFifo (SPI);
SPI_enableRxFifo (SPI);
SPI_clearTxFifoInt (SPI);
SPI_clearRxFifoInt (SPI);
SPI_setRxFifoIntLevel (SPI、SPI_FifoLevel_3_words);
SPI_setTxFifoIntLevel (SPI、SPI_FifoLevel_4_words);

//在 PIE 中启用 RX INT
PI_clearInt (self->priv->PIE、PI_GroupNumber_6);
PI_enableInt (self->priv->PIE、PI_GroupNumber_6、PI_InterruptSource_SPIARX);
EALLOW;
self->priv->pie -> SPIRXINTA = hal_SPI_Rx_ISR;
EDIS;
cpu_enableInt(self->priv->cpu, cpu_IntNumber_6);
//启用外设 INT
SPI_enableRxFifoInt (SPI);

SPI_ENABLE (SPI);

hal_SPI_Rx_ISR 如下所示:

uint16_t SPI_Rx_DATA[6];
uint16_t SPI_Rx_round;


__attribute__((ramfunc))静态空 hal_adc_spi_write (struct hal_app * self、uint16_t channel)
{
uint16_t 温度;

温度=通道<<(3 + 8);
SPI_FifoStatus_e 状态;
执行{
状态= SPI_getTxFifoStatus (SPI);
} while (status = SPI_FifoLevel_4_words);
SPI_WRITE (SPI、temp);
}

__attribute__((ramfunc)) static Int32_t hal_adc_spi_read (struct hal_app * self)
{
uint16_t cnt = 10;

SPI_FifoStatus_e 状态;
执行{
状态= SPI_getRxFifoStatus (self->priv->priv->spio->spi);
如果(--cnt = 0){
返回-1;
}
} while (status =SPI_FifoLevel_empty);

返回 SPI_READ (SPI);
}

__attribute__((ramfunc))中断 void hal_SPI_Rx_ISR ()
{
struct hal * hal = hal_inst();
struct hal_app *self = hal->app;
uint16_t 一;
int32_t ADC_val;

对于(I = 0;I < 3;+I){
adc_val = hal_adc_spi_read (self);
如果(ADC_val < 0){
while (1);
}
SPI_Rx_DATA[i]= ADC_val;
}

SPI_clearRxFifoInt (SPI);
PI_clearInt (PIE、PI_GroupNumber_6);
}

__attribute__((ramfunc))静态空 CONTRAL_ISR_callback (struct hal_app * self)
{
int i;
对于(I = 0;I < 3;+I){// 0、1、2
// TODO:调查为什么需要此黑客攻击(它给出1、2、0 ...)
HAL_ADC_SPI_WRITE (SELF、(I + 4)% 3);
}
} 

现在、从 ADC 获取样本的第一个问题可能已经很明显、依次为通道0、1、2、0、我必须按顺序1、2、0 ...

第二 个问题是接收到的样本具有4 LSB 的噪声是 CONTRAL_ISR_CALLBACY() 以10kHz 的速率调用,而如果这是20kHz,则没有噪声 (回调已注册到 PWM 外设的 ISR、该 ISR 将以10kHz 或20kHz 的频率发出)。 有趣的是、这个 LSB 噪声问题不会出现在我们的某些硬件模块上、而是出现在某些硬件模块上(因此这是一个微不足道的问题、例如设置/保持冲突或类似的问题)。

显然、与 SPI 外设接收到的数据的一致性存在一些间歇性问题。 您是否看到过这种问题? 数据损坏和接收字顺序的交换?

谢谢你

布鲁诺

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

    F2803x 以正确的顺序发送通道请求、而外部 ADC 发送的数据不正确吗? 或者、来自 F2803x 的消息是否一开始是不正确的?

    我不确定第二个问题的建议是什么、因为听起来可能是电路板的问题、也可能是 F2803x 本身的问题?

    惠特尼

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

    大家好、我可以为我的同事回答这个问题。

    ADC 具有多个通道、当您发送 SPI 命令时、您会在同一帧中返回请求通道的转换数据。

    这就是 SPI 外设应该执行的操作(不带 FIFO 或中断的伪代码、只是为了演示):

    while (1){
    SPI_WRITE (地址 A);
    dataaa = spi_read();

    SPI_WRITE (地址 B);

    dataB = spi_read ();



    但是、dataaa 将始终包含上一操作(在本例中为 dataB)的结果。

    因此、如果我们在一个周期中仅请求地址 A、则每次您获取 dataaa、但获取'old'样本。 这与我们是否使用 FIFO 无关、而示波器显示时钟恢复的数据确实是正确的数据。

    因此、我们使用 SPI 外设或配置 SPI 外设的方式很可能有问题、但我们却没有发现问题。 配置错误可能会导致我们描述的两个问题(永久数据相位差+偶尔出现毛刺脉冲)。

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

    当您读取数据时、FIFO 级别是什么样的? 由于传输本身看起来正常、我想知道 FIFO 中是否会弹出一个额外的字来导致所有内容发生移位? 尽管即使在不使用 FIFO 的情况下也会发生这种情况、但理论意义更小...

    惠特尼

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

    是否有更新? 您是否能够解决此问题?

    惠特尼