STM32:简单的SPI传输

问题描述

我正在与STM32F3disCOVERY板一起工作,并且试图深入研究HAL的抽象。我制作了一个简单的函数版本,该函数可以通过SPI传输数据,但遗憾的是它不起作用(至少我将其发送到的DAC不会更改状态),而且我不确定在那里缺少什么。初始化代码中可能还有一些不适用于我的简单版本。我很乐意提供任何指导或参考。谢谢!

#include <stm32f3xx_hal.h>

#define PINS_SPI GPIO_PIN_5 | GPIO_PIN_7
#define GPIO_PORT GPIOA

/* This is the simplest function I Could come up with to do the transfer but I'm clearly missing something here */
uint8_t SPI_SendReceive(SPI_HandleTypeDef *hspi,uint8_t data) {
  /* Loop while DR register in not empty */
  while ((hspi->Instance->SR & SPI_FLAG_TXE) == RESET) {
  }

  /* Send data through the SPI1 peripheral */
  hspi->Instance->DR = data;

  /* Wait to receive data */
  while ((hspi->Instance->SR & SPI_FLAG_RXNE) == RESET) {
  }

  return hspi->Instance->DR;
}

int main() {
  HAL_Init();


  __HAL_RCC_GPIOA_CLK_ENABLE();
  __HAL_RCC_SPI1_CLK_ENABLE();

  static SPI_HandleTypeDef spi = {.Instance = SPI1};
  spi.Init.BaudratePrescaler = SPI_BAUdratEPRESCALER_256;
  spi.Init.Direction = SPI_DIRECTION_2LInes;
  spi.Init.CLKPhase = SPI_PHASE_1EDGE;
  spi.Init.CLKPolarity = SPI_POLARITY_LOW;
  spi.Init.CRCCalculation = SPI_CRCCALculaTION_disABLE;
  spi.Init.DataSize = SPI_DATASIZE_8BIT;
  spi.Init.FirstBit = SPI_FirsTBIT_MSB;
  spi.Init.NSS = SPI_NSS_HARD_OUTPUT;
  spi.Init.TIMode = SPI_TIMODE_disABLE;
  spi.Init.Mode = SPI_MODE_MASTER;

  HAL_SPI_Init(&spi);
  __HAL_SPI_ENABLE(&spi);

  GPIO_InitTypeDef GPIO_InitStruct;
  GPIO_InitStruct.Pin = PINS_SPI;
  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  GPIO_InitStruct.Alternate = GPIO_AF5_SPI1;

  HAL_GPIO_Init(GPIOA,&GPIO_InitStruct);

  GPIO_InitStruct.Pin = GPIO_PIN_4;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;

  HAL_GPIO_Init(GPIOA,&GPIO_InitStruct);
  
  /* TI 8564 DAC Settings */
  uint8_t cmd1 = 0b00010000;
  /* DAC output value (16-bit) */
  uint16_t cmd23 = 0;
  uint8_t cmd2 = cmd23 >> 8;
  uint8_t cmd3 = cmd23 & 0xff;

  uint8_t command[3] = {cmd1,cmd2,cmd3};

  while (true) {
    HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_RESET);

    /* This does not work :( */
    SPI_SendReceive(&spi,command[0]);
    SPI_SendReceive(&spi,command[1]);
    SPI_SendReceive(&spi,command[2]);
    
    /* This works! When commenting in the lines above and commenting this out */
    /* HAL_SPI_Transmit(&spi,command,3,HAL_MAX_DELAY); */

    HAL_GPIO_WritePin(GPIOA,GPIO_PIN_SET);

    HAL_Delay(1000);
  }
}

解决方法

检查HAL_SPI_Init的内容。此函数很可能会调用另一个应该进行低级初始化的函数,您有责任自己提供此函数。更复杂的是,这个所谓的第二个函数已经定义了“虚拟”弱别名,因此工具链不会返回任何错误,而只是构建无法执行任何操作的代码。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...