搜索
ST MCU Finder
安装免费手机应用,
寻找理想的ST MCU

[STM32F0] SPI在SLAVE模式下,速度为什么只能到2M

[复制链接]
143|11
 楼主 | 2020-9-30 09:31 | 显示全部楼层 |阅读模式
芯片用的是STM32G070芯片,因为项目需要用SPI1做SLAVE模式跟外部通讯,用STM32CUBEMX生成的代码。通讯波特率只能到2M,再高就通讯不正常,看手册可以到16M的。时钟,引脚时钟都设置最高频率,不知道是软件还是硬件问题。
请问大家有没有用STM32的spi,在slave模式下最高波特率能到多少?

使用特权

评论回复
| 2020-9-30 10:32 | 显示全部楼层
任何SPI从机,每个字节内的时钟频率,取决于硬件速度。至于能否连续高速一个接一个接收,取决于MCU取数据的速度和方式,还有硬件是否有FIFO或者DMA。

使用特权

评论回复
| 2020-9-30 10:51 | 显示全部楼层
不知你是怎么判断出它只能工作在2M比特率的。

应该是你代码处理方面的问题吧。

你不妨使用DMA进行接收看看。

使用特权

评论回复
| 2020-9-30 13:54 | 显示全部楼层
受CLK的约束?

按道理怎么也应该1/4 PLLCLK啊! 更不用说 SYSCLK了

使用特权

评论回复
| 2020-9-30 14:01 | 显示全部楼层
上逻辑分析仪吧!

使用特权

评论回复
| 2020-10-12 09:46 | 显示全部楼层
不小了吧已经

使用特权

评论回复
| 2020-10-12 09:47 | 显示全部楼层
这个速度是怎么测出来的呢

使用特权

评论回复
| 2020-10-12 09:50 | 显示全部楼层
感觉实验现象不太对

使用特权

评论回复
| 2020-10-12 09:51 | 显示全部楼层
在主模式下是什么速度

使用特权

评论回复
| 2020-10-12 09:52 | 显示全部楼层
帮楼主顶上去 希望楼主能解决问题

使用特权

评论回复
 楼主 | 2020-10-16 15:30 | 显示全部楼层
香水城 发表于 2020-9-30 10:51
不知你是怎么判断出它只能工作在2M比特率的。

应该是你代码处理方面的问题吧。

我用的就是DMA接收。
主机原先跟其他电路板SPI通讯的时候是用的12M,开始用这个速度跟我的电路板通讯不了,本着先调功能,后调性能,将主机SPI的通讯波特率调到500K没问题。
然后测试通讯波特率上限能到哪里,就按500K的倍数往上加,在2M的时候可以稳定可靠通讯,通过这个判断它只能工作在2M上。

使用特权

评论回复
 楼主 | 2020-10-16 15:39 | 显示全部楼层
本帖最后由 qishi00 于 2020-10-16 15:47 编辑
qishi00 发表于 2020-10-16 15:30
我用的就是DMA接收。
主机原先跟其他电路板SPI通讯的时候是用的12M,开始用这个速度跟我的电路板通讯不了 ...

D:\Desktop\临时图片\1.png
D:\Desktop\临时图片\2.png
D:\Desktop\临时图片\3.png
D:\Desktop\临时图片\4.png

初始化代码:
void HAL_SPI_MspInit(SPI_HandleTypeDef* spiHandle)
{

  GPIO_InitTypeDef GPIO_InitStruct = {0};
  if(spiHandle->Instance==SPI1)
  {
  /* USER CODE BEGIN SPI1_MspInit 0 */

  /* USER CODE END SPI1_MspInit 0 */
    /* SPI1 clock enable */
    __HAL_RCC_SPI1_CLK_ENABLE();

    __HAL_RCC_GPIOA_CLK_ENABLE();
    /**SPI1 GPIO Configuration   
    PA4     ------> SPI1_NSS
    PA5     ------> SPI1_SCK
    PA6     ------> SPI1_MISO
    PA7     ------> SPI1_MOSI
    */
    GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF0_SPI1;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    /* SPI1 DMA Init */
    /* SPI1_RX Init */
    hdma_spi1_rx.Instance = DMA1_Channel5;
    hdma_spi1_rx.Init.Request = DMA_REQUEST_SPI1_RX;
    hdma_spi1_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
    hdma_spi1_rx.Init.PeriphInc = DMA_PINC_DISABLE;
    hdma_spi1_rx.Init.MemInc = DMA_MINC_ENABLE;
    hdma_spi1_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
    hdma_spi1_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
    hdma_spi1_rx.Init.Mode = DMA_NORMAL;
    hdma_spi1_rx.Init.Priority = DMA_PRIORITY_HIGH;
    if (HAL_DMA_Init(&hdma_spi1_rx) != HAL_OK)
    {
      Error_Handler();
    }

    __HAL_LINKDMA(spiHandle,hdmarx,hdma_spi1_rx);

    /* SPI1_TX Init */
    hdma_spi1_tx.Instance = DMA1_Channel6;
    hdma_spi1_tx.Init.Request = DMA_REQUEST_SPI1_TX;
    hdma_spi1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
    hdma_spi1_tx.Init.PeriphInc = DMA_PINC_DISABLE;
    hdma_spi1_tx.Init.MemInc = DMA_MINC_ENABLE;
    hdma_spi1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
    hdma_spi1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
    hdma_spi1_tx.Init.Mode = DMA_NORMAL;
    hdma_spi1_tx.Init.Priority = DMA_PRIORITY_HIGH;
    if (HAL_DMA_Init(&hdma_spi1_tx) != HAL_OK)
    {
      Error_Handler();
    }

    __HAL_LINKDMA(spiHandle,hdmatx,hdma_spi1_tx);

    /* SPI1 interrupt Init */
    HAL_NVIC_SetPriority(SPI1_IRQn, 3, 0);
    HAL_NVIC_EnableIRQ(SPI1_IRQn);
  /* USER CODE BEGIN SPI1_MspInit 1 */
    SPI1_Init();

  /* USER CODE END SPI1_MspInit 1 */
  }
}


void MX_SPI1_Init(void)
{

  hspi1.Instance = SPI1;
  hspi1.Init.Mode = SPI_MODE_SLAVE;
  hspi1.Init.Direction = SPI_DIRECTION_2LINES;
  hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
  hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
  hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
  hspi1.Init.NSS = SPI_NSS_HARD_INPUT;
  hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
  hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
  hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  hspi1.Init.CRCPolynomial = 7;
  hspi1.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE;
  hspi1.Init.NSSPMode = SPI_NSS_PULSE_DISABLE;
  if (HAL_SPI_Init(&hspi1) != HAL_OK)
  {
    Error_Handler();
  }

}
设置4.png
设置3.png
设置2.png
设置1.png
5.png

使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

在线客服 快速回复 返回顶部 返回列表