TI论坛
直播中

张强

7年用户 1373经验值
私信 关注
[问答]

ADS131A04 DOUT信号线电平被拉低的原因?


  • 背景:ADS131A04作为SPI主设备,STM32L471作为SPI从设备,MCU通过SPI+DMA方式获取数据。
    硬件连接:

    MCU的SPI和DMA配置:

    void InitSPI(void){    /* --- INSERT YOUR CODE HERE --- */        hspi1.Instance = SPI1;        hspi1.Init.Mode = SPI_MODE_SLAVE;        hspi1.Init.Direction = SPI_DIRECTION_2LINES;        hspi1.Init.DataSize = SPI_DATASIZE_16BIT;        hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;        hspi1.Init.CLKPhase = SPI_PHASE_2EDGE;        hspi1.Init.NSS = SPI_NSS_HARD_INPUT;        hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;        hspi1.Init.TIMode = SPI_TIMODE_DISABLE;        hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;        hspi1.Init.CRCPolynomial = 7;        hspi1.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE;        hspi1.Init.NSSPMode = SPI_NSS_PULSE_DISABLE;        hspi1.State = HAL_SPI_STATE_RESET;        if (HAL_SPI_Init(&hspi1) != HAL_OK)        {                Error_Handler();        }}void HAL_SPI_MspInit(SPI_HandleTypeDef* spiHandle){  GPIO_InitTypeDef GPIO_InitStruct = {0};  if(spiHandle->Instance==SPI1)  {  /* USER CODE BEGIN SPI1_MspInit 0 */  /* USER CODE END SPI1_MspInit 0 */    /* SPI1 clock enable */    __HAL_RCC_SPI1_CLK_ENABLE();    __HAL_RCC_GPIOA_CLK_ENABLE();    /**SPI1 GPIO Configuration    PA4     ------> SPI1_NSS    PA5     ------> SPI1_SCK    PA6     ------> SPI1_MISO    PA7     ------> SPI1_MOSI    */    GPIO_InitStruct.Pin = ADS131A04_SPI1_NSS_Pin|ADS131A04_SPI1_CLK_Pin|ADS131A04_SPI1_MISO_Pin|ADS131A04_SPI1_MOSI_Pin;        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;        GPIO_InitStruct.Pull = GPIO_NOPULL;        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;        GPIO_InitStruct.Alternate = GPIO_AF5_SPI1;        HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);    /* SPI1 DMA Init */    /* SPI1_TX Init */    hdma_spi1_tx.Instance = DMA2_Channel4;    hdma_spi1_tx.Init.Request = DMA_REQUEST_4;    hdma_spi1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;    hdma_spi1_tx.Init.PeriphInc = DMA_PINC_DISABLE;    hdma_spi1_tx.Init.MemInc = DMA_MINC_ENABLE;    hdma_spi1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;    hdma_spi1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;    hdma_spi1_tx.Init.Mode = DMA_NORMAL;    hdma_spi1_tx.Init.Priority = DMA_PRIORITY_LOW;    if (HAL_DMA_Init(&hdma_spi1_tx) != HAL_OK)    {      Error_Handler();    }    __HAL_LINKDMA(spiHandle,hdmatx,hdma_spi1_tx);    /* SPI1_RX Init */    hdma_spi1_rx.Instance = DMA2_Channel3;    hdma_spi1_rx.Init.Request = DMA_REQUEST_4;    hdma_spi1_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;    hdma_spi1_rx.Init.PeriphInc = DMA_PINC_DISABLE;    hdma_spi1_rx.Init.MemInc = DMA_MINC_ENABLE;    hdma_spi1_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;    hdma_spi1_rx.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;    hdma_spi1_rx.Init.Mode = DMA_NORMAL;    hdma_spi1_rx.Init.Priority = DMA_PRIORITY_LOW;    if (HAL_DMA_Init(&hdma_spi1_rx) != HAL_OK)    {      Error_Handler();    }    __HAL_LINKDMA(spiHandle,hdmarx,hdma_spi1_rx);    /* SPI1 interrupt Init */    //HAL_NVIC_SetPriority(SPI1_IRQn, 0, 0);    //HAL_NVIC_EnableIRQ(SPI1_IRQn);  /* USER CODE BEGIN SPI1_MspInit 1 */  /* USER CODE END SPI1_MspInit 1 */  }}问题:ADC上电后,DOUT管脚一开始正常输出0xFF04,但是MCU初始化使能SPI后DOUT信号线电平被拉低,DOUT信号线上拉电阻试过100k,10k以及去掉上拉电阻,依然都是被拉低,可能是什么原因?


回帖(2)

夏日余晖

2024-11-20 16:07:45
[list]
[*]背景:ADS131A04作为SPI主设备,STM32L471作为SPI从设备,MCU通过SPI+DMA方式获取数据。
硬件连接:
[img]https://file1.elecfans.com/web2/M00/FF/A0/wKgZomapt-WAagD-AAA_evVnk9w786.jpg[/img]
MCU的SPI和DMA配置:

void InitSPI(void){    /* --- INSERT YOUR CODE HERE --- */        hspi1.Instance = SPI1;        hspi1.Init.Mode = SPI_MODE_SLAVE;        hspi1.Init.Direction = SPI_DIRECTION_2LINES;        hspi1.Init.DataSize = SPI_DATASIZE_16BIT;        hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;        hspi1.Init.CLKPhase = SPI_PHASE_2EDGE;        hspi1.Init.NSS = SPI_NSS_HARD_INPUT;        hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;        hspi1.Init.TIMode = SPI_TIMODE_DISABLE;        hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;        hspi1.Init.CRCPolynomial = 7;        hspi1.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE;        hspi1.Init.NSSPMode = SPI_NSS_PULSE_DISABLE;        hspi1.State = HAL_SPI_STATE_RESET;        if (HAL_SPI_Init(&hspi1) != HAL_OK)        {                Error_Handler();        }}void HAL_SPI_MspInit(SPI_HandleTypeDef* spiHandle){  GPIO_InitTypeDef GPIO_InitStruct = {0};  if(spiHandle->Instance==SPI1)  {  /* USER CODE BEGIN SPI1_MspInit 0 */  /* USER CODE END SPI1_MspInit 0 */    /* SPI1 clock enable */    __HAL_RCC_SPI1_CLK_ENABLE();    __HAL_RCC_GPIOA_CLK_ENABLE();    /**SPI1 GPIO Configuration    PA4     ------> SPI1_NSS    PA5     ------> SPI1_SCK    PA6     ------> SPI1_MISO    PA7     ------> SPI1_MOSI    */    GPIO_InitStruct.Pin = ADS131A04_SPI1_NSS_Pin|ADS131A04_SPI1_CLK_Pin|ADS131A04_SPI1_MISO_Pin|ADS131A04_SPI1_MOSI_Pin;        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;        GPIO_InitStruct.Pull = GPIO_NOPULL;        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;        GPIO_InitStruct.Alternate = GPIO_AF5_SPI1;        HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);    /* SPI1 DMA Init */    /* SPI1_TX Init */    hdma_spi1_tx.Instance = DMA2_Channel4;    hdma_spi1_tx.Init.Request = DMA_REQUEST_4;    hdma_spi1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;    hdma_spi1_tx.Init.PeriphInc = DMA_PINC_DISABLE;    hdma_spi1_tx.Init.MemInc = DMA_MINC_ENABLE;    hdma_spi1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;    hdma_spi1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;    hdma_spi1_tx.Init.Mode = DMA_NORMAL;    hdma_spi1_tx.Init.Priority = DMA_PRIORITY_LOW;    if (HAL_DMA_Init(&hdma_spi1_tx) != HAL_OK)    {      Error_Handler();    }    __HAL_LINKDMA(spiHandle,hdmatx,hdma_spi1_tx);    /* SPI1_RX Init */    hdma_spi1_rx.Instance = DMA2_Channel3;    hdma_spi1_rx.Init.Request = DMA_REQUEST_4;    hdma_spi1_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;    hdma_spi1_rx.Init.PeriphInc = DMA_PINC_DISABLE;    hdma_spi1_rx.Init.MemInc = DMA_MINC_ENABLE;    hdma_spi1_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;    hdma_spi1_rx.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;    hdma_spi1_rx.Init.Mode = DMA_NORMAL;    hdma_spi1_rx.Init.Priority = DMA_PRIORITY_LOW;    if (HAL_DMA_Init(&hdma_spi1_rx) != HAL_OK)    {      Error_Handler();    }    __HAL_LINKDMA(spiHandle,hdmarx,hdma_spi1_rx);    /* SPI1 interrupt Init */    //HAL_NVIC_SetPriority(SPI1_IRQn, 0, 0);    //HAL_NVIC_EnableIRQ(SPI1_IRQn);  /* USER CODE BEGIN SPI1_MspInit 1 */  /* USER CODE END SPI1_MspInit 1 */  }}问题:ADC上电后,DOUT管脚一开始正常输出0xFF04,但是MCU初始化使能SPI后DOUT信号线电平被拉低,DOUT信号线上拉电阻试过100k,10k以及去掉上拉电阻,依然都是被拉低,可能是什么原因?

[font=inherit][img]https://file1.elecfans.com/web2/M00/FF/A0/wKgZomapt-eABvbNAAEJz9FbCeA735.jpg[/img][/font]
[/list]
举报

廖阿朋

2024-11-20 17:48:56
在您提供的背景信息中,ADS131A04作为SPI主设备,STM32L471作为SPI从设备,通过SPI+DMA方式获取数据。DOUT信号线电平被拉低可能有以下几个原因:

1. 硬件连接问题:请检查ADS131A04和STM32L471之间的硬件连接是否正确,包括SPI接口的MISO、MOSI、SCK、CS等信号线是否正确连接。如果连接错误或接触不良,可能导致DOUT信号线电平异常。

2. SPI配置问题:请检查STM32L471的SPI配置是否正确。根据您的代码,您已经设置了SPI_MODE_SLAVE、SPI_DIRECTION_2LINES和SPI_DATASIZE_16BIT。请确保这些配置与ADS131A04的SPI配置相匹配。如果配置不匹配,可能导致DOUT信号线电平异常。

3. DMA配置问题:请检查STM32L471的DMA配置是否正确。确保DMA通道、优先级、数据宽度等参数设置正确,以便正确地从SPI接口读取数据。

4. ADS131A04配置问题:请检查ADS131A04的配置是否正确。确保其SPI接口配置与STM32L471相匹配,并且其输出数据格式、速率等参数设置正确。

5. 电源问题:请检查ADS131A04和STM32L471的电源供应是否稳定。不稳定的电源可能导致DOUT信号线电平异常。

6. 干扰问题:请检查系统中是否存在电磁干扰,这可能影响DOUT信号线的电平。如果存在干扰,可以尝试使用屏蔽线或增加滤波器来减少干扰。

综上所述,DOUT信号线电平被拉低的原因可能有很多。建议您逐一排查上述可能的原因,以找到问题的根本所在。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分