请选择 进入手机版 | 继续访问电脑版

安富莱电子论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 130|回复: 2
收起左侧

[有问必答] spi的波特率和sclk的频率是什么关系

[复制链接]

17

主题

45

帖子

79

积分

初级会员

积分
79
发表于 2019-1-23 17:24:48 | 显示全部楼层 |阅读模式
我配置的spi为波特率为1m,时钟为64M,预分频64,但是用逻辑分析仪发现sclk的周期为2us,频率为500K,感觉不对劲啊。所以求问spi的波特率和sclk的频率是什么关系,
波特率1s传多少位,spi的话一个上升沿1个位,感觉是一样的啊!


回复

使用道具 举报

5276

主题

3万

帖子

4万

积分

管理员

做人第一,工作第二

Rank: 9Rank: 9Rank: 9

积分
42678
QQ
发表于 2019-1-23 17:37:02 | 显示全部楼层
64M进行64分频的话,你的SPI CLK应该是1MHz频率才对。
淘宝小店: https://armfly.taobao.com/
专注,努力,用心的做好每一件事情,Fighting!
回复

使用道具 举报

17

主题

45

帖子

79

积分

初级会员

积分
79
 楼主| 发表于 2019-1-24 11:39:54 | 显示全部楼层
eric2013 发表于 2019-1-23 17:37
64M进行64分频的话,你的SPI CLK应该是1MHz频率才对。

找到问题了,我是用rt-thread用的spi2.
    static rt_err_t stm32_spi_init(SPI_TypeDef *spix, struct rt_spi_configuration *cfg)
    {
    。。。
        if (cfg->max_hz >= HAL_RCC_GetPCLK2Freq() / 2)
        {
            hspi.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;
        }
        else if (cfg->max_hz >= HAL_RCC_GetPCLK2Freq() / 4)
        {
            hspi.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4;
        }
        else if (cfg->max_hz >= HAL_RCC_GetPCLK2Freq() / 8)
        {
            hspi.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8;
        }
        else if (cfg->max_hz >= HAL_RCC_GetPCLK2Freq() / 16)
        {
            hspi.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16;
        }
        else if (cfg->max_hz >= HAL_RCC_GetPCLK2Freq() / 32)
        {
            hspi.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_32;
        }
        else if (cfg->max_hz >= HAL_RCC_GetPCLK2Freq() / 64)
        {
            hspi.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_64;
        }
        else if (cfg->max_hz >= HAL_RCC_GetPCLK2Freq() / 128)
        {
            hspi.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_128;
        }
        else
        {
            /*  min prescaler 256 */
            hspi.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256;
        }
    。。。。
        return RT_EOK;
    }

drv_spi.c中 stm32_spi_init函数,缺陷就在于波特率的配置,大家发现了没有它只跟HAL_RCC_GetPCLK2Freq()比较,但是spi1是APB2时钟出来的,spi2,3都是APB1出来的。
RCC_APB2Periph_SPI1,RCC_APB1Periph_SPI2  RCC_APB1Periph_SPI3

一般APB1最大36M,而apb2可以72M。所以如果用spi2或者spi3,恰好APB1和APB2时钟不一样这种做法是有问题的。
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|手机版|安富莱电子论坛 ( 鄂ICP备09023347号,公安机关备案号42010602000201 )

GMT+8, 2019-2-19 17:03 , Processed in 0.165188 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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