STM32 SPI GPIO引脚配置的一个小问题
时间:10-02
整理:3721RD
点击:
为什么在利用STM32 SPI固件库驱动串行SPI FLASH时,STM32开发板与FLASH芯片相连接的MOSI MISO引脚都配置成 复用推挽输出模式呢?FLASH芯片不也有数据通过MISO传到STM32吗,此时GPIO应该是输入模式啊?
MOSI设置成输出模式,MISO设置成输入模式
- //PB11/WP PB12/SPI2NSS PB13/SPI2CLK PB14/SPI2MISO PB15/SPI2MOSI
- void SPIInit(void)
- {
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,ENABLE);
- GPIO_InitTypeDef GPIO_InitStructure;
- //PB14 (MISO)浮空输入
- GPIO_InitStructure.GPIO_Pin=GPIO_Pin_14;
- GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
- GPIO_Init(GPIOB,&GPIO_InitStructure);
- //PB15 MOSI PB13 SCK 复用推挽输出(外设总线用)
- GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13|GPIO_Pin_15;
- GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
- GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
- GPIO_Init(GPIOB,&GPIO_InitStructure);
- //PB12 NSS,PB11 WP写保护普通推挽输出 本实验用软件控制NSS(主从设备的选择控制端)
- GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12 | GPIO_Pin_11;
- GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
- GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
- GPIO_Init(GPIOB,&GPIO_InitStructure);
-
- CE_High();//PB12/NSS 失能
如果看看GPIO配置为Alternate function时的框图,你就明白了。
当MISO的GPIO模式配置为复用推挽输出时,因为SPI模块的MISO信号在主模式时是输入而没有输出,因此下图中的Alternate Function Output信号线上没有信号,所以推挽输出的2个MOS管都是处于关闭状态,不会影响外部信号。
GPIO配置为复用推挽输出时,Alternate Function Input始终是有效的,所以SPI模块的MISO信号可以正确收到外来的信号。
这上面讲的很详细http://bbs.eeworld.com.cn/thread-253986-1-1.html
在复用模式下,gpio方向完全由内部控制,不需要程序干预
楼上的说的对,复用时GPIO由内部控制。由你设置的复用功能决定!