OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4745|回复: 10

求助:STM32使用SPI1时,PA4无法做普通IO口使用吗?

[复制链接]

19

主题

38

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
358
金钱
358
注册时间
2015-11-8
在线时间
52 小时
发表于 2016-8-16 10:17:45 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 lg75 于 2016-8-17 15:49 编辑

使用STM32 的PA4脚作为普通IO口来控制CS,但是发现只要执行了SPI_Cmd(SPI1, ENABLE),则后面PA4无法再拉低至V=0v,而是V=2.3v,通过示波器看到在进行读写操作时,通讯过程中PA4有变化,感觉应该是STM32在自动控制PA4。
请高手指教,多谢!多谢!
=====================================================
1. PCB没问题,因为不执行SPI_Cmd(SPI1, ENABLE)时,PA4作为普通IO操作完全正常。
2. 已经将SPI_InitStructure.SPI_NSS = SPI_NSS_Soft。
3.看到网上说要执行SPI_SSOutputCmd(SPI1, ENABLE),但是好像没用哦。
=====================================================


static void W25Q16_Configuration(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        SPI_InitTypeDef  SPI_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO | RCC_APB2Periph_SPI1, ENABLE);

        /*-----------------端口配置-------------------*/
        /* SPI1_SCK SPI1_MISO SPI1_MOSI*/
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_Init(GPIOA, &GPIO_InitStructure);

        /* FLASH_CS */
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_Init(GPIOA, &GPIO_InitStructure);

//在没有初始化SPI1时,PA4是可以正常当作普通IO来使用的。
GPIO_SetBits(GPIOA, GPIO_Pin_4);//可以拉高,V=3.3v
GPIO_ResetBits(GPIOA, GPIO_Pin_4); //可以拉低,V=0v


        /*-----------------SPI配置--------------------*/
        SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
        SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
        SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
        SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
        SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
       SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
        SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;
        SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
        SPI_InitStructure.SPI_CRCPolynomial = 7;
        SPI_Init(SPI1, &SPI_InitStructure);

        /* SPI使能 */
        SPI_Cmd(SPI1, ENABLE); //执行过后,则后面PA4无法再拉低至V=0v  
         
//下面这两句无论执行哪一句,都没效果。
//SPI_SSOutputCmd(SPI1, ENABLE);
//SPI_SSOutputCmd(SPI1, DISABLE);

GPIO_SetBits(GPIOA, GPIO_Pin_4);//可以拉高,V=3.3v
GPIO_ResetBits(GPIOA, GPIO_Pin_4); //无法拉低!!!!!! 只能到V=2.3v

}

最佳答案

查看完整内容[请看2#楼]

不好意思,现在才结贴,这个问题是板子故障,程序没问题。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

19

主题

38

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
358
金钱
358
注册时间
2015-11-8
在线时间
52 小时
 楼主| 发表于 2016-8-16 10:17:46 | 显示全部楼层
不好意思,现在才结贴,这个问题是板子故障,程序没问题。
回复

使用道具 举报

25

主题

281

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2504
金钱
2504
注册时间
2015-8-17
在线时间
383 小时
发表于 2016-8-16 10:29:44 | 显示全部楼层
[mw_shl_code=c,true]void SPI2_Init(void)
{
        SPI_InitTypeDef SPI_InitStruct;
        GPIO_InitTypeDef GPIO_InitStruct;
        //ê1Äüê±Öó
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);//¿aÆôSPI2ê±Öó
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//¿aÆôGPIOBê±Öó
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);//¿aÆôGPIODê±Öó
        //3õê¼»ˉGPIO¿ú
        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
        GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStruct);
        GPIO_SetBits(GPIOB, GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15);//à-¸ßμçÆ½
        //3õê¼»ˉRST DC
        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_InitStruct.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;
        GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOD, &GPIO_InitStruct);
        GPIO_SetBits(GPIOD, GPIO_Pin_8 | GPIO_Pin_9);//à-¸ßμçÆ½
        //3õê¼»ˉSPI2
        SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;//ê1óÃ2·ÖÆμ
        SPI_InitStruct.SPI_CPHA = SPI_CPHA_1Edge;//Ôúμúò»¸öìø±äÑØ±»2é¼ˉ
        SPI_InitStruct.SPI_CPOL = SPI_CPOL_Low;//¿ÕÏD¼«DÔÎaμíμçÆ½
        SPI_InitStruct.SPI_CRCPolynomial = 7;//CRCD£¼ì
        SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b;//′«êäêy¾Y3¤¶è
        SPI_InitStruct.SPI_Direction = SPI_Direction_2Lines_FullDuplex;//Ë«Ïßè«Ë«1¤
        SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_MSB;//Ïè′«¸ß×Ö½ú
        SPI_InitStruct.SPI_Mode = SPI_Mode_Master;//Ö÷»úÄ£ê½
        SPI_InitStruct.SPI_NSS = SPI_NSS_Soft;//Ƭѡ·½ê½Îaèí¼t
        SPI_Init(SPI2, &SPI_InitStruct);
        SPI_Cmd(SPI2, ENABLE);//ê1ÄüSPI2
}[/mw_shl_code]
这是我的,不过是PD的,CS不是要配置成GPIO_Mode_AF_PP吗?好像SPI里有控制这个引脚的功能。我也没配置,我就一个设备,直接拉低或不接就好了。
做事的原则:
1.每个问题重复三遍、研究三遍后再提问,直接得到答案的人什么都没学会。
2.做事要有始有终,感谢那些帮助自己解决问题的人,把解决的方法总结起来。
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11544
金钱
11544
注册时间
2014-4-1
在线时间
1315 小时
发表于 2016-8-16 10:31:49 | 显示全部楼层

