gpt4 book ai didi

STM32F072RB 在从机模式下不通过 SPI 接收/发送数据

转载 作者:行者123 更新时间:2023-12-05 07:42:13 25 4
gpt4 key购买 nike

我正在使用 STM32F072RBuC 通过 SPI2 接收和传输数据在具有以下配置的从属模式下:

CR1 = 0x0078
CR2 = 0x0700
AFRH = 0x55353500
MODER = 0xa2a0556a

寄存器APB1ENR也已正确配置。

当前程序只检查RXNE标志,从 DR 中读取接收到的数据并发送一个随机值写入 DR .

我收到数据时的状态寄存器有如下值:

SR = 0x1403

主机正确发送数据,我检查了从机引脚的信号(时钟相位和极性在两侧相同,并且在通过 MOSI 发送 SCK 和数据之前清除 NSS 信号)。

我什至将引脚配置为输入,我知道我可以读取主机发送的任何数字信号。在当前配置下,slave 似乎收到了一些东西,因为 RXNE主机发送数据时置位,但读取值始终为0x00。

我尝试了不同的配置(软件/硬件 NSS、不同的数据大小等),但我总是得到 0x00。此外,我阅读后发送的随机值 DR不发送到输出。

这是我当前的函数,它被连续调用:

unsigned char spi_rx_slave(unsigned char spiPort, unsigned char *receiveBuffer)
{
uint8_t temp;
static unsigned long sr;
if (!spi_isOpen(spiPort))
{
sendDebug("%s() Error: spiPort not in use!\r\n",__func__);
return false;
}
if (spiDescriptor[spiPort]->powerdown == true)
{
sendDebug("%s() Error: spiPort in powerdown!\r\n",__func__);
return false;
}
/* wait till spi is not busy anymore */
while((spiDescriptor[spiPort]->spiBase->SR) & SPI_SR_BSY)
{
sendDebug("SPI is busy(1)\r\n");
vTaskDelay(2);
}
sendDebug("CR1 = 0x%04x, ", spiDescriptor[spiPort]->spiBase->CR1);
sendDebug("CR2 = 0x%04x, ", spiDescriptor[spiPort]->spiBase->CR2);
sendDebug("AFRH address = 0x%08x, AFRH value = %08x, ", (unsigned long*)(GPIOB_BASE+0x24), *(unsigned long*)(GPIOB_BASE+0x24));
sendDebug("MODER address = 0x%08x, MODER value = %08x\r\n", (unsigned long*)(GPIOB_BASE), *(unsigned long*)(GPIOB_BASE));
sr = spiDescriptor[spiPort]->spiBase->SR;
while(sr & SPI_SR_RXNE)
{
/* get RX byte */
temp = *(uint8_t *)&(spiDescriptor[spiPort]->spiBase->DR);
spiDescriptor[spiPort]->spiBase->DR = 0x53;
sendDebug("-------->DR address = 0x%08x, data received: 0x%02x\r\n", &spiDescriptor[spiPort]->spiBase->DR, temp);
sendDebug("SR = 0x%04x\r\n", sr);
vTaskDelay(1);
sr = spiDescriptor[spiPort]->spiBase->SR;
}
while((spiDescriptor[spiPort]->spiBase->SR) & SPI_SR_BSY)
{
sendDebug("SPI is busy(2)\r\n");
vTaskDelay(2);
}
return true;
}

我做错了什么?有什么我没有正确配置的吗?

提前致谢。问候,哈维尔

编辑:

我切换到软件 NSS 并复制了我在网上找到的 STM32CubeMX 示例中的寄存器值。我不能将这些库用于该项目,但我希望有相同的行为。

新值是:

CR1 = 0x0278

这意味着

  • fPCLK/256(适合通信速度的那个),
  • 启用 SPI 和
  • SSM = 1(软件 NSS)。
CR2 = 0x1700

这意味着

  • 8位数据和
  • RXNE如果 FIFO 级别大于或等于 1/4(8 位),则生成事件。
AFRH = 0x55303500
MODER = 0xa8a1556a

这意味着

  • MISO、MOSI 和 SCK 交替功能 5 (SPI2)
  • NSS 未配置,因为它现在处于软件模式(始终选择从站)。

我仍然得到相同的结果,并且使用这些库的评估套件可以正常使用 SPI1反而。因此,肯定还有另一个与寄存器值无关的问题。

可能有任何时钟问题,例如引脚需要一些时钟吗?

谢谢!

最佳答案

这个问题指出了一些错误,这些错误可以解释为什么没有观察到接收:

  1. GPIO 配置指向一些错误的备用功能/模式:这个问题没有准确说明,但我认为

    AFRH = 0x55303500
    MODER = 0xa8a1556a

    指的是 GPIOB(否则,它对 SPI2 没有意义)。这对应于以下引脚配置(见 Reference Manual ,秒。 8.4.1、8.4.10 和 Datasheet ,表 16):

    PB15 - Alternate Function - AF5 = [INVALID]
    PB14 - Alternate Function - AF5 = [I2C2_SDA]
    PB13 - Alternate Function - AF3 = [TSC_G6_IO3]
    PB12 - GP Input (reset state)
    PB11 - Alternate Function - AF3 = [TIM_CH4]
    PB10 - Alternate Function - AF5 = [SPI2_SCK / I2S2_CK]
    PB09 - GP Input (reset state)
    PB08 - GP Output
    PB07 - Alternate Function - (unknown which, see register AFRL)
    PB06 - GP Output
    PB05 - Alternate Function - (unknown which, see register AFRL)
    PB04 - GP Output
    PB03 - GP Output
    PB02 - Alternate Function - (unknown which, see register AFRL)
    PB01 - Alternate Function - (unknown which, see register AFRL)
    PB00 - Alternate Function - (unknown which, see register AFRL)

    这显然不是软件需要做的。

    解决方案:确保配置PB15=>AF0PB14=>AF0PB13=>AF0PB10 =>AF0,取决于您的硬件。

    为了避免这样做的错误,您应该遵循@P__J__ 的提示,并为分配给 MODER、AFRH 等的常量使用说话宏。使用 ST 提供的 HAL 库在 SO 用户中是一个真正有争议的话题,但是人们真的应该考虑至少使用像 stm32f072xb.h 这样的头文件和像 这样的宏>GPIO_AFRH_AFSEL15。如果将所有配置寄存器值表示为此类宏的(按位)或,则更容易根据数据表重新检查配置,而著名的 rubber duck会直接知道不开心的开发者在说什么。

  2. 其他时钟激活可能会丢失:这个问题证实了

    The register APB1ENR is also properly configured.

    这是正确的(只要第 14 位已设置)。

    此外,GPIOB 必须通电,即。例如,必须设置 RCC_AHBENR 的第 18 位。再看看 Reference Manual ,秒。 6.4.8 和 6.4.6。

  3. 调试期间 GPIO 引脚可能处于错误模式:

    I even configured the pins as inputs and I know I could read any digital signal the master could send. With the current configuration it seems the slave receives something because the RXNE is set when the master sends data but the read value is always 0x00.

    请注意,对于每个 GPIO 引脚,通过 MODER 寄存器选择一个独特的模式。如果将其设置为“输入”(0b00),备用功能将断开连接并且无法使用外部信号。

关于STM32F072RB 在从机模式下不通过 SPI 接收/发送数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44676996/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com