SPI故障,可有偿
本帖最后由 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 作为SPIsck miso mosi,以及PB14作为片选引脚。
SPI.C代码如下#include "sys.h"
#include "spi.h"
//以下是SPI模块的初始化代码,配置成主机模式
//SPI口初始化
//这里针是对SPI1的初始化
void SPI1_Init(void)
{
GPIO_InitTypeDefGPIO_InitStructure;
SPI_InitTypeDefSPI_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);//配置片选信号
//**************************************************************** 请给位大神不吝赐教,感激不尽,卡住在这里好久了,一直没法解决 顶一下,请求帮助 再顶 ,求求了 关掉PB3/4/5的JTAG引脚才能复用为其他功能 james03 发表于 2023-1-14 18:14
关掉PB3/4/5的JTAG引脚才能复用为其他功能
谢谢你的回复,F4的代码规则直接配置{:titter:}
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);//配置片选信号 新的问题出现了,就是 SPI的输出无法解码,不知道是不是时序问题。
分析仪接受的波形如下图所示。
1.SCK的时钟看起来不均匀
2.MOSI的初始化为高电平,不知为何检测到初始电平为0
3.无法解码。D0:SCKD1:MISOD2 MOSID3:CS 为什么我看着感觉D2像是SCK呢。。。。。 liusheng1998 发表于 2023-1-15 16:55
新的问题出现了,就是 SPI的输出无法解码,不知道是不是时序问题。
分析仪接受的波形如下图所示。
1.SCK的 ...
你把逻辑分析仪的频率调高一些看看。 是什么收不到SCK?其他芯片还是? SCK和MOSI有问题的。 Pretext 发表于 2023-1-16 10:10
是什么收不到SCK?其他芯片还是?
你好 是逻辑分析仪检测不到 SCK的输出,谢谢你 天天向善 发表于 2023-1-16 10:10
你把逻辑分析仪的频率调高一些看看。
好的 我在试试看 我原本呢用的是20k 可能确实低了 我改成1M试试看 timerc 发表于 2023-1-16 08:43
为什么我看着感觉D2像是SCK呢。。。。。
额 这个引脚我还是有认真的确认,D2确实是MOSI,{:cry:} 芯路例程 发表于 2023-1-16 10:11
SCK和MOSI有问题的。
您看看问题具体在哪 能有所推测吗。 3个IO都做了复用?
SPI毕竟是硬件实现,SCK应该是很平均的方波,感觉你的io做别的用途 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相关。
片选引脚就单独设置一个引脚即可 顶一下 ,求人来看 PB3有被初始化位其他功能,把功能去掉试试呗,先屏蔽部分功能呗,单独测试弄一个程序,把代码提取出来,只跑这个SPI部分的试试呗;这样就能排除是否有其他影响了,毕竟CUBEMX配置一个程序蛮方便的 后面自查了一下,没啥问题 ,就是串口的初始化代码 和SPI 的初始化代码的顺序需要调换一下,虽然我也不知道为什么要这样。
但是现在STM32F407USBVCPMCP2515已经可以传输数据了。
感兴趣的可以私聊我。
页:
[1]