您好!
我将具有 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 外设接收到的数据的一致性存在一些间歇性问题。 您是否看到过这种问题? 数据损坏和接收字顺序的交换?
谢谢你
布鲁诺