arm - STM32F4 设备上的 SPI 读取失败
问题描述
我正在使用 STM32F4 试图通过 SPI 读取。调试环境是带有 VisualGDB 插件的 Visual Studio。spi 配置如下。8 位帧,MSB 在前,使用 GPIOA/B 作为 SPI 信号
void spiInit() {
RCC->AHB1ENR |= 3; //enable gpioA/B clock
RCC->APB2ENR |= 0x1000; //enable SPI1 clock (bit 12)
// configure A5 for SCLK
GPIOA->MODER &= ~0x00000C00; //clear pin mode for pin 5
GPIOA->MODER |= 0x00000800; //alternate function mode for pin 5
GPIOA->AFR[0] &= ~0x00F00000; //clear alternate mode
GPIOA->AFR[0] |= 0x00500000; //setup pins 5 for AF5
// configure B4 for MISO
GPIOB->MODER &= ~0x00000300; //clear pin mode for pin 4
GPIOB->MODER |= 0x00000200; //alternate function mode for pin 5
GPIOB->AFR[0] &= ~0x000F0000; //clear alternate mode
GPIOB->AFR[0] |= 0x00050000; //setup pins 4 for AF5
// configure B5 for MOSI
GPIOB->MODER &= ~0x00000C00; //clear pin mode for pin 5
GPIOB->MODER |= 0x00000800; //alternate function mode for pin 5
GPIOB->AFR[0] &= ~0x00F00000; //clear alternate mode
GPIOB->AFR[0] |= 0x00500000; //setup pins 5 for AF5
// configure A15 for output SS
GPIOA->MODER &= ~0xC0000000; //clear PA15 function bits
GPIOA->MODER |= 0x40000000; //set PA15 (SS) as output
SPI1->CR1 = 0x31E; //8-bit frames
SPI1->CR2 = 0; //mostly read/status/interrupt config
SPI1->CR1 |= 0x40; //enable SPI1
GPIOA->BSRR = 0x00008000; //deassert SS
}
写入很好,数据已正确加载到从站并且它按预期响应,但是从从站读取不工作。当我查看波形时,我可以看到 MISO 在总线上看起来不错,但没有被 Master 拾取。
经过几次尝试查看 SPI 状态寄存器标志后,(获得上述结果)我正在使用我在另一个 SO 问题(此处)中看到的实用程序函数。数据总是读取 0,我很困惑,代码等待接收缓冲区填充,但读取时似乎什么都没有。
uint8_t SPI_ReadWrite8(SPI_TypeDef *spi, uint8_t data)
{
while(!(spi -> SR & SPI_SR_TXE)); //Wait for tx buffer to empty
*(volatile uint8_t *)&spi->DR = data; //Send data
while (!(spi -> SR & SPI_SR_RXNE)); //Wait for rx buffer to fill
return *(volatile uint8_t *)&spi->DR;
}
任何想法我错过了什么?
解决方案
推荐阅读
- reactjs - vue中的相同功能反应错误
- python - 如果python中的逻辑
- python-3.x - 使用 zipfile 模块对 zip 压缩文件执行 os.walk
- c++ - 如何将 wxTreeItemId 绑定为 sqlite3 数据库中的数据类型?
- node.js - Okta 授权服务器使用自定义域问题
- ios - Swift -Force UITextview 仅小写
- php - 如何在 prestashop 1.7 中更改断点
- java - 为什么应用程序语言只能更改一次?
- pandas - 如何在更改原始列名的同时取消堆叠数据框并添加带后缀的新列?
- clickhouse - 如何比较两个数组并在 Clickhouse 的数组中找到匹配项 (0/1)