关于SPI,看st的例程,IO都初始化为AF_PP?

5586   2008-12-26 13:42 楼主
                                 为什么输入脚没初始化为Input?

回复评论 (11)

从哪里下载的例程?

                                  
点赞  2008-12-26 14:00

st阿, um0427。我不明白,MISO输入脚为什么也AF_PP

um0427FWLibexamplesSPIM25P64_FLASHspi_flash.c

/*******************************************************************************
* Function Name  : SPI_FLASH_Init
* Description    : Initializes the peripherals used by the SPI FLASH driver.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void SPI_FLASH_Init(void)
{
  SPI_InitTypeDef  SPI_InitStructure;
  GPIO_InitTypeDef GPIO_InitStructure;

  /* Enable SPI1 and GPIO clocks */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1 | RCC_APB2Periph_GPIOA |
                         RCC_APB2Periph_GPIO_CS, ENABLE);

  /* Configure SPI1 pins: SCK, MISO and MOSI */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
点赞  2008-12-26 14:05

很可能是写错了

                                  
点赞  2008-12-26 14:28

我也觉得很奇怪,但是能用

我下的这个库也是这样的
不过,我在使用的时候没发现问题呀!~同样的可以读数据
点赞  2008-12-26 16:26

难道是IO方向由SPI模块控制?手册上没看到阿

                                 PXJ_520 你用的什么外设?有没有at45d存储器的驱动?谢谢!
点赞  2008-12-26 16:50

IO都初始化为AF_PP

  IO都初始化为AF_PP?确实有这个问题,不只是SPI,其它外设也是差不多的情况。但是用下来,没因为这个而出问题。有时候,我把输入口(比如SPI_Master的MISO、USART_RX)设置为Input_Floating,用起来效果也差不多,没有问题。
  或许如同LS所说,IO方向由外设(SPI)模块控制;但这应该在库或者手册里面注目比较好。
点赞  2008-12-26 17:10

STM32的I/O端口配置为输出模式时,读取输入寄存器仍可得到端

请参考STM32技术参考手册中GPIO章节,I/O端口的输入功能是不能被关闭的;实际上I/O端口配置为开路输出时可以实现双向输入输出,就是应用了这个原理。

虽然是这样,对于楼主的这个SPI问题,不主张这样配置,因为这样做有可能对管脚造成损伤。
点赞  2008-12-26 17:23

配置为AF是为了使用模块功能吧??替换功能的意思

                                 就是不当IO用的意思
点赞  2008-12-27 22:51

USART1的IO设置

--取自ST的FWLib的USART中的例程:
void GPIO_Configuration(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;

#ifdef USE_STM3210B_EVAL
  /* Enable the USART2 Pins Software Remapping */
  GPIO_PinRemapConfig(GPIO_Remap_USART2, ENABLE);
#endif

  /* Configure USART1 Rx (PA.10) as input floating */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  /* Configure USART2 Rx as input floating */
  GPIO_InitStructure.GPIO_Pin = GPIO_RxPin;
  GPIO_Init(GPIOx, &GPIO_InitStructure);
  
  /* Configure USART1 Tx (PA.09) as alternate function push-pull */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  /* Configure USART2 Tx as alternate function push-pull */
  GPIO_InitStructure.GPIO_Pin = GPIO_TxPin;
  GPIO_Init(GPIOx, &GPIO_InitStructure);
}
其中,为什么PA.10是使用GPIO_Mode_IN_FLOATING而不是GPIO_Mode_AF_PP?
点赞  2008-12-31 01:17

回xzm0662


我用SPI是和一个模块通讯,没用到存储器方面的!~
点赞  2008-12-31 11:46

关于STM32的I/O端口配置复用输入功能时的用法

请看下图,这是STM32 I/O端口的功能框图,你可以在STM32的技术参考手册里看到。

STM32中每个I/O端口都有8种配置模式:
1)输入浮空
2)输入上拉
3)输入下拉
4)模拟输入
5)开漏输出
6)推挽式输出
7)推挽式复用功能
8)开漏复用功能

但没有复用输入模式,如果要使用复用输入功能如何配置端口呢?

从图中可以看到复用输入通道是从施密特触发器的输出端引出,没有控制开关,因此要使用复用输入模式,端口可以根据需要配置为输入浮空、输入上拉或输入下拉的任意一种。


那么3楼的问题如何解释呢?同样从图中看到,当端口配置为任一输出模式时,输入通道始终是处于打开的状态,也就是说复用输入通道始终是可以使用的,所以3楼那样的配置仍然能够得到正确的结果。

但同时我们也看到,因为打开了输出通道(即2个MOS管不是同时处于关闭状态),端口管脚上会有驱动信号,会与外部器件产生冲突,所以最好不要这样使用;如果没有使用外部器件连接,或使用开路输出模式,则可以利用这个特性模拟双向的I/O操作,或软件的环回模拟。
点赞  2008-12-31 12:49
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复