c - SPI 在 STM32F103ZE 中读取数据为零

标签 c embedded stm32 spi

我正在使用 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);

此初始化过程与问题中发布的代码有两点不同:

  1. 不要为带有 3 条线 SCK、MISO 和 MOSI 的普通 SPI 选择双向模式。 MISO 和 MOSI 都是单向线。

  2. 我使用硬件从机选择管理,即 SSM 位未设置。这样, SPI 外设可以自动检测设备何时被激活(引脚 NSS变低),并会 将 MOSI 位存储在移位寄存器中。当读取了足够多的位时(8 或 16 取决于所选的数据格式), 在状态寄存器中设置标志 RXNE 并且可以读取传输的值 来自寄存器 DR

希望对您有所帮助。

关于c - SPI 在 STM32F103ZE 中读取数据为零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6922584/

相关文章:

embedded - exp() math.c i c 在循环中不起作用

c - 由于可变排序而导致不同的 RAM 消耗

android - 从 Android 升级 STM32 设备固件 (DFU/DfuSe)

c - 将自动变量的指针传递给 DMA 函数

c - Malloc 尝试寻址 0x0?

关于 C 中 sizeof 运算符的困惑

c - 我想优化这个程序

c++ - TCPdump 在接收数据包时是否去除任何 header ?

c - 将所有处理器能力专用于一项任务

c - 与外部 SPI 闪存通信时是否应该禁用中断?