OpenEdv-开源电子网

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

STM32F4 探索者 SPI2实现求助

[复制链接]

5

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2015-5-8
在线时间
0 小时
发表于 2015-7-16 20:12:27 | 显示全部楼层 |阅读模式
5金钱
原子哥,我在STM32F4探索者上,根据示例,实现了通过SPI1读写25LC640芯片(SPI_BaudRatePrescaler_256);

想进一步测试能否通过SPI2读写该芯片,但是遇到问题。

我SPI2的复用引脚为:
SCK:PB10;
MOSI:PC3;
MISO:PC2;
时钟配置为SPI_BaudRatePrescaler_256,应该没有问题,但是无法读写,示波器连SCK信号都抓不住,请帮忙分析下原因。
谢谢。

[mw_shl_code=c,true]void Init_25LC640(int channel) { GPIO_InitTypeDef GPIO_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); //使能GPIOB时钟 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG, ENABLE); //使能GPIOG时钟 //GPIOB6 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; //PB6 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //输出 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //50MHz GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉 GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; //PG7 GPIO_Init(GPIOG, &GPIO_InitStructure); //初始化 GPIO_SetBits(GPIOG,GPIO_Pin_7); //PG7输出1,防止NRF干扰SPI FLASH的通信 if(channel == 1) { SPI1_Init(); //初始化SPI SPI1_SetSpeed(SPI_BaudRatePrescaler_128); //时钟需要小于2M(42/128); } else { SPI2_Init(); //初始化SPI //SPI2_SetSpeed(SPI_BaudRatePrescaler_256); //时钟需要小于2M(42/128); } CS_25LC640 = 1; //初始状态需要将片选置为未选中,否则第一次写会失败 Clear_Write_Protect_25LC640(channel); //去保护; } void SPI2_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; SPI_InitTypeDef SPI_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE); //使能GPIOC时钟 //注意:GPIOB时钟在外部调用函数中使能 RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE); //使能SPI2时钟 //GPIOB13初始化设置 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PB13~15复用功能输出 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //复用功能 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //50MHz,速度太高通讯易受干扰; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉 GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化 //GPIOC2,3初始化设置 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3; //PC2~3复用功能输出 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //复用功能 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //50MHz,速度太高通讯易受干扰; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉 GPIO_Init(GPIOC, &GPIO_InitStructure); //初始化 GPIO_PinAFConfig(GPIOB, GPIO_PinSource10, GPIO_AF_SPI2); //PB13复用为 SPI2 GPIO_PinAFConfig(GPIOC, GPIO_PinSource2, GPIO_AF_SPI2); //PB14复用为 SPI2 GPIO_PinAFConfig(GPIOC, GPIO_PinSource3, GPIO_AF_SPI2); //PB15复用为 SPI2 //这里只针对SPI口初始化 RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI2, ENABLE); //复位SPI2 RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI2, DISABLE); //停止复位SPI2 SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工 SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //设置SPI工作模式:设置为主SPI SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //设置SPI的数据大小:SPI发送接收8位帧结构 SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; //串行同步时钟的空闲状态为高电平 SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; //串行同步时钟的第二个跳变沿(上升或下降)数据被采样 SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制 SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; //定义波特率预分频的值:波特率预分频值为256 SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始 SPI_InitStructure.SPI_CRCPolynomial = 7; //CRC值计算的多项式 SPI_Init(SPI2, &SPI_InitStructure); //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器 SPI_Cmd(SPI2, ENABLE); //使能SPI外设 SPI2_ReadWriteByte(0xff); //启动传输 } [/mw_shl_code]


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2015-7-16 21:50:19 | 显示全部楼层
看上去没啥问题啊。
sck波形肯定要有才对啊。
你有不停的发送数据吧?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

5

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2015-5-8
在线时间
0 小时
 楼主| 发表于 2015-7-17 10:08:53 | 显示全部楼层
