OpenEdv-开源电子网

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

SPI的IO口初始化

[复制链接]

31

主题

81

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
329
金钱
329
注册时间
2016-6-5
在线时间
53 小时
发表于 2016-8-26 17:25:45 | 显示全部楼层 |阅读模式
1金钱
void SPI2_Init(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
  SPI_InitTypeDef  SPI_InitStructure;

        RCC_APB2PeriphClockCmd(        RCC_APB2Periph_GPIOB, ENABLE );//PORTB时钟使能
        RCC_APB1PeriphClockCmd(        RCC_APB1Periph_SPI2,  ENABLE );//SPI2时钟使能        

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //PB13/14/15复用推挽输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB

        GPIO_SetBits(GPIOB,GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);  //PB13/14/15上拉

        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_2Edge;        //串行同步时钟的第二个跳变沿(上升或下降)数据被采样
        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);//启动传输                 


}   

程序为什么要将         GPIO_SetBits(GPIOB,GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);  //PB13/14/15上拉 ,这几个IO口设置为上拉,不设置可以吗?开发指南还是哪里有说?
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

42

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
406
金钱
406
注册时间
2015-7-2
在线时间
120 小时
发表于 2016-8-26 17:25:46 | 显示全部楼层
回复

使用道具 举报

4

主题

54

帖子

0

精华

初级会员

Rank: 2

积分
145
金钱
145
注册时间
2015-4-18
在线时间
17 小时
发表于 2016-8-26 23:11:50 | 显示全部楼层
STM32中文参考手册_V10版本,111页
回复

使用道具 举报

31

主题

81

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
329
金钱
329
注册时间
2016-6-5
在线时间
53 小时
 楼主| 发表于 2016-8-29 15:00:37 | 显示全部楼层

我的意思是为什么要将PB13/14/15这3个IO口设置为高电平?
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11539
金钱
11539
注册时间
2014-4-1
在线时间
1314 小时
发表于 2016-8-29 15:14:44 | 显示全部楼层
247470035 发表于 2016-8-29 15:00
我的意思是为什么要将PB13/14/15这3个IO口设置为高电平?


此时的高电平、低电平都无所谓,不能产生有效的通信。


回复

使用道具 举报

31

主题

81

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
329
金钱
329
注册时间
2016-6-5
在线时间
53 小时
 楼主| 发表于 2016-8-29 15:46:35 | 显示全部楼层
xuande 发表于 2016-8-29 15:14
此时的高电平、低电平都无所谓,不能产生有效的通信。

那就随便设置咯
回复

使用道具 举报

16

主题

197

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
457
金钱
457
注册时间
2012-4-20
在线时间
91 小时
发表于 2016-8-29 16:27:35 | 显示全部楼层

这是防止不确定电平信号的干扰。接收芯片的引脚如果没有规定的外加电平就很容易把空间干扰感应电能当做电平信号造成误动作。所以初始化该怎么设定都必须对应设置,否则就会出现莫名其妙的意外。
回复

使用道具 举报

31

主题

81

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
329
金钱
329
注册时间
2016-6-5
在线时间
53 小时
 楼主| 发表于 2016-8-29 16:34:02 | 显示全部楼层
ba5rw 发表于 2016-8-29 16:27
这是防止不确定电平信号的干扰。接收芯片的引脚如果没有规定的外加电平就很容易把空间干扰感应电能当做电 ...

那你这样说的话,就必须设置一个电平,不论高低都行,就是不能悬空咯
回复

使用道具 举报

16

主题

197

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
457
金钱
457
注册时间
2012-4-20
在线时间
91 小时
发表于 2016-8-29 16:36:39 | 显示全部楼层
本帖最后由 ba5rw 于 2016-8-29 16:38 编辑
247470035 发表于 2016-8-29 16:34
那你这样说的话,就必须设置一个电平,不论高低都行,就是不能悬空咯

不是的,如果下沿触发就必须先设成高电平。设成低电平在通信商应该没有问题,但是与后续电路可能会有灌电流,耗电却又可能有问题……一般都是设置成高电平的。
回复

使用道具 举报

31

主题

81

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
329
金钱
329
注册时间
2016-6-5
在线时间
53 小时
 楼主| 发表于 2016-8-29 16:39:37 | 显示全部楼层
ba5rw 发表于 2016-8-29 16:36
不是的,如果下沿触发就必须先设成高电平。

那SPI是上升沿触发还是下降沿啊?哪里有说?
回复

使用道具 举报

6

主题

110

帖子

0

精华

高级会员

Rank: 4

积分
553
金钱
553
注册时间
2014-10-23
在线时间
195 小时
发表于 2016-8-29 16:45:33 | 显示全部楼层
247470035 发表于 2016-8-29 16:39
那SPI是上升沿触发还是下降沿啊?哪里有说?

看看这个

spi.png
回复

使用道具 举报

16

主题

197

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
457
金钱
457
注册时间
2012-4-20
在线时间
91 小时
发表于 2016-8-29 16:46:00 | 显示全部楼层
247470035 发表于 2016-8-29 16:39
那SPI是上升沿触发还是下降沿啊?哪里有说?

不同的设备恐怕不一样吧,举个协议例子:
SPI是一个环形总线结构,由ss(cs)、sck、sdi、sdo构成,其时序其实很简单,主要是在sck的控制下,两个双向移位寄存器进行数据交换。

假设下面的8位寄存器装的是待发送的数据10101010,上升沿发送、下降沿接收、高位先发送。

那么第一个上升沿来的时候 数据将会是sdo=1;寄存器=0101010x。下降沿
到来的时候,sdi上的电平将锁存到寄存器中去,那么这时寄存器=0101010sdi,这样在 8个时钟脉冲以后,两个寄存器的内容互相交换一次。这样就完成了一个spi时序。
回复

使用道具 举报

31

主题

81

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
329
金钱
329
注册时间
2016-6-5
在线时间
53 小时
 楼主| 发表于 2016-8-29 16:55:03 | 显示全部楼层

那就是说通过时钟相位(CPHA)和时钟极性(CPOL)共同来决定是上升沿触发还是下降沿触发咯?
回复

使用道具 举报

6

主题

110

帖子

0

精华

高级会员

Rank: 4

积分
553
金钱
553
注册时间
2014-10-23
在线时间
195 小时
发表于 2016-8-30 09:01:56 | 显示全部楼层
247470035 发表于 2016-8-29 16:55
那就是说通过时钟相位(CPHA)和时钟极性(CPOL)共同来决定是上升沿触发还是下降沿触发咯?

CPOL决定空闲电平是高还是低
CPHA决定是第一个还是第二个跳变沿采样
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-29 06:15

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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