【问题标题】:SPI is reading data as zero in STM32F103ZESPI 在 STM32F103ZE 中读取数据为零
【发布时间】:2011-10-18 20:26:26
【问题描述】:

我正在使用 STM32F103ZE 我没有正确获取 SPI 数据。 主控传输正确。 但在发送了非零值的情况下,始终读取为零。

主配置:(MSP430)

主配置正确。 (我测试过。)
主控模式,MSB 优先,8 位 SPI,
非活动状态为高电平,SS 接地,1 MHz 时钟,无分频器

从机配置(STM32F103ZE)

使用 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

任何人都有答案,

谢谢 哈里

【问题讨论】:

  • STM 支持论坛非常活跃。我也想去那里试试。
  • 您确认 MISO 引脚上的电压波形符合预期吗?
  • 是的。电压与预期相同。我也在 ST 支持论坛上发布了同样的内容
  • 谁能告诉我使用 SPI 获得零的可能性是什么

标签: c embedded stm32 spi


【解决方案1】:

我知道,这个问题已经很老了。不过,由于我最近几天也遇到了同样的问题,我会尽力为未来的读者提供一个答案。

以下代码在 STM32F407 上运行,该代码用于 STM32 探索板上。我从数据表中可以看到,SPI外设和STM32F103上的一样,所以 我希望代码无需修改即可在其他微控制器上运行。

#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. 普通SPI不要选择双向模式,3线SCK、MISO和MOSI。 MISO 和 MOSI 都是单向线。

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

希望对您有所帮助。

【讨论】:

  • 请注意,STM32F1 和 STM32F4 系列之间的外设接口语义完全不同 - 外设可能相同,但它连接到处理器的方式以及为其提供时钟所需的步骤并将其连接到 I/O 引脚 明显不同。
【解决方案2】:

我遇到了从数据寄存器中获取 0x00 值的完全相同的问题。

在我的情况下,问题是 MISO 线被设置为浮动输入。将其更改为 OType_PP 后即可使用。这是我对STM32F429的配置代码:

void SPI1_Config(void){
GPIO_InitTypeDef GPIO_InitStruct;
SPI_InitTypeDef SPI_InitStruct;

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);

GPIO_InitStruct.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_6 | GPIO_Pin_5;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &GPIO_InitStruct);

GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_SPI1);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_SPI1);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_SPI1);

GPIO_InitStruct.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOE, &GPIO_InitStruct);
GPIOE->BSRRL |= GPIO_Pin_7;

SPI_InitStruct.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPI_InitStruct.SPI_Mode = SPI_Mode_Master;
SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStruct.SPI_CPOL = SPI_CPOL_Low;
SPI_InitStruct.SPI_CPHA = SPI_CPHA_1Edge;
SPI_InitStruct.SPI_NSS = SPI_NSS_Soft | SPI_NSSInternalSoft_Set;
SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;
SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_Init(SPI1, &SPI_InitStruct);

SPI_Cmd(SPI1, ENABLE);}

及发送功能:

uint8_t SPI1_Send(uint8_t data){
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);

SPI_I2S_SendData(SPI1, data);

while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);

return SPI_I2S_ReceiveData(SPI1);}

【讨论】:

  • 配置I/O外设的细节你用的STM32F4和题主的STM32F1差别很大。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-28
  • 2019-01-10
  • 2023-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-06
相关资源
最近更新 更多