项目场景:
课程设计(基于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口使用可参考如下配置:
- 使用spi3接口, 参考 卢有亮 老师的教程 [BP19_网络PING实验], 该套代码实现了该项功能
- 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无法使用。