OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5925|回复: 6

STM32F103开发板 SPI 速度无法达到18Mbit

[复制链接]

2

主题

5

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2021-2-23
在线时间
7 小时
发表于 2021-7-6 15:41:45 | 显示全部楼层 |阅读模式
1金钱
在使用开发板调SPI通信 ,发现速度怎么都上不去,SPI配置如下void MX_SPI1_Init(void)
{

  hspi1.Instance = SPI1;
  hspi1.Init.Mode = SPI_MODE_MASTER;
  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_SOFT;//SPI_NSS_HARD_OUTPUT;
  hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_64;
  hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
  hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
  hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  //hspi1.Init.CRCPolynomial = 10;
  if (HAL_SPI_Init(&hspi1) != HAL_OK)
  {
    Error_Handler();
  }
}

速度配置为2分频
SPI1_SetSpeed(SPI_BAUDRATEPRESCALER_2);

如果使用HAL库带的函数,连续读20M,大约花费63S,也就是320Kbyte/S(2.56Mbit/s)
u8 SPI1_ReadWriteByte(u8 TxData)
{
    u8 Rxdata;
    HAL_SPI_TransmitReceive(&hspi1,&TxData,&Rxdata,1, 1000);  
        return Rxdata;                              //返回收到的数据               
}
或者
HAL_StatusTypeDef SPI1_ReadWriteBlock(uint8_t *pTxData, uint8_t *pRxData,uint16_t Size)
{
        HAL_StatusTypeDef eror;
    eror = HAL_SPI_TransmitReceive(&hspi1,pTxData,pRxData,Size, 1000);   
        return eror;
}


如果使用寄存器方式,连续读20M,大约花费34S,也就是588Kbyte/S(4.7Mbit/s)
u8 SPI1_ReadWriteByte(u8 TxData)
{               
        u16 retry=0;                                 
        while((SPI1->SR&1<<1)==0)                //等待发送区空       
        {
                retry++;
                if(retry>=0XFFFE)
                {
               
                        printf(" SPI1_ReadWriteByte time out -1- \r\n");       
                        return 0;         //超时退出
                }
        }                          
        SPI1->DR=TxData;                                   //发送一个byte
        retry=0;
        while((SPI1->SR&1<<0)==0)                 //等待接收完一个byte  
        {
                retry++;
                if(retry>=0XFFFE)
                {
                        printf(" SPI1_ReadWriteByte time out -2- \r\n");       
                        return 0;         //超时退出
                }
        }                                                              
        return SPI1->DR;                          //返回收到的数据                                    
}
已经设置为最大速度,理论上稳定最高速度在 2.25Mbyte/s(18Mbit/s),外部芯片的最大理论值是33Mbit/s,无论怎么改变调,速度都达不到,请问可能是什么问题?

最佳答案

查看完整内容[请看2#楼]

你测试下SPI CLK的时钟就知道了,其他的就是你MCU处理耗时。最快的方式是DMA。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2021-7-6 15:41:46 | 显示全部楼层
你测试下SPI CLK的时钟就知道了,其他的就是你MCU处理耗时。最快的方式是DMA。
回复

使用道具 举报

2

主题

369

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4241
金钱
4241
注册时间
2020-7-24
在线时间
714 小时
发表于 2021-7-6 18:28:56 | 显示全部楼层
帮顶  
回复

使用道具 举报

0

主题

23

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
230
金钱
230
注册时间
2019-4-25
在线时间
100 小时
发表于 2021-7-6 20:43:28 | 显示全部楼层
改成DMA存储数据试下
回复

使用道具 举报

2

主题

5

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2021-2-23
在线时间
7 小时
 楼主| 发表于 2021-7-6 20:56:18 | 显示全部楼层
guchangwei1991 发表于 2021-7-6 20:43
改成DMA存储数据试下

发现用HAL库比寄存器慢 就没尝试用DMA 而且数据需要时效性 用DMA方式并不合适  另外就是想找到速度达不到理论值的原因
回复

使用道具 举报

6

主题

890

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1481
金钱
1481
注册时间
2020-8-19
在线时间
336 小时
发表于 2021-7-7 12:30:11 | 显示全部楼层
用DMA试试
回复

使用道具 举报

11

主题

2147

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4894
金钱
4894
注册时间
2015-1-10
在线时间
612 小时
发表于 2021-7-9 09:14:23 | 显示全部楼层
你的clk能到18M的话理论就成立
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-23 15:32

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表