【问题标题】:Unable to communicate with DAC using SPI无法使用 SPI 与 DAC 通信
【发布时间】:2019-08-24 09:46:57
【问题描述】:

我正在尝试使用来自我的 STM32L4 控制器的 SPI 与我的DAC 通信。我基本上想测试 SPI 线路是否工作正常。即我是否能够分别向 DAC 传输数据和从 DAC 接收数据。我已将 DAC 引脚配置如下 -

static void MX_GPIO_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOC_CLK_ENABLE();
  __HAL_RCC_GPIOH_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();
  __HAL_RCC_GPIOB_CLK_ENABLE();

    GPIO_InitStruct.Pin = RST_Pin|M_Z_Pin|TC_SB_Pin|LDAC_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

    GPIO_InitStruct.Pin = PD_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

    GPIO_InitStruct.Pin = SPI3_Chip_Select_DAC_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    /*Configure GPIO pins : READY_Pin LDAC_Pin BUSY_Pin */
  GPIO_InitStruct.Pin = READY_Pin|BUSY_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

    HAL_GPIO_WritePin(RST_GPIO_Port,RST_Pin,GPIO_PIN_SET);
    HAL_GPIO_WritePin(M_Z_GPIO_Port,M_Z_Pin,GPIO_PIN_RESET);
    HAL_GPIO_WritePin(TC_SB_GPIO_Port,TC_SB_Pin,GPIO_PIN_SET);
    HAL_GPIO_WritePin(LDAC_GPIO_Port,LDAC_Pin,GPIO_PIN_RESET);
    HAL_GPIO_WritePin(PD_GPIO_Port,PD_Pin,GPIO_PIN_RESET);
    HAL_GPIO_WritePin(SPI3_Chip_Select_DAC_GPIO_Port,SPI3_Chip_Select_DAC_Pin,GPIO_PIN_SET);



}

我想读取状态寄存器的内容,我必须在 SPI 线上发送 0xC0(如数据表中所述)。作为回报,DAC 返回状态寄存器的内容。所以,我为它写了以下代码-

SPI_HandleTypeDef hspi1;
SPI_HandleTypeDef hspi2;
SPI_HandleTypeDef hspi3;

TIM_HandleTypeDef htim3;

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USB_OTG_FS_USB_Init(void);
static void MX_SPI1_Init(void);
static void MX_SPI2_Init(void);
static void MX_SPI3_Init(void);
static void MX_TIM3_Init(void);
uint8_t received_data[3],Data_to_send[3];
int main(void)
{
  HAL_Init();
  /* Configure the system clock */
  SystemClock_Config();
  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_SPI1_Init();
  MX_SPI2_Init();
  MX_SPI3_Init();
  MX_TIM3_Init();

    while(1)
    {
         HAL_GPIO_WritePin(SPI3_Chip_Select_DAC_GPIO_Port,SPI3_Chip_Select_DAC_Pin,GPIO_PIN_RESET);
     HAL_Delay(1);
     Data_for_try[0]=0xC0;
         HAL_SPI_TransmitReceive(&hspi3,Data_to_send,received_data,3,100);
         HAL_Delay(1);
         HAL_GPIO_WritePin(SPI3_Chip_Select_DAC_GPIO_Port,SPI3_Chip_Select_DAC_Pin,GPIO_PIN_SET);

    }

}

但我无法从 DAC 取回任何数据作为确认。我已经检查了 SPI_CLOCK 和 SPI_MOSI 引脚是否正在使用示波器获取信号。有什么方法可以检查 DAC 是否工作正常?

【问题讨论】:

  • 1.需要原理图。截图就够了。 2. 有输入电压吗?检查所有 VCC 和 GND。 3. 显示MX_SPI2_Init。确保正确配置 CPHACPOL。 4. 测试 SPI 设备的最佳解决方案是位带。模仿数据表中的波形。阅读General Configuration and Status Read Register(第36页)
  • @Stephen Plyaskin - 但在此之前,我的代码逻辑是否正确?我正在尝试向状态寄存器中写入一些内容并从中检索数据。
  • 看来是这样。您正在尝试仅读取 GCSR (0xC)。在HAL_SPI_TransmitReceive 之后,您应该有缓冲区。 SPI LSB MSB 怎么样?同时显示MX_SPI3_Init(不是MX_SPI2_Init)。
  • “我无法从 DAC 获取任何数据作为确认”。你能详细说明一下吗?一旦 SPI 主机激活 SPI 时钟,它将接收来自从机的数据。所以我假设你收到垃圾数据?
  • @GuillaumePetitjean - 不,我没有收到任何数据。

标签: stm32 spi dac


【解决方案1】:

感谢您的支持,但我能够找出问题所在。我必须按如下方式更改 SPI 设置 -

static void MX_SPI3_Init(void)
{
  /* SPI3 parameter configuration*/
  hspi3.Instance = SPI3;
  hspi3.Init.Mode = SPI_MODE_MASTER;
  hspi3.Init.Direction = SPI_DIRECTION_2LINES;
  hspi3.Init.DataSize = SPI_DATASIZE_8BIT;
  hspi3.Init.CLKPolarity = SPI_POLARITY_LOW;
  hspi3.Init.CLKPhase = SPI_PHASE_1EDGE;
  hspi3.Init.NSS = SPI_NSS_SOFT;
  hspi3.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;
  hspi3.Init.FirstBit = SPI_FIRSTBIT_MSB;
  hspi3.Init.TIMode = SPI_TIMODE_DISABLE;
  hspi3.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  hspi3.Init.CRCPolynomial = 7;
  hspi3.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE;
  hspi3.Init.NSSPMode = SPI_NSS_PULSE_ENABLE;
  if (HAL_SPI_Init(&hspi3) != HAL_OK)
  {
    Error_Handler();
  }
}

hspi3.Init.DataSize 被初始化为 SPI_DATASIZE_4BIT 而不是 SPI_DATASIZE_8BIT,这是问题所在。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-27
    • 2021-01-11
    • 2015-09-05
    • 1970-01-01
    • 2021-11-22
    • 2019-06-14
    • 1970-01-01
    相关资源
    最近更新 更多