stm32f4discovery - 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 寄存器的命令。我怎样才能做到这一点?我希望你能理解我的问题并能够帮助我。谢谢。
解决方案
据我所知,没有 CR0 和 CR1,但我假设您要锁定的是 CR1 和 CR2。您可以通过设置指向寄存器地址的指针并像这样重新设置取消引用的指针值来读取这些值:
uint32_t *ptr = REGISTER_ADDRESS;
variable = *ptr;
现在variable
应该包含寄存器值,假设您要查找的寄存器是 32 位寄存器。
另一种方法是使用预制的“定义”真实工作室提供来读取这些值,例如:
SPI1->CR1
就我而言,它是 SPI1,但这取决于您的 MCU 有多少个 SPI 以及您使用的是哪个。通常,ST 在其网站上提供的参考手册和/或数据表(每个 MCU 或至少 MCU 系列的特定手册)对于找出寄存器名称和/或其地址非常有帮助。
推荐阅读
- reactjs - 通过引用或值来反应状态变量赋值?
- latex - 在 Latex 中缩进段落的每一行?
- c# - 唤醒方法未启动
- javascript - 使用javascript分析复选框的状态
- javascript - Vue v3 如何能够使用未定义的变量?
- javascript - 如何使用 NestJS 返回 XLSX 响应?
- python - 使用 firebase 和 python(pyrebase) 订购数据
- java - Hibernate 生成器 class="increment" 生成重复的 id
- node.js - 在nodejs中使用ESM导入语法时如何调用构造函数?
- r - 在 Leaflet R 中添加标签/标记而不是弹出窗口