正点原子精英板无法使用spi2通信,换用spi3

项目场景:

课程设计(基于RFID的门禁)时,需要用到RFID模块,需要使用到spi,其中spi1给esp8266使用,spi2给RFID使用。


问题描述

正点原子精英开发板(stm32F103ZXET6)的spi2无法使用
查询芯片手册发现:
spi2无法重映射,但有spi3
引脚配置如下:在这里插入图片描述在这里插入图片描述在这里插入图片描述
直接使用spi3连接rfid后,发现rfid没有实现功能。


原因分析:

总结一下spi3的问题,因为spi3的nss口与JTAG有共用引脚,所以配置错误会导致SPI3无法使用。需要注意以下三点就可以了:

1.将PA15配置为普通IO口,GPIO_Mode_Out_PP
2.开启AFIO时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
3.关闭JTAG功能,使能SWD
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE) ;

其他的SPI口正常配置,因为板子重启后默认为JTAG模式,虽然在调试时使用了SWD,但PA15依然不是普通的IO口,当把它重新配置时,一定要开启AFIO时钟,如果不开启的话,只有GPIO_PinRemapConfig(),会导致程序崩溃,在调试的时候会乱跳,具体原因我也不知道。

注意千万不要使用GPIO_Remap_SWJ_Disable ,因为这样就不能下载程序了,要开锁很麻烦的。

在使用stm32的时候, spi3和jtag口是有重合的, 如果要使用spi3 或者要把jtag口作为普通io口使用可参考如下配置:

  1. 使用spi3接口, 参考 卢有亮 老师的教程 [BP19_网络PING实验], 该套代码实现了该项功能
  2. stm32的jtag口可以配置为SWD模式 这样能空余出来三个接口, 并且不影响程序的下载和调试, 关于如何配置为SWD模式可以参考上一篇博客.

将STM32的JTAG下载引脚:JTDO、JTDI、JTCK 配置普通IO口其实和配置为spi3 是一样的 只不过spi3还要开spi的时钟, 这里更改为开io口时钟即可, 其中最关键的两条指令是:

  1、打开复用时钟:RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,EANBLE);
  2、调用重映射函数:GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);//关闭jtag , 开启swd

版权声明:转自CSDN博主「yuanmeixiang」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:链接: link

解决方案:

提示:这里填写该问题的具体解决方案:

于是我在spi3初始化代码中加入关键的两条指令:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //开启AFIO时钟
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE) ;//关闭JTAG功能,使能SWD 

加入后初始化代码如下:

void SPI_Init(void)	
{
	

		GPIO_InitTypeDef GPIO_InitStructure;
		RCC_APB2PeriphClockCmd(	RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE );//PORTB时钟使能 
		//开启AFIO时钟
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); 
		//关闭JTAG功能,使能SWD 
		GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE) ;
	
		// CS
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;	 
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 //IO口速度为50MHz
    GPIO_Init(GPIOA, &GPIO_InitStructure);					 //根据设定参数初始化PB12
    
    // SCK
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;	 
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 //IO口速度为50MHz
    GPIO_Init(GPIOB, &GPIO_InitStructure);
    
    // MISO
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;	 
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; 		 //推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 //IO口速度为50MHz
    GPIO_Init(GPIOB, &GPIO_InitStructure);
    
    // MOSI
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;	 
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 //IO口速度为50MHz
    GPIO_Init(GPIOB, &GPIO_InitStructure);
    
    // RST
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;	 
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 //IO口速度为50MHz
    GPIO_Init(GPIOB, &GPIO_InitStructure);
    
}

最后效果rfid读卡成功,效果如下
在这里插入图片描述
以上spi3成功使用。


重复一下:

总结一下spi3的问题,因为spi3的nss口与JTAG有共用引脚,所以配置错误会导致SPI3无法使用。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32是一种微控制器系列,其中的SPI(串行外设接口)是一种通信接口,可以实现与外部设备的高速通信。下面是一个关于STM32 SPI2程序的简要说明。 STM32 SPI2程序的目的是实现与外部设备之间的数据传输。首先,我们需要在初始化阶段配置SPI2的各种参数,如数据位大小、极性、相位等等。这些参数可以根据具体外设的需求进行设置。 接下来是数据传输的流程。首先,我们通过SPI2的发送寄存器将要发送的数据写入。然后,等待发送完成的标志位被置位,表示数据已经成功发送。在此期间,我们还可以通过SPI2的接收寄存器读取接收到的数据,可以根据用户的需求选择是否接收数据。 对于非阻塞模式的SPI2程序,我们可以利用中断来异步地处理数据传输。在初始化阶段,我们需要配置相应的中断触发条件,并编写中断处理函数。当触发指定的中断条件时,中断处理函数会被自动调用,我们可以在其中进行数据的发送和接收操作。 对于阻塞模式的SPI2程序,我们使用轮询的方式进行数据传输。在发送数据时,我们直接等待发送完成的标志位被置位;在接收数据时,我们通过检查接收缓冲区是否有数据来判断是否接收到了数据。 总结来说,STM32 SPI2程序是一个用于与外部设备进行数据传输的程序。它需要在初始化阶段配置SPI2的参数,并在数据传输阶段进行发送和接收的操作。无论是使用中断异步方式还是使用轮询方式,都需要合理地处理数据的发送和接收过程,以保证数据的可靠传输。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值