【问题标题】:STM32L4 - SPI2 clocking issueSTM32L4 - SPI2 时钟问题
【发布时间】:2016-10-05 23:09:58
【问题描述】:

我目前正在开发 STM32L476RG Nucleo 板,并且正在尝试与 SPI2 总线通信。

似乎我正在使用 MOSI 引脚发送数据,但 SCK 引脚上没有任何内容。

这是我的初始化代码和发送数据代码:

在main.c中:

/初始化 SPI 的函数/

void MX_SPI2_Init(void)
{
  hspi2.Instance = SPI2;
  hspi2.Init.Mode = SPI_MODE_MASTER;
  hspi2.Init.Direction = SPI_DIRECTION_2LINES;
  hspi2.Init.DataSize = SPI_DATASIZE_8BIT;
  hspi2.Init.CLKPolarity = SPI_POLARITY_LOW;
  hspi2.Init.CLKPhase = SPI_PHASE_1EDGE;
  hspi2.Init.NSS = SPI_NSS_SOFT;
  hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16;
  hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB;
  hspi2.Init.TIMode = SPI_TIMODE_DISABLED;
  hspi2.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLED;
  hspi2.Init.CRCPolynomial = 7;
  hspi2.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE;
  hspi2.Init.NSSPMode = SPI_NSS_PULSE_DISABLED;
  HAL_SPI_Init(&hspi2);
}

/通过 SPI 向从机发送数据的函数/

void ADAS1000_SetRegisterValue(unsigned char regAddress,
                               unsigned long regVal)
{

    unsigned char writeCmd[4] = {0, 0, 0, 0};

    writeCmd[0] = 0x80 + regAddress;    // Write bit and register address.
    writeCmd[1] = (unsigned char)((regVal & 0xFF0000) >> 16);
    writeCmd[2] = (unsigned char)((regVal & 0x00FF00) >> 8);
    writeCmd[3] = (unsigned char)((regVal & 0x0000FF) >> 0);

    HAL_SPI_Transmit(&hspi2, &(writeCmd[0]), (uint16_t) sizeof(writeCmd[0]), 50);
    HAL_Delay(500);
    HAL_SPI_Transmit(&hspi2, &(writeCmd[1]), (uint16_t) sizeof(writeCmd[1]), 50);
    HAL_Delay(500);
    HAL_SPI_Transmit(&hspi2, &(writeCmd[2]), (uint16_t) sizeof(writeCmd[2]), 50);
    HAL_Delay(500);
    HAL_SPI_Transmit(&hspi2, &(writeCmd[3]), (uint16_t) sizeof(writeCmd[3]), 50);
    HAL_Delay(500);
}

在 hal_msp.c 中:

void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi)
{

  GPIO_InitTypeDef GPIO_InitStruct;
  if(hspi->Instance==SPI2)
  {
    /* Peripheral clock enable */
    __SPI2_CLK_ENABLE();

    /**SPI2 GPIO Configuration
    PC2     ------> SPI2_MISO
    PC3     ------> SPI2_MOSI
    PB10     ------> SPI2_SCK
    PB12     ------> SPI2_NSS
    */
    GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_MEDIUM;
    GPIO_InitStruct.Alternate = GPIO_AF5_SPI2;
    HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

    GPIO_InitStruct.Pin = GPIO_PIN_10|GPIO_PIN_12;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_MEDIUM;
    GPIO_InitStruct.Alternate = GPIO_AF5_SPI2;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  }

如果您有任何想法或建议,感谢您的帮助!

编辑

void MX_GPIO_Init(void) 
{ 
   /* GPIO Ports Clock Enable */ 
   __GPIOC_CLK_ENABLE(); 
   __GPIOA_CLK_ENABLE(); 
   __GPIOB_CLK_ENABLE(); 
} 

【问题讨论】:

  • 您是否在尝试配置之前启用了 SPI2 时钟?您说您启用了 GPIO 的时钟,但您在尝试配置它们之前是否这样做了?您也可以考虑暂时将有问题的引脚设置为普通 GPIO 输出并在软件中缓慢切换,以验证您已正确定位它以进行探测,它没有短路或损坏等。您在哪里接信号?您的电路板将 PB13 显示为标记为 SPI2 SCK,但它确实将 PB10 显示为 Arduino 风格的 D6(任一引脚都可以配置为此功能)
  • 嗨,克里斯!感谢您的帮助!我在配置它们之前确实启用了 SPI2 和 GPIOs 时钟,并且我已经检查了我的 SCK 引脚是否作为普通 GPIO 工作 我只是尝试使用 PB10 作为 SPI2 SCK,但它仍然不起作用......我真的很困惑,我不知道该怎么办:/
  • 我在使用 NSS 引脚作为 Alt 函数的 STM32 SPI 实现中遇到了问题。在进行任何 SPI 操作之前,我总是必须将引脚设置为 out 并手动将引脚断言为低电平。 STM32F1、F2 和 F4 就是这种情况。不确定 L 系列是否是这种情况。
  • CLK线上有外接上拉电阻吗?
  • 您是否在测试未连接?你在和什么交流?会不会是另一个设备也配置为主模式,因此试图同时驱动时钟线?

标签: c embedded clock stm32 spi


【解决方案1】:

这可能是问题所在:

// [...]
hspi2.Init.NSS = SPI_NSS_SOFT;
// [...]

在不检查 HAL 宏的定义的情况下,我相信这会将 SPI 配置为不驱动 NSS,而是通过软件来完成。这意味着您有责任在将数据放入 SPI 外设之前手动声明 NSS 引脚。

这反过来可能会导致 SPI 从机端不响应,这可能看起来就像 SCK 信号根本没有到达从机。

【讨论】:

  • NSS pin 在主模式下有一个奇怪的功能,我不明白。但我知道您不能使用 NSS 引脚自动生成 CS 信号。据我了解,它的功能与某种多主模式有关。因此,在大多数 STM32 为单主控的应用中,您需要设置 SSM = 1 和 SSI = 1。
  • 据我所知,我从未使用过SSM/SSI - 但我确实使用 SPI 作为主机和从机。绝对有可能由硬件生成 NSS 侧翼(每个 SPI 字传输一个峰值,IIRC)。当 SPI 主设备链接到单个 SPI 从设备时,这尤其方便。
  • F0系列好像有一个NSS Pulse Mode,大概可以用来做这个。但是,F1 和 F4 系列缺少此功能。 ST论坛里有一个关于这个问题的话题:community.st.com/s/question/0D50X00009XkYEn/…
  • 我刚刚为我的 STM32L476 重新检查了一个旧的 CubeMX 项目。在这里,在选择相应的SPI组时,我可以在Cubemx的主要“SPI2模式和配置”空间中使用“硬件NSS信号”=“硬件NSS输出信号”。我承认我没有用范围验证这一点,我不确定 SPI 是否真的在那个小研究项目中运行。但是 CubeMX 选项的命名给了我希望 ;-) 所以你应该再试一次,编码 hspi2.Init.NSS = SPI_NSS_HARD_OUTPUT;
猜你喜欢
  • 2020-08-03
  • 1970-01-01
  • 1970-01-01
  • 2015-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-02
  • 2023-03-08
相关资源
最近更新 更多