[STM32F1] SPI GPIO引脚配置

[复制链接]
1568|11
 楼主| kangzj 发表于 2021-8-14 13:08 | 显示全部楼层 |阅读模式
为什么在利用STM32 SPI固件库驱动串行SPI FLASH时,STM32开发板与FLASH芯片相连接的MOSI MISO引脚都配置成 复用推挽输出模式呢?FLASH芯片不也有数据通过MISO传到STM32吗,此时GPIO应该是输入模式啊??
stly 发表于 2021-8-14 13:09 | 显示全部楼层
MOSI设置成输出模式,MISO设置成输入模式
pengf 发表于 2021-8-14 13:12 | 显示全部楼层

//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  失能
renyaq 发表于 2021-8-14 13:14 | 显示全部楼层
如果看看GPIO配置为Alternate function时的框图,你就明白了。
当MISO的GPIO模式配置为复用推挽输出时,因为SPI模块的MISO信号在主模式时是输入而没有输出,因此下图中的Alternate Function Output信号线上没有信号,所以推挽输出的2个MOS管都是处于关闭状态,不会影响外部信号。
GPIO配置为复用推挽输出时,Alternate Function Input始终是有效的,所以SPI模块的MISO信号可以正确收到外来的信号。
juventus9554 发表于 2021-8-14 13:16 | 显示全部楼层
楼上正点,是不是楼主看的例子有问题。
 楼主| kangzj 发表于 2021-8-14 13:20 | 显示全部楼层
嗯,我再好好缕一缕吧,有了好消息及时通知大家
呐咯密密 发表于 2021-8-25 17:34 来自手机 | 显示全部楼层
这里不用纠结这个,这是由于GPIO的特性导致的,即使你配置成输出,GPIO的数据寄存器也能储存数据,在输出模式下去读寄存器同样可以过得数据
foxsbig 发表于 2021-8-26 10:18 | 显示全部楼层
呐咯密密 发表于 2021-8-25 17:34
这里不用纠结这个,这是由于GPIO的特性导致的,即使你配置成输出,GPIO的数据寄存器也能储存数据,在输出模 ...

配置成输出,还可以作为输入用?
呐咯密密 发表于 2021-8-26 10:32 | 显示全部楼层
foxsbig 发表于 2021-8-26 10:18
配置成输出,还可以作为输入用?

如果只是数据读取是可以的,你可以观察一下GPIO的数据寄存器,即使你配置成输出,如果有数据进来,还是会被存到数据寄存器中,你去读这个寄存器是可以读到数据的。所以有的SPI把MOSI和MISO都配置成输出,不影响使用。
foxsbig 发表于 2021-8-26 10:36 | 显示全部楼层
呐咯密密 发表于 2021-8-26 10:32
如果只是数据读取是可以的,你可以观察一下GPIO的数据寄存器,即使你配置成输出,如果有数据进来,还是会 ...

这个确实没注意过,
回头试试
试试推挽输出,和漏极开路这两种情况,对我来说就差不多了
tpgf 发表于 2021-9-9 09:39 | 显示全部楼层
输入输出模式应该也是可以的吧
labasi 发表于 2021-9-9 09:41 | 显示全部楼层
这额说不好  是不是涉及到电平的问题啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

672

主题

7007

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部