关键是,你把PA4配置成了AF功能还是普通IO。
即使启用了SPI功能,每个管脚仍然可以单独配置,想做什么都行。



回复

使用道具 举报

19

主题

38

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
358
金钱
358
注册时间
2015-11-8
在线时间
52 小时
 楼主| 发表于 2016-8-16 10:40:09 | 显示全部楼层
xuande 发表于 2016-8-16 10:31
关键是,你把PA4配置成了AF功能还是普通IO。
即使启用了SPI功能,每个管脚仍然可以单独配置,想做什么都 ...

PA567是配制成SPI,  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

PA4是是配制成普通输出IO,GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;


       /*-----------------端口配置-------------------*/
        /* SPI1_SCK SPI1_MISO SPI1_MOSI*/
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_Init(GPIOA, &GPIO_InitStructure);

        /* FLASH_CS */
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
回复

使用道具 举报

19

主题

38

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
358
金钱
358
注册时间
2015-11-8
在线时间
52 小时
 楼主| 发表于 2016-8-16 10:42:57 | 显示全部楼层
wszdxmh 发表于 2016-8-16 10:29
[mw_shl_code=c,true]void SPI2_Init(void)
{
        SPI_InitTypeDef SPI_InitStruct;

因为PA4本来就是SPI1的NSS,现在我不想使用PA4做NSS,而只是用来做片选,我想自己完全来控制,和你的情况不太一样。

其实如果我换衣个普通的IO口,也不会有任何问题,我现在只是想搞明白PA4能不能做 SPI1的CS片选。
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11544
金钱
11544
注册时间
2014-4-1
在线时间
1315 小时
发表于 2016-8-16 10:44:31 | 显示全部楼层
lg75 发表于 2016-8-16 10:40
PA567是配制成SPI,  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

PA4是是配制成普通输出IO,GP ...


这要你自己去查。
建议你看寄存器的值,再没有比这更直接、更触及灵魂了。


回复

使用道具 举报

19

主题

38

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
358
金钱
358
注册时间
2015-11-8
在线时间
52 小时
 楼主| 发表于 2016-8-16 14:42:54 | 显示全部楼层
本帖最后由 lg75 于 2016-8-17 08:22 编辑

这个问题没别人遇到?

请原子哥出来指点一下哦。
回复

使用道具 举报

19

主题

38

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
358
金钱
358
注册时间
2015-11-8
在线时间
52 小时
 楼主| 发表于 2016-8-17 08:23:44 | 显示全部楼层
这个问题其实看似简单,网上也有一些文章和代码,其实都是理论分析的多,不知哪位实际操作过,还请指教。
回复

使用道具 举报

19

主题

38

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
358
金钱
358
注册时间
2015-11-8
在线时间
52 小时
 楼主| 发表于 2016-8-17 15:49:24 | 显示全部楼层

这个问题其实看似简单,网上也有一些文章和代码,其实都是理论分析的多,不知哪位实际操作过,还请指教。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2016-8-17 19:37:31 | 显示全部楼层
PA4肯定是可以单独做CS控制的。
你这个不行,怀疑是寄存器配置不到位,在使能SPI前后,检查PA4的寄存器描述。主要是CRL的状态。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-9 06:22

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表