发新帖本帖赏金 2.00元(功能说明)我要提问
返回列表
[STM32F4]

SPI故障,可有偿

[复制链接]
1390|21
手机看帖
扫描二维码
随时随地手机跟帖
liusheng1998|  楼主 | 2023-1-14 15:51 | 显示全部楼层 |阅读模式
本帖最后由 liusheng1998 于 2023-1-14 18:58 编辑

#21ic问答# 主要问题:spi检测不到SCK输出。
编译环境:keil。硬件:stm32f407zg正点原子探索者开发板+逻辑分析仪.已跑例程,确认硬件引脚输出正常
工程背景:想用SPI传输控制CAN外扩芯片MCP2515,已使用2路CAN,TX/RX引脚占用分别为D1/D0、B12/B13.
SPI选择的是SPI1 ,使用引脚定为PB3 PB4 PB5 作为SPI  sck miso mosi,以及PB14作为片选引脚。
SPI.C代码如下
#include "sys.h"
#include "spi.h"

//以下是SPI模块的初始化代码,配置成主机模式                                                   
//SPI口初始化
//这里针是对SPI1的初始化

void SPI1_Init(void)
{         
  GPIO_InitTypeDef  GPIO_InitStructure;
  SPI_InitTypeDef  SPI_InitStructure;
        
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB|RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOG, ENABLE);//使能GPIOB时钟 A是片选信号的PA15        所需要的
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);//使能SPI1时钟  2
  


  //GPIOFB3,4,5初始化设置
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5;//PB3~5复用功能推挽输出        
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能 3
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//100MHz
// GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
  GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;//不上拉 也不下拉
//修改 将有引脚状态由上拉 改为不上拉也不下拉 再改为GPIO_PuPd_DOWN
  GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化

//设置片选脚的配置
     GPIO_InitTypeDef GPIO_initStruct1;
     GPIO_initStruct1.GPIO_Pin          =  GPIO_Pin_14;
     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通的OUT IO口
            GPIO_initStruct1.GPIO_OType        =GPIO_OType_PP;
     GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
           GPIO_initStruct1.GPIO_Speed         =  GPIO_Speed_100MHz;
           GPIO_Init(GPIOB,&GPIO_initStruct1);//配置片选信号
//****************************************************************

使用特权

评论回复
liusheng1998|  楼主 | 2023-1-14 15:52 | 显示全部楼层
请给位大神不吝赐教,感激不尽,卡住在这里好久了,一直没法解决

使用特权

评论回复
liusheng1998|  楼主 | 2023-1-14 15:54 | 显示全部楼层
顶一下,请求帮助

使用特权

评论回复
liusheng1998|  楼主 | 2023-1-14 16:03 | 显示全部楼层
再顶 ,求求了

使用特权

评论回复
james03| | 2023-1-14 18:14 | 显示全部楼层
关掉PB3/4/5的JTAG引脚才能复用为其他功能

使用特权

评论回复
liusheng1998|  楼主 | 2023-1-14 18:57 | 显示全部楼层
james03 发表于 2023-1-14 18:14
关掉PB3/4/5的JTAG引脚才能复用为其他功能

谢谢你的回复,F4的代码规则直接配置
GPIO_PinAFConfig(GPIOB,GPIO_PinSource3,GPIO_AF_SPI1); //PB3复用为 SPI1
这就可以选定PB3的功能。问题应该不在这儿。
后面查到是:
我的片选引脚的结构体写错了。修改了一下现在可以收到SCK了
GPIO_InitTypeDef GPIO_initStruct1;
     GPIO_initStruct1.GPIO_Pin          =  GPIO_Pin_14;
     GPIO_initStruct1.GPIO_Mode = GPIO_Mode_OUT;//普通的OUT IO口
           GPIO_initStruct1.GPIO_OType        =GPIO_OType_PP;
     GPIO_initStruct1.GPIO_PuPd = GPIO_PuPd_UP;//上拉
           GPIO_initStruct1.GPIO_Speed         =  GPIO_Speed_100MHz;
           GPIO_Init(GPIOB,&GPIO_initStruct1);//配置片选信号

使用特权

评论回复
liusheng1998|  楼主 | 2023-1-15 16:55 | 显示全部楼层
新的问题出现了,就是 SPI的输出无法解码,不知道是不是时序问题。
分析仪接受的波形如下图所示。
1.SCK的时钟看起来不均匀
2.MOSI的初始化为高电平,不知为何检测到初始电平为0
3.无法解码。D0:SCK  D1:MISO  D2 MOSI  D3:CS
2557663c3bf576ec11.png

