首页 > 解决方案 > STM32F-Discovery和MAX31856之间的SPI通信问​​题

问题描述

我试图使用 SPI 通信将我的 STM 发现板与 MAX31856 通信。根据数据表,我应该先发送地址字节,然后是数据字节。我目前能够写入寄存器,但是当我尝试读取写入寄存器的数据时,除非我只发送读取命令,否则我无法读取数据。

例如:

http://puu.sh/E2gJD.png 使用此代码,我可以读取默认寄存器值。

http://puu.sh/E2gLC.png 使用此代码,我可以将新值写入 CR0 和 CR1 寄存器。第一个 0x80 值是寄存器 CR0 的地址字节。下一个值是新的寄存器值 0x80 和 0x37。

http://puu.sh/E2gNK.png 我停止了之前的程序并将我的代码更改为这个程序。然后我开始调试。从这张图可以看出,CR0和CR1寄存器的值都变成了我们之前写的。

最后; http://puu.sh/E2gRw.png 当我尝试结合这两个操作,写入和读取时,我无法读取我写入寄存器的内容。需要一些帮助来解决这个问题。

uint8_t spiTXData[17],spiRXData[17],spiTXDataR[17], spiRXDataR[17];

/* USER CODE END 0 */

  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_DAC_Init();
  MX_SPI1_Init();
  /* USER CODE BEGIN 2 */



//    HAL_Delay ( 1 ) ;
//
//      HAL_GPIO_WritePin(GPIOE, GPIO_PIN_3, GPIO_PIN_RESET);
//    spiTXDataR[0] = 0x00;
//    HAL_SPI_TransmitReceive(&hspi1, spiTXDataR, spiRXDataR, 3, 50);
//    HAL_GPIO_WritePin(GPIOE, GPIO_PIN_3, GPIO_PIN_SET);

//    HAL_Delay ( 1 ) ;
    spiTXData[0] = 0x80;
    spiTXData[1] = 0x80;
    spiTXData[2] = 0x37;
    HAL_GPIO_WritePin(GPIOE, GPIO_PIN_3, GPIO_PIN_RESET);
    HAL_SPI_TransmitReceive(&hspi1, spiTXData, spiRXData, 3, 50);
    HAL_GPIO_WritePin(GPIOE, GPIO_PIN_3, GPIO_PIN_SET);

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
        spiTXDataR[0] = 0x00;
        HAL_GPIO_WritePin(GPIOE, GPIO_PIN_3, GPIO_PIN_RESET);
        HAL_SPI_TransmitReceive(&hspi1, spiTXDataR, spiRXDataR, 17, 50);
        HAL_GPIO_WritePin(GPIOE, GPIO_PIN_3, GPIO_PIN_SET);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

我需要能够读取稍后写入 CR0 和 CR1 寄存器的命令。我怎样才能做到这一点?我希望你能理解我的问题并能够帮助我。谢谢。

标签: stm32f4discoverytruestudiostm32cubemx

解决方案


据我所知,没有 CR0 和 CR1,但我假设您要锁定的是 CR1 和 CR2。您可以通过设置指向寄存器地址的指针并像这样重新设置取消引用的指针值来读取这些值:

 uint32_t *ptr = REGISTER_ADDRESS;
 variable = *ptr;

现在variable应该包含寄存器值,假设您要查找的寄存器是 32 位寄存器。

另一种方法是使用预制的“定义”真实工作室提供来读取这些值,例如:

SPI1->CR1

就我而言,它是 SPI1,但这取决于您的 MCU 有多少个 SPI 以及您使用的是哪个。通常,ST 在其网站上提供的参考手册和/或数据表(每个 MCU 或至少 MCU 系列的特定手册)对于找出寄存器名称和/或其地址非常有帮助。


推荐阅读