我正在使用 STM32F103ZE 我没有正确获取 SPI 数据。 Master 传输正确。 但在已发送非零值的情况下始终读取为零。
主配置:(MSP430)
The master configuration is correct. (I tested it.) Master Mode, MSB First, 8-bit SPI, Inactive state is high, SS grounded, 1 MHz clock, no dividers
从机配置(STM32F103ZE)
Using SPI2. SPI_InitStructure.SPI_Direction = SPI_Direction_1Line_Rx SPI_InitStructure.SPI_Mode = SPI_Mode_Slave SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b SPI_InitStructure.SPI_CPOL = SPI_CPOL_High SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge SPI_InitStructure.SPI_NSS = SPI_NSS_Soft SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2 SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB SPI_InitStructure.SPI_CRCPolynomial = 7
谁有答案,
谢谢 哈里
最佳答案
我知道,这个问题很老了。尽管如此,由于我最近几天遇到了同样的问题,我会尽力为 future 的读者提供答案。
以下代码在STM32F407上运行,用在STM32发现板上。我从数据表中可以看出,SPI 外设与 STM32F103 上的相同,所以 我希望代码无需修改即可在其他微 Controller 上运行。
#include "stm32f4xx.h"
[... configure the pins SCK, MISO, MOSI and NSS ...]
// Configure the SPI as: Slave, 8 bit data, clock high when idle, capture on
// 1st edge, baud rate prescaler 2, MSB first.
SPI1->CR1 = SPI_CR1_CPOL;
// No interrupts, no DMA and Motorola frame format.
SPI1->CR2 = 0;
// Enable the peripheral.
SPI1->CR1 |= SPI_CR1_SPE;
// Wait until some data has been sent to the slave and print it.
while ((SPI1->SR & SPI_SR_RXNE) == 0);
printf("Received: %d\n", SPI1->DR);
此初始化过程与问题中发布的代码有两点不同:
不要为带有 3 条线 SCK、MISO 和 MOSI 的普通 SPI 选择双向模式。 MISO 和 MOSI 都是单向线。
我使用硬件从机选择管理,即
SSM
位未设置。这样, SPI 外设可以自动检测设备何时被激活(引脚 NSS变低),并会 将 MOSI 位存储在移位寄存器中。当读取了足够多的位时(8 或 16 取决于所选的数据格式), 在状态寄存器中设置标志RXNE
并且可以读取传输的值 来自寄存器DR
。
希望对您有所帮助。
关于c - SPI 在 STM32F103ZE 中读取数据为零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6922584/