您的位置:首页 > 其它

STM32的SPI学习笔记

2017-12-15 08:56 267 查看
下面直接介绍SPI的STM32源码解析

GPIO_InitTypeDef GPIO_InitStructure;

//定义一个GPIO初始化的结构体变量

        SPI_InitTypeDef  SPI_InitStructure;

//定义一个SPI初始化的结构体变量

RCC_APB2PeriphClockCmd(
RCC_APB2Periph_GPIOB, ENABLE );
RCC_APB1PeriphClockCmd(
RCC_APB1Periph_SPI2,  ENABLE );

  //开启对应引脚时钟和SPI的时钟,一般的STM32有两个SPI(硬件SPI)
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;

// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
//配置SPI相应的端口,为复用推挽输出

// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;   

// GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_IN_FLOATING;  

// GPIO_Init(GPIOB, &GPIO_InitStructure);
//上面程序时我做的一个测试将主机的MISO配置成输入,也是可行的,但是没弄懂他为什么都配置输出

  GPIO_SetBits(GPIOB,GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);

SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; 

//SPI在设置有几种模式,例如两线只读,1线只读,1线只写等,我们这里用的双线双向全双工

SPI_InitStructure.SPI_Mode = SPI_Mode_Master;

//SPI通讯时分为主机和从机,这个根据需求设定,一般为主机

SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b;

//通讯数据位,就是一次传输数据的个数,可以是16位,也可是八位

SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;

SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;

//这个是SPI的四种模式选择,第一个空闲状态电平的高低,顾名思义即看总线不发数据时电平是为高,还是为低

//第二个是数据在第几个边沿采集,看CLK的跳变是在哪一个,以上这些需要根据时钟时序来进行分析,时序分析可以直接搜四种模式的区别,有详细介绍

SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;

//NSS引脚控制是由软件控制,还是硬件,大多数都是软件控制,这个原因是因为STM32自身存在缺陷(网上查找资料说的)

SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;

//这是SPI通讯的波特率,根据SPI通信时序图计算CLK的时钟周期长度,对应的转化为频率即可

SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;

//这个是设置SPI铜须数据是高位在前还是低位在前

SPI_InitStructure.SPI_CRCPolynomial = 7;

//这个是CRC校验计算的方式选择,一般没有用到可以注释掉
SPI_Init(SPI2, &SPI_InitStructure);  
//使能SPI
SPI_Cmd(SPI2, ENABLE); 

//开启SPI

SPI通讯中另一个需要注意的问题就是:SPI的MISO和MOSI,MISO是主设备数据输入,从设备数据输出,MOSI是主设备数据输出,从设备数据输入。即我们需要注意我们接线是,主机的MISO接从机的MISO,主机的MOSI接从机的MOSI。
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: