STM32 SPI及IIC

本文基于STM32cubmx及HAL库

文章目录


前言

参考资料:《STM32中文参考手册》

《野火HAL库开发指南》


一、SPI配置方法

认识spi:

串行外设接口(SPI)允许芯片与外部设备以半/全双工、同步、串行方式通信。此接口可以被配置
成主模式,并为外部从设备提供通信时钟(SCK)。接口还能以多主配置方式工作。
它可用于多种用途,包括使用一条双向数据线的双线单工同步传输,还可使用CRC校验的可靠
通信。
spi包括主从模式,在spi通讯中,要包含一个主设备(只能有一个),和一个或者多个从设备,提供时钟的为主设备,接受时钟的为从设备,其接口的读写操作均为SPI片选信号管理,多个从设备由各自的片选信号决定
spi工作方式
STM32 SPI及IIC_第1张图片
由图看出,spi总共有四条总线(上图左端)
MISO :主设备输入 / 从设备输出引脚。该引脚在从模式下发送数据,在主模式下接收数据。
MOSI :主设备输出 / 从设备输入引脚。该引脚在主模式下发送数据,在从模式下接收数据。
SCK :串口时钟,作为主设备的输出,从设备的输入
NSS :从设备选择。这是一个可选的引脚,用来选择主 / 从设备。它的功能是用来作为“片
选引脚”,让主设备可以单独地与特定从设备通讯,避免数据线上的冲突。从设备的 NSS
引脚可以由主设备的一个标准 I/O 引脚来驱动。一旦被使能 (SSOE ) NSS 引脚也可以作为
输出引脚,并在 SPI 处于主模式时拉低;此时,所有的 SPI 设备,如果它们的 NSS 引脚连接
到主设备的 NSS 引脚,则会检测到低电平,如果它们被设置为 NSS 硬件模式,就会自动进
入从设备状态。当配置为主设备、 NSS 配置为输入引脚 (MSTR=1 SSOE=0) 时,如果 NSS
被拉低,则这个 SPI 设备进入主模式失败状态:即 MSTR 位被自动清除,此设备进入从模式
时钟信号的相位和极性
SPI_CR 寄存器的 CPOL CPHA 位,能够组合成四种可能的时序关系。 CPOL( 时钟极性 ) 位控制
在没有数据传输时时钟的空闲状态电平,此位对主模式和从模式下的设备都有效。如果 CPOL
’0’ SCK 引脚在空闲状态保持低电平;如果 CPOL 被置 ’1’ SCK 引脚在空闲状态保持高电平。
如果 CPHA( 时钟相位 ) 位被置 ’1’ SCK 时钟的第二个边沿 (CPOL 位为 0 时就是下降沿, CPOL
’1’ 时就是上升沿 ) 进行数据位的采样,数据在第二个时钟边沿被锁存。如果 CPHA 位被清 ’0’
SCK 时钟的第一边沿 (CPOL 位为 ’0’ 时就是下降沿, CPOL 位为 ’1’ 时就是上升沿 ) 进行数据位采
样,数据在第一个时钟边沿被锁存。
CPOL时钟极性和 CPHA 时钟相位的组合选择数据捕捉的时钟边沿。
212 显示了 SPI 传输的 4 CPHA CPOL 位组合。此图可以解释为主设备和从设备的 SCK 脚、
MISO 脚、 MOSI 脚直接连接的主或从时序图。

使用SPI通信驱动OLED

配置时钟

STM32 SPI及IIC_第2张图片

 

STM32 SPI及IIC_第3张图片

 

打开任一SPI

STM32 SPI及IIC_第4张图片
如果需要DMA则自行打开
配置IO口,(为OLED选择,均配置为输出模式)

STM32 SPI及IIC_第5张图片

将对应引脚连在一起

二、配置IIC

认识iic:

I 2 C 简介
I 2 C( 芯片间 ) 总线接口连接微控制器和串行 I 2 C 总线。它提供多主机功能,控制所有 I 2 C 总线特定的
时序、协议、仲裁和定时。支持标准和快速两种模式,同时与 SMBus 2.0 兼容。
I 2 C 模块有多种用途,包括 CRC 码的生成和校验、 SMBus( 系统管理总线— System Management
Bus) PMBus( 电源管理总线— Power Management Bus)
根据特定设备的需要,可以使用 DMA 以减轻 CPU 的负担。
I 2 C 功能描述
I 2 C 模块接收和发送数据,并将数据从串行转换成并行,或并行转换成串行。可以开启或禁止中
断。接口通过数据引脚 (SDA) 和时钟引脚 (SCL) 连接到 I 2 C 总线。允许连接到标准 ( 高达 100kHz)
快速 ( 高达 400kHz) I 2 C 总线。
24.3.1 模式选择
接口可以下述 4 种模式中的一种运行:
● 从发送器模式
● 从接收器模式
主发送器模式
主接收器模式
该模块默认地工作于从模式。接口在生成起始条件后自动地从从模式切换到主模式;当仲裁丢
失或产生停止信号时,则从主模式切换到从模式。允许多主机功能。
通信流
主模式时, I 2 C 接口启动数据传输并产生时钟信号。串行数据传输总是以起始条件开始并以停止
条件结束。起始条件和停止条件都是在主模式下由软件控制产生。
从模式时, I 2 C 接口能识别它自己的地址 (7 位或 10 ) 和广播呼叫地址。软件能够控制开启或禁止
广播呼叫地址的识别。
数据和地址按 8 / 字节进行传输,高位在前。跟在起始条件后的 1 2 个字节是地址 (7 位模式为 1
个字节, 10 位模式为 2 个字节 ) 。地址只在主模式发送。
在一个字节传输的 8 个时钟后的第 9 个时钟期间,接收器必须回送一个应答位 (ACK)给发送器。
iic功能框图
STM32 SPI及IIC_第6张图片

 

其中,SDA是串行数据线的缩写,SCL是串行时钟线的缩写,IIC与SPI不同在于,IIC可以有多个主机设备,也可以有多个从机设备

运行方式

当主设备开始通讯时,先将SDA的线从高压电平切换至低压电平,然后将SCL从高电平切换至低电平,主设备会给从设备发送位数据,已经相应的读/写位,从机接受应答。

配置IIC

前面时钟配置与SPI相同

STM32 SPI及IIC_第7张图片​​​​​​​

三、移植SPI驱动OLED,IIC驱动MPU6050

链接:https://pan.baidu.com/s/14EJg1DGQ_yidylUeCi7wtA 
提取码:2f2w

函数等基本上都包含了

获取MPU6050数据在主函数添加下列代码

 while(mpu_dmp_init())
	{
		HAL_Delay(200);
		printf("%s\r\n","Mpu6050_DMP Init Wrong!");
		printf("   %d",mpu_dmp_init());
	}
		printf("%s\r\n","DMP_Mpu6050 Init OK!");
	while(1)
	{
		if(mpu_dmp_get_data(&pitch,&roll,&yaw)==0)
	{      
		
		MPU_Get_Accelerometer(&aacx,&aacy,&aacz);	//得到加速度传感器数据
		MPU_Get_Gyroscope(&gyrox,&gyroy,&gyroz);	//得到陀螺仪数据
		if(RX_news == 49)
		{
		printf("三轴角度:%f-%f-%f\r\n",pitch,roll,yaw);
		}
		if(RX_news == 50)
		{
	  printf("三轴加速度:%d-%d-%d\r\n",aacx,aacy,aacz);
		}
		if(RX_news == 51)
		{
		printf("三轴角角度:%d-%d-%d\r\n",gyrox,gyroy,gyroz);
		}
		HAL_Delay(300); // 

OLED函数写的十分清晰了


总结

以上为所有内容

你可能感兴趣的:(stm32,单片机,arm)