使用特权

评论回复
timerc| | 2023-1-16 08:43 | 显示全部楼层
为什么我看着感觉D2像是SCK呢。。。。。

使用特权

评论回复
天天向善| | 2023-1-16 10:10 | 显示全部楼层
liusheng1998 发表于 2023-1-15 16:55
新的问题出现了,就是 SPI的输出无法解码,不知道是不是时序问题。
分析仪接受的波形如下图所示。
1.SCK的 ...

你把逻辑分析仪的频率调高一些看看。

使用特权

评论回复
Pretext| | 2023-1-16 10:10 | 显示全部楼层
是什么收不到SCK?其他芯片还是?

使用特权

评论回复
芯路例程| | 2023-1-16 10:11 | 显示全部楼层
SCK和MOSI有问题的。

使用特权

评论回复
liusheng1998|  楼主 | 2023-1-18 16:47 | 显示全部楼层
Pretext 发表于 2023-1-16 10:10
是什么收不到SCK?其他芯片还是?

你好 是逻辑分析仪检测不到 SCK的输出,谢谢你

使用特权

评论回复
liusheng1998|  楼主 | 2023-1-18 16:48 | 显示全部楼层
天天向善 发表于 2023-1-16 10:10
你把逻辑分析仪的频率调高一些看看。

好的 我在试试看 我原本呢用的是20k 可能确实低了 我改成1M试试看

使用特权

评论回复
liusheng1998|  楼主 | 2023-1-18 16:49 | 显示全部楼层
timerc 发表于 2023-1-16 08:43
为什么我看着感觉D2像是SCK呢。。。。。

额 这个引脚我还是有认真的确认,D2确实是MOSI,

使用特权

评论回复
liusheng1998|  楼主 | 2023-1-18 16:50 | 显示全部楼层
芯路例程 发表于 2023-1-16 10:11
SCK和MOSI有问题的。

您看看问题具体在哪 能有所推测吗。

使用特权

评论回复
sjnh| | 2023-1-18 17:40 | 显示全部楼层
3个IO都做了复用?
SPI毕竟是硬件实现,SCK应该是很平均的方波,感觉你的io做别的用途

使用特权

评论回复

打赏榜单

liusheng1998 打赏了 1.00 元 2023-01-18
理由:谢谢

liusheng1998|  楼主 | 2023-1-18 19:40 | 显示全部楼层
sjnh 发表于 2023-1-18 17:40
3个IO都做了复用?
SPI毕竟是硬件实现,SCK应该是很平均的方波,感觉你的io做别的用途 ...

你好,我也有过这方面的猜测,但是我查了一下所有的IO口的配置函数,并没有是实质的代码 对PB345这三个引脚做复用。
但是我也注意到一点,就是我的PB3 的确在CUBEmx里面可以看到 他可以被复用为UBS_OTG_HS引脚。但是我的代码是没用HS的 用的是USB_OTG_FS。
然后复用问题,在官方例程SPI里面 都是这么设计的,硬件SPI SCK MOSI MISO 这三个引脚都要复用为SPI相关。
片选引脚就单独设置一个引脚即可

使用特权

评论回复
liusheng1998|  楼主 | 2023-1-18 19:53 | 显示全部楼层
顶一下 ,求人来看

使用特权

评论回复
timerc| | 2023-1-19 08:55 | 显示全部楼层
PB3有被初始化位其他功能,把功能去掉试试呗,先屏蔽部分功能呗,单独测试弄一个程序,把代码提取出来,只跑这个SPI部分的试试呗;这样就能排除是否有其他影响了,毕竟CUBEMX配置一个程序蛮方便的

使用特权

评论回复

打赏榜单

liusheng1998 打赏了 1.00 元 2023-01-20
理由:谢谢

评论
liusheng1998 2023-1-20 11:02 回复TA
确实 我可以做排除,看一下 虚拟串口 SPI 和CAN 哪里会有冲突。 
liusheng1998 2023-1-20 11:01 回复TA
谢谢 我想的是 前面我用的是标准库,没有cube,因为前面的配置都是用的标准库,尤其是USB虚拟串口那一部分。 
liusheng1998|  楼主 | 2023-2-2 15:25 | 显示全部楼层
后面自查了一下,没啥问题 ,就是串口的初始化代码 和SPI 的初始化代码的顺序需要调换一下,虽然我也不知道为什么要这样。
但是现在STM32F407  USBVCP  MCP2515已经可以传输数据了。
感兴趣的可以私聊我。

使用特权

评论回复
发新帖 本帖赏金 2.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则