有发数据的 ,但是SCK就是没波形,SPI1就是正常的:(

我再努力努力~
回复

使用道具 举报

5

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2015-5-8
在线时间
0 小时
 楼主| 发表于 2015-7-20 10:43:39 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
原子哥,我通过PB13,PB14,PB15(该引脚被LCD模块占用,所以后来测试时将LCD禁用了)来进行SPI2的通讯,将上面代码做相关修改(Example中的设置):

SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;                     //串行同步时钟的空闲状态为高电平
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;                  //串行同步时钟的第二个跳变沿(上升或下降)数据被采样

通讯成功。
但是接到PB10(SCK),PC2及PC3上仍然失败,读出的是全0。

那么,针对不同的引脚,SPI_CPOL以及SPI_CPHA的设置需要取不同的值吗?
或者,在STM32F4探索者开发板中,PB10被直接拉低或者拉高了呢?我看PB10跟COM3有点关系,被单独拎到了P10模块。

刚学习,问题可能有些小白,谢谢啦。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2015-7-20 23:08:51 | 显示全部楼层
回复【4楼】backroad:
---------------------------------
是相同的值的。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

19

主题

87

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
302
金钱
302
注册时间
2015-9-2
在线时间
83 小时
发表于 2015-10-31 19:12:15 | 显示全部楼层
回复【5楼】正点原子:
---------------------------------
原子哥,最近我也在写SPI通信,用到的也是SPI2 B10,PC2,3 这一组IO 有相同的问题,想请问是不是f407的片子这组IO复用SPI2都有问题?
我用软件仿真看下来在正常初始化后   进行到u8 SPI1_ReadWriteByte(u8 TxData)这个函数向SPI_DR这个寄存器写发射数据的时候是写不进去的,就是执行后里面的值依旧为0x00,求解答,谢谢
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2015-11-1 21:43:14 | 显示全部楼层
回复【6楼】MasterSU:
---------------------------------
差配置.不可能是IO问题.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

7

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
199
金钱
199
注册时间
2014-10-19
在线时间
32 小时
发表于 2015-11-13 13:56:22 | 显示全部楼层
我也遇到相似问题
回复

使用道具 举报

7

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
199
金钱
199
注册时间
2014-10-19
在线时间
32 小时
发表于 2015-11-15 21:29:59 | 显示全部楼层
楼主你解决了没?
回复

使用道具 举报

16

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
140
金钱
140
注册时间
2015-2-12
在线时间
10 小时
发表于 2015-12-29 16:18:36 | 显示全部楼层
SPI2初始化的时候,好像没看见PB时钟开启?
回复

使用道具 举报

1

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
144
金钱
144
注册时间
2016-3-4
在线时间
34 小时
发表于 2016-5-21 20:29:57 | 显示全部楼层
本帖最后由 罗楚江 于 2016-5-21 20:32 编辑

请问楼主在设置SPI2_SetSpeed(SPI_BaudRatePrescaler_256)时,为什么要把这个代码注释掉?SPI2不需要进行速度设置吗?
回复

使用道具 举报

4

主题

49

帖子

0

精华

初级会员

Rank: 2

积分
193
金钱
193
注册时间
2016-1-14
在线时间
42 小时
发表于 2016-5-21 21:46:18 | 显示全部楼层
我也遇到过这个SPI2的问题,初始化设置完成然后发送0xff启动传输的时候,硬仿卡在了等待SPI2空闲的地方,后来我改成了SPI3就就行了。
回复

使用道具 举报

1

主题

11

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2016-5-23
在线时间
6 小时
发表于 2016-5-23 17:19:13 | 显示全部楼层
前面我也遇到SPI1复用的问题,其实就是复用的时候的配置不对,还有就是端口可能其它地方占用了。
回复

使用道具 举报

4

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2017-8-2
在线时间
17 小时
发表于 2017-8-29 11:17:33 | 显示全部楼层
楼主,解决了吗,我也遇到这种问题
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2017-5-22
在线时间
10 小时
发表于 2017-11-6 14:46:25 | 显示全部楼层
我也碰到spi2的问题,改到spi1就可以,实在不知道哪里的配置有问题
回复

使用道具 举报

20

主题

89

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
331
金钱
331
注册时间
2015-7-6
在线时间
61 小时
发表于 2018-1-10 17:31:28 | 显示全部楼层
菜鸟上路 发表于 2017-11-6 14:46
我也碰到spi2的问题,改到spi1就可以,实在不知道哪里的配置有问题

你好,SPI2的问题解决了吗?我现在也遇到这个问题,SCK没有信号
回复

使用道具 举报

20

主题

89

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
331
金钱
331
注册时间
2015-7-6
在线时间
61 小时
发表于 2018-1-10 17:31:39 | 显示全部楼层
快乐之路 发表于 2017-8-29 11:17
楼主,解决了吗,我也遇到这种问题

你好,SPI2的问题解决了吗?我现在也遇到这个问题,SCK没有信号
回复

使用道具 举报

1

主题

9

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2017-11-1
在线时间
3 小时
发表于 2018-7-5 20:48:25 | 显示全部楼层
kekehuhu 发表于 2018-1-10 17:31
你好,SPI2的问题解决了吗?我现在也遇到这个问题,SCK没有信号

我逐一进行了测试,发现PC2的端口不正常,其他两个可以,怀疑开发板上有冲突,但是没找到
回复

使用道具 举报

1

主题

9

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2017-11-1
在线时间
3 小时
发表于 2018-7-5 20:49:47 | 显示全部楼层
kekehuhu 发表于 2018-1-10 17:31
你好,SPI2的问题解决了吗?我现在也遇到这个问题,SCK没有信号

SCK有信号的,正常;但是MISO设置为PC2的时候就不行,设置为PB14的时候一切正常,通信没问题,郁闷中
回复

使用道具 举报

1

主题

9

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2017-11-1
在线时间
3 小时
发表于 2018-7-5 20:54:21 | 显示全部楼层
正点原子 发表于 2015-11-1 21:43
回复【6楼】MasterSU:
---------------------------------
差配置.不可能是IO问题.

有没有可能是板子上的兼容问题?我逐一做了替换,发现只有PC2作为SPI时引脚是不正常的。
回复

使用道具 举报

15

主题

59

帖子

0

精华

初级会员

Rank: 2

积分
196
金钱
196
注册时间
2014-7-17
在线时间
21 小时
发表于 2018-7-10 20:44:12 | 显示全部楼层
我是飞鸟 发表于 2018-7-5 20:54
有没有可能是板子上的兼容问题?我逐一做了替换,发现只有PC2作为SPI时引脚是不正常的。

我今天发现,PC2作为SPI2的MISO连接一个外部的模块时,会将该模块的这个引脚的电压拉低,原本3.3V的输出变成了1V不到,所以大家读不到数据。但是,当PC2直接连接开发板上面的3.3V时,可以正确读出FF。我不知道是什么原因导致的,请原子哥解答。
回复

使用道具 举报

22

主题

64

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
279
金钱
279
注册时间
2017-11-21
在线时间
70 小时
发表于 2018-10-2 15:35:51 | 显示全部楼层
请问 GPIO_SetBits(GPIOG,GPIO_Pin_7);                         //PG7输出1,防止NRF干扰SPI FLASH的通信
回复

使用道具 举报

22

主题

64

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
279
金钱
279
注册时间
2017-11-21
在线时间
70 小时
发表于 2018-10-2 15:36:43 | 显示全部楼层
GPIO_SetBits(GPIOG,GPIO_Pin_7);                         //PG7输出1,防止NRF干扰SPI FLASH的通信        请问这行代码到底是为什么?不明白,能解释一下吗?没看懂注释
回复

使用道具 举报

0

主题

2

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2020-7-27
在线时间
16 小时
发表于 2020-10-23 09:10:33 来自手机 | 显示全部楼层
请问楼主现在实现了吗pc2 pc3做spi
回复

使用道具 举报

53

主题

567

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2099
金钱
2099
注册时间
2017-2-11
在线时间
306 小时
发表于 2020-10-23 15:04:59 | 显示全部楼层
这个应该是没问题的,看看管脚是不是外部信号拉低导致了,我一直用这个管脚作为   MCU和FPGA的 SPI通讯,没发现有问题
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-4-29 18:02

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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