硬汉嵌入式论坛

 找回密码
 立即注册
查看: 488|回复: 10
收起左侧

[技术讨论] STM32-F103CBT6的SPI启动失败,求救各位大神

[复制链接]

1

主题

7

回帖

10

积分

新手上路

积分
10
发表于 2023-12-21 16:33:55 | 显示全部楼层 |阅读模式
最近驱动一个OLED屏幕,使用硬件SPI驱动,只用了MOSI和SCLK这两根线,软件配置如下:
    SPI_InitTypeDef SPI_InitStruct;
    GPIO_InitTypeDef GPIO_InitStruct;
   
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1,ENABLE);
   
    GPIO_InitStruct.GPIO_Mode = SPI_1_SCLK_MODE;
    GPIO_InitStruct.GPIO_Pin = SPI_1_SCLK_PIN;
    GPIO_InitStruct.GPIO_Speed = SPI_1_SCLK_SPEED;
    GPIO_Init(SPI_1_SCLK_GPIO,&GPIO_InitStruct);
   
    GPIO_InitStruct.GPIO_Mode = SPI_1_NSS_MODE;
    GPIO_InitStruct.GPIO_Pin = SPI_1_NSS_PIN;
    GPIO_InitStruct.GPIO_Speed = SPI_1_NSS_SPEED;
    GPIO_Init(SPI_1_NSS_GPIO,&GPIO_InitStruct);
   
    GPIO_InitStruct.GPIO_Mode = SPI_1_MOSI_MODE;
    GPIO_InitStruct.GPIO_Pin = SPI_1_MOSI_PIN;
    GPIO_InitStruct.GPIO_Speed = SPI_1_MOSI_SPEED;
    GPIO_Init(SPI_1_MOSI_GPIO,&GPIO_InitStruct);
    //以上三个均为复用推挽 AF_PP
   
    SPI_InitStruct.SPI_CPHA = 0;
    SPI_InitStruct.SPI_CPOL = 0;
    SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b;
    SPI_InitStruct.SPI_Direction = SPI_Direction_1Line_Tx;
    SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_MSB;
    SPI_InitStruct.SPI_Mode = SPI_Mode_Master;
    SPI_InitStruct.SPI_NSS = SPI_NSS_Hard;
    SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;
    SPI_InitStruct.SPI_CRCPolynomial = 7;
   
    SPI_Init(SPI1,&SPI_InitStruct);
    SPI_Cmd(SPI1,ENABLE);
    SPI_1_NSS_ENABLE;

下载 (1).png
但是这个代码在下载完后SPI能正常启动,时钟线上都有相应的脉冲出现,但是只要复位或者掉电重启,时钟线上就不会出现任何脉冲,之后不断复位或者重启只有小概率能正常启动,但单片机依旧是正常的在跑,求教各位大神,这是啥问题,第一次发帖,有不对或欠缺的还请指出


回复

使用道具 举报

5

主题

31

回帖

46

积分

新手上路

积分
46
发表于 2023-12-22 08:16:23 | 显示全部楼层
你试试在配置完之后先延时200ms,再对OLED进行初始化。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106856
QQ
发表于 2023-12-22 08:51:12 | 显示全部楼层
试试调试状态全速运行,看看是不是也能用,如果可以用,说明是程序里面有延迟类API没用正常起作用。
回复

使用道具 举报

1

主题

7

回帖

10

积分

新手上路

积分
10
 楼主| 发表于 2023-12-25 10:46:23 | 显示全部楼层
红烧鱼头 发表于 2023-12-22 08:16
你试试在配置完之后先延时200ms,再对OLED进行初始化。

这个方法也是不行,还是没脉冲出现
回复

使用道具 举报

1

主题

7

回帖

10

积分

新手上路

积分
10
 楼主| 发表于 2023-12-25 10:47:11 | 显示全部楼层
eric2013 发表于 2023-12-22 08:51
试试调试状态全速运行,看看是不是也能用,如果可以用,说明是程序里面有延迟类API没用正常起作用。

调试模式下,全速确实能跑,但是我没使用过延时类的函数
回复

使用道具 举报

1

主题

7

回帖

10

积分

新手上路

积分
10
 楼主| 发表于 2023-12-27 17:22:09 | 显示全部楼层
问题解决,SPI的初始化函数跑两遍就没问题了
回复

使用道具 举报

5

主题

31

回帖

46

积分

新手上路

积分
46
发表于 2023-12-28 08:05:52 | 显示全部楼层
DAOC280 发表于 2023-12-27 17:22
问题解决,SPI的初始化函数跑两遍就没问题了

那原理你搞明白了吗?
回复

使用道具 举报

1

主题

7

回帖

10

积分

新手上路

积分
10
 楼主| 发表于 2024-1-3 10:10:58 | 显示全部楼层
红烧鱼头 发表于 2023-12-28 08:05
那原理你搞明白了吗?

不好意思,没搞明白,我也不清除为啥初始化函数连着跑两遍就没问题。坐等来个大佬解答
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2024-1-3 20:02:21 | 显示全部楼层
DAOC280 发表于 2024-1-3 10:10
不好意思,没搞明白,我也不清除为啥初始化函数连着跑两遍就没问题。坐等来个大佬解答

会不会和分频大小有关??
回复

使用道具 举报

1

主题

7

回帖

10

积分

新手上路

积分
10
 楼主| 发表于 2024-1-4 10:05:25 | 显示全部楼层
空世格 发表于 2024-1-3 20:02
会不会和分频大小有关??

不像,我在没搞定前,试过几种分频配置,最低是16分频,最高是2分频,情况都一样,所以我认为不是分频的问题
回复

使用道具 举报

1

主题

7

回帖

10

积分

新手上路

积分
10
 楼主| 发表于 2024-1-6 16:12:03 | 显示全部楼层
最新情况,同样的代码,放到另一个同样的设备上,只需要初始化一次就能正常跑怀疑是不是芯片的问题
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-8 01:14 , Processed in 0.252108 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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