主题中讨论的其他器件: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、您可以提供帮助吗?