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.

[参考译文] TMS320F280039C:ADS7038:无法接收正确的数据

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1344163/tms320f280039c-ads7038-unable-to-receive-correct-data

器件型号:TMS320F280039C
主题中讨论的其他器件:ADS7038

您好!  
我正在使用 ADS7038和 TMS39C 控制器读取7个模拟信号。

黄色突出显示的引脚毫无响应地变为高电平。  

ADS7038 SPI 初始化函数:

void SPI_init(){
	PFC_SPI_init();
}

void PFC_SPI_init(){
	SPI_disableModule(PFC_SPI_BASE);
	SPI_setConfig(PFC_SPI_BASE, DEVICE_LSPCLK_FREQ, SPI_PROT_POL0PHA1,
				  SPI_MODE_CONTROLLER, 1000000, 8);
	SPI_setPTESignalPolarity(PFC_SPI_BASE, SPI_PTE_ACTIVE_LOW);
	SPI_enableFIFO(PFC_SPI_BASE);
	SPI_disableLoopback(PFC_SPI_BASE);
	SPI_setEmulationMode(PFC_SPI_BASE, SPI_EMULATION_FREE_RUN);
	SPI_enableModule(PFC_SPI_BASE);
}

static const uint16_t ADC_Sys_Ex_StartupConfig_a16 [] = {
        ADC_EXT_WR_REG,0x10,0x00, /* Disable a current on going conversion. */
        ADC_EXT_WR_REG,0x01,0x00, /* Reset the configuration at [. */
        ADC_EXT_WR_REG,0x02,0x10, /* Append a 4-bit channel ID to the measured data. */
        ADC_EXT_WR_REG,0x03,0x00, /* Oversampling is deactivated. */
        ADC_EXT_WR_REG,0x04,0x00, /* 1 MHz sample rate + Auto sequence mode. */
        ADC_EXT_WR_REG,0x05,0xC3, /* CH0,CH1,CH6,CH7 configured as Digital and CH2,3,4,5 are configured as Analog*/
        ADC_EXT_WR_REG,0x12,0x7F, /* CH0, CH1, CH2, CH3, CH4, CH5 and CH6  are enabled for the auto sequence mode. */
        ADC_EXT_WR_REG,0x10,0x11, /* Start the auto sequence mode. */
};


static const uint16_t ADC_Sys_Ex_StartupConfigReadback_a16 [] = {
        ADC_EXT_RD_REG,0x10,0x00, /* Disable a current on going conversion. */
        ADC_EXT_RD_REG,0x01,0x00, /* Reset the configuration at startupd. */
        ADC_EXT_RD_REG,0x02,0x00, /* Append a 4-bit channel ID to the measured data. */
        ADC_EXT_RD_REG,0x03,0x00, /* Oversampling is deactivated. */
        ADC_EXT_RD_REG,0x04,0x00, /* 1 MHz sample rate + Auto sequence mode. */
        ADC_EXT_RD_REG,0x05,0x00, /* All channels are configured as analog input. */
        ADC_EXT_RD_REG,0x12,0x00, /* CH0, CH1, CH2 and CH3 are enabled for the auto sequence mode. */
        0x00,0x00,0x00            /* One additional row with dummy data to read out the last register. */
};

static uint16_t ADC_Sys_Ex_StartupConfig_Length_u16 = 8u;
static uint16_t ADC_Sys_Ex_StartupConfigReadback_Length_u16 = 8u;

void ADC_ExternalInit( void )
{
        uint16_t i = 0;
        static uint16_t tmp_Error_uint16_t = FALSE;

        /* Write the configuration of the external ADC, instead of the last entry, that is activating the auto sequence mode. */
        for ( i=0 ;i < ( ADC_Sys_Ex_StartupConfig_Length_u16 - 1u );i++ )
        {
                SPI_transmitNBytes(SPIB_BASE,(uint16_t *)&ADC_Sys_Ex_StartupConfig_a16[i*3], (uint16_t)3, (uint16_t)0);

        }

        /* Readback the registers hat has been previously written to ensure the correct operation. */
        for ( i=0;i<ADC_Sys_Ex_StartupConfigReadback_Length_u16;i++ )
        {
                /* Write three times eight bit = 24-Bits in total. */
            SPI_transmitNBytes(SPIB_BASE,(uint16_t *)&ADC_Sys_Ex_StartupConfigReadback_a16[i*3], 3, 0);

            if ( i >= 1u )
            {
                if ((SPI_M_READ_BUFFER) != ADC_Sys_Ex_StartupConfig_a16[((i-1u)*3u)+2u] << 16 )
                {
                    tmp_Error_uint16_t = TRUE;
                }
            }
        }

        /* Check if an error is present during the external ADC setup. */
        if ( tmp_Error_uint16_t == ( uint16_t ) TRUE )
        {
                ADC_Sys_Ex_ADCInit_uint16_t = FALSE;

        }
        else
        {
                ADC_Sys_Ex_ADCInit_uint16_t = TRUE;
                /* Activate the auto sequence mode at the end of the init phase. */
                SPI_transmitNBytes(SPIB_BASE,(uint16_t *)&ADC_Sys_Ex_StartupConfig_a16[(ADC_Sys_Ex_StartupConfig_Length_u16-1u)*3u], 3, 0);

        }
}


为16位字进行 SPI RE 初始化、模式0:

void PFC_SPI_Cyclic_init (){
SPI_disableModule (PFC_SPI_BASE);
SPI_setConfig (PFC_SPI_BASE、DEVICE_LSPCLK_FREQ、SPI_PROT_POL0PHA0、
SPI_MODE_CONTROLLER、PFC_SPI_bitrate_cyclone_init、16);
SPI_setPTESignalPolarity (PFC_SPI_BASE、SPI_PTE_ACTIVE_LOW);
SPI_enableFIFO (PFC_SPI_BASE);
SPI_setFIFOInterruptLevel (PFC_SPI_base、SPI_FIFO_TXEMPTY、SPI_FIFO_RX1);
SPI_clearInterruptStatus (PFC_SPI_base、SPI_INT_RXFF);
SPI_enableInterrupt (PFC_SPI_BASE、SPI_INT_RXFF);
SPI_disableLoopback (PFC_SPI_base);
SPI_setEmulationMode (PFC_SPI_BASE、SPI_emulation_free_run);
SPI_enableModule (PFC_SPI_BASE);

已配置 DMA:

void PFC_SPI_RX_DMA_init (){
DMA_setEmulationMode (dma_emulation_free_run);
DMA_configAddresses (PFC_SPI_RX_DMA_base、RDATA、PFC_SPI_RX_DMA_ADDRESS);
DMA_configBurst (PFC_SPI_RX_DMA_BASE、1U、0、1);
DMA_configTransfer (PFC_SPI_RX_DMA_BASE、1U、0、0);
DMA_configWrap (PFC_SPI_RX_DMA_BASE、65535U、065535U、0);
DMA_CONFIGMode (PFC_SPI_RX_DMA_BASE、PFC_SPI_RX_DMA_TRIGGER、DMA_CFG_OneShot _ENABLE | DMA_CFG_CONTINUOUSE_ENABLE | DMA_CFG_SIZE_16BIT);
DMA_enableTrigger (PFC_SPI_RX_DMA_BASE);
dma_startChannel (PFC_SPI_RX_dma_BASE);

void SPIB_CONTROL_TX_DMA_INIT (){
DMA_setEmulationMode (dma_emulation_free_run);
dma_configAddresses (SPIB_CONTROL_TX_DMA_BASE、dma_SPI_Tx_DestAddress、srcAddr);
DMA_configBurst (SPIB_CONTROL_TX_DMA_BASE、1U、0、0);
DMA_configTransfer (SPIB_CONTROL_TX_DMA_BASE、1U、0、0);
DMA_configWrap (SPIB_CONTROL_TX_DMA_BASE、65535U、065535U、0);
DMA_CONFIGMode (SPIB_CONTROL_TX_DMA_BASE、DMA_TRIGGER_TINT0、DMA_CFG_OneShot_ENABLE | DMA_CFG_CONTINUOUSE_ENABLE | DMA_CFG_SIZE_16BIT);
DMA_enableTrigger (SPIB_CONTROL_TX_DMA_BASE);
dma_startChannel (SPIB_CONTROL_TX_dma_BASE);

 我已配置了2个 DMA 通道、其中1个用于在计时器中断到 TX_buff 时每100us 发送一次数据、另一个用于将数据从 RX_buff 接收到 UNION 变量。 根据通道 ID、我将检索数据并在其相应的变量中对其进行采样。

用于将 ADC 计数分配到 RESP 的代码。 变量

/* Defines for the channel IDs of the external ADC. */
#define ADC_PFC_DISCHARGE_EN_ID       0
#define REL_ADC_STATUS_ID             1
#define PFC_NTC1_ID                   2
#define PFC_NTC2_ID                   3
#define PFC_ADC_VOUT_MEAS_ID          4
#define PFC_ADC_VAC_LINE_MEAS_ID      5
#define ADC_REL_DRI_EN_ID             6

void ADC_ReadExternalResults ( void )
{
    /* Read the results of the external ADC and map it to the corresponding variable. */
    /* Map the results of the external ADC to the corresponding structure. */
    switch ( ex_ADC_Rx_Data.EAdcResults_st.id_u16 )
    {
    case ADC_PFC_DISCHARGE_EN_ID:
        Test_Adc_PFC_DISCHARGE_EN_count = ex_ADC_Rx_Data.EAdcResults_st.result_u16;
        break;
    case REL_ADC_STATUS_ID:
        Test_Rel_ADC_STATUS_count = ex_ADC_Rx_Data.EAdcResults_st.result_u16;
        break;
    case PFC_NTC1_ID:
        Test_PFC_Ntc1_count = ex_ADC_Rx_Data.EAdcResults_st.result_u16;
        break;
    case PFC_NTC2_ID:
        Test_PFC_Ntc2_count = ex_ADC_Rx_Data.EAdcResults_st.result_u16;
        break;
    case PFC_ADC_VOUT_MEAS_ID:
        Test_PFC_Adc_VOUT_MEAS_count = ex_ADC_Rx_Data.EAdcResults_st.result_u16;
        break;
    case PFC_ADC_VAC_LINE_MEAS_ID:
        Test_PFC_Adc_VAC_LINE_MEAS_count = ex_ADC_Rx_Data.EAdcResults_st.result_u16;
        break;
    case ADC_REL_DRI_EN_ID:
        Test_ADC_Rel_DRI_EN_count = ex_ADC_Rx_Data.EAdcResults_st.result_u16;
        break;
    default:
        /* Nothing to do in this case. */
        break;
    }

}

while (1)

{

ADC_ReadExternalResults ();

通过 CAN 发送 VOUT 和 VAC。
canDataVar1[0]=(uint8_t)((Test_PFC_ADC_VAC_LINE_MEAS_COUNT >>24U)& 0x000000FFU);
canDataVar1[1]=(uint8_t)((Test_PFC_ADC_VAC_LINE_MEAS_COUNT >> 16U)和0x000000FFU);
canDataVar1[2]=(uint8_t)((Test_PFC_ADC_VAC_LINE_MEAS_COUNT >> 8U)和0x000000FFU);
canDataVar1[3]=(uint8_t)((Test_PFC_ADC_VAC_LINE_MEAS_COUNT)和0x000000FFU);
canDataVar1[4]=(uint8_t)((PFC_ADC_VAC_LINE_MEAS_u32 >> 24U)和0x000000FFU);
canDataVar1[5]=(uint8_t)((PFC_ADC_VAC_LINE_MEAS_u32 >> 16U)和0x000000FFU);
canDataVar1[6]=(uint8_t)((PFC_ADC_VAC_LINE_MEAS_u32 >> 8U)和0x000000FFU);
canDataVar1[7]=(uint8_t)((PFC_ADC_VAC_LINE_MEAS_u32)& 0x000000FFU);

can_sendMessage (cana_base、1U、8U、(uint16_t *)&canDataVar1[0]);




在这里、输入为2048个计数、可以得到正确显示、但随机将引脚上拉至5V、您可以提供帮助吗?

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

    您好!

    我们的 专家正在度假。 请预计下周前回复。

    谢谢。此致、

    拉杰什怀特