PB6和PB7分别是模拟SPI接口的si和SO信号,SI作为输出,SO作为输入,输入配置为上拉输入,正常来说,不管怎样配置PB7,都不会改变它引脚的电平,但是我经过示波器查看得知,我配置的高低电平均生效,这个是错误的,因为既然是输入信号,肯定是有输入源决定的,我配置其他的引脚向PD6,PD7都可以的,它们不是管脚复用的,我怀疑是管脚复用的问题,但是也一直不得解,求大侠帮忙,最好是有代码配置的。
我不得不给你看看GPIO的结构图,如下:
看到没有,如果你把IO配置为输入的话,输出回路的那个开关就断开了,输出寄存器的值不会影响到输入状态的。注意看,输入回路有上拉开关和下拉开关,而这个上下拉开关就是由输出寄存器来控制的。你说你配置的高低电平能生效,如果你的硬件电路没问题,而你又是配置的输入的话,只有一种情况,那就是你把IO配置为上下拉输入了。比如像下面的代码:
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; 或者:
在GPIO_Init这个函数中,会判断你配置的GPIO_Mode,如果是GPIO_Mode_IPU
或GPIO_Mode_IPD的话,它会有下面的代码来设置输出寄存器为高或为低:
所以,你配置为浮空输入就好了,像下面这样:
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;追问
你说的我也都理解的,就是这样的,我配置为上拉或下拉就都生效,输入模式是浮空时就不能配置成功。但是我配置PD6为上拉输入就不会配置生效的,所以我怀疑是PB6/PB7是复用管教的问题,求解,我用gpio模拟SPI总线来做的,一直访问不了spi总线,访问的vs1063a,大侠求解。
追答首先确定你没有使能复用功能,PB6/PB7的复用有I2C和UART1。
确定你的MISO配置为浮空输入,MOSI、CLK、CS都配置为推挽输出。
确定你的SPI模拟时序没问题,如果你的板子上有SPI FLASH,尝试用你的SPI模拟程序去读FLASH试试。
确定你的SPI时钟频率小于vs1063a的最大频率。
如果你觉得是IO问题,你把SPI的CLK,MISO,MOSI移到其他IO上再试试。
我没有使用复用功能。我只开启了gpiob的时钟,然后就配置si,clk为GPIO_MODE_OUT_PP,so为GPIO_MODE_IPU,也试过GPIO_MODE_INFLOATING,不知道到底设为哪个才正确,两个都设置过实验了,就是不能读取VS1063寄存器的值,还有时钟的问题,我不知道到底要延时多久,我发现我延时时间短读取的是0,错误的,延时时间长读取的是其他的也不正确,忘大侠继续赐教。
追答那就一定是软件问题了,你要看看手册,VS1063的SPI是0模式还是3模式,空闲时CLK是高电平还是低电平。
追问我没有对vs1063做任何操作,datasheet中默认的是新模式。这个不影响vs1063的SCI操作的,我要用stm32的pb6,pb7,pd7分别模拟si,so,sclk控制vs1063芯片的sci操作,不管怎样操作,我读取的寄存器全是ffff,就是读取错误。大侠说下qq或者邮箱,我跟你联系。谢谢大侠了,最后搞出来了,不是软件的问题,是硬件的电源反了,晶振错了。
本回答被提问者采纳