stm32的模拟/硬件的spi和i2c通信及其应用

发布者:Chanhero最新更新时间:2022-07-26 来源: csdn关键字:stm32  模拟  硬件  spi  i2c通信 手机看文章 扫描二维码
随时随地手机看文章

本章节主要讲解:模拟spi、硬件spi、两种方法驱动6针oled、模拟i2c、硬件i2c、硬件i2c驱动mpu6050

一、硬件spi

1、首先是基础知识,这里参考正点原子的资料:s

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkDljZPliJst55S15o6nLWh5Yg,size_20,color_FFFFFF,t_70,g_se,x_16

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkDljZPliJst55S15o6nLWh5Yg,size_20,color_FFFFFF,t_70,g_se,x_16 

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkDljZPliJst55S15o6nLWh5Yg,size_20,color_FFFFFF,t_70,g_se,x_16 

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkDljZPliJst55S15o6nLWh5Yg,size_20,color_FFFFFF,t_70,g_se,x_16 

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkDljZPliJst55S15o6nLWh5Yg,size_20,color_FFFFFF,t_70,g_se,x_16 

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkDljZPliJst55S15o6nLWh5Yg,size_20,color_FFFFFF,t_70,g_se,x_16 

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkDljZPliJst55S15o6nLWh5Yg,size_20,color_FFFFFF,t_70,g_se,x_16 

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkDljZPliJst55S15o6nLWh5Yg,size_20,color_FFFFFF,t_70,g_se,x_16 

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkDljZPliJst55S15o6nLWh5Yg,size_20,color_FFFFFF,t_70,g_se,x_16 

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkDljZPliJst55S15o6nLWh5Yg,size_20,color_FFFFFF,t_70,g_se,x_16

2、接下来讲一讲硬件spi及cubemx配置方法:


这里在cubemx配置,Mode部分配置是全双工还是半双工还是单线通信,是主机模式还是从机模式,如果是单线,那么是只接受还是只接受


Hardware NSS Signal配置NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制


最下面配置一些参数,包括但不限于数据大小,第一位是MSB位还是LSB位,串行同步时钟的空闲电位状态等等,和谐都可以和前面给出的正点原子的资料对应起来


至于使用的spi复用到哪一组引脚可以在芯片上标记

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkDljZPliJst55S15o6nLWh5Yg,size_20,color_FFFFFF,t_70,g_se,x_16

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkDljZPliJst55S15o6nLWh5Yg,size_20,color_FFFFFF,t_70,g_se,x_16 

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkDljZPliJst55S15o6nLWh5Yg,size_20,color_FFFFFF,t_70,g_se,x_16

生成的代码如下:


spi初始化部分

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkDljZPliJst55S15o6nLWh5Yg,size_20,color_FFFFFF,t_70,g_se,x_16

spi回调函数部分,在这里配置好端口,注意如果要配置多个spi,那么也只能有一处回调函数。


初始化和回调的代码和正点原子几乎的一样的

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkDljZPliJst55S15o6nLWh5Yg,size_20,color_FFFFFF,t_70,g_se,x_16 

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkDljZPliJst55S15o6nLWh5Yg,size_20,color_FFFFFF,t_70,g_se,x_16

正点原子多给了一个速度设置函数和读写字节函数,可以用来和w28q128(flash)通信使用,具体的移植代码这里不放出来了

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkDljZPliJst55S15o6nLWh5Yg,size_20,color_FFFFFF,t_70,g_se,x_16

这里重点看一下hal库的spi初始化代码(在spi初始化里面),这里的形式参数是一个类型别名的结构体变量

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkDljZPliJst55S15o6nLWh5Yg,size_20,color_FFFFFF,t_70,g_se,x_16

这是这个结构体类型对应的成员,是硬件spi的一些基础参数

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkDljZPliJst55S15o6nLWh5Yg,size_20,color_FFFFFF,t_70,g_se,x_16

比较特殊的是SPI_TypeDef和SPI_InitTypeDef这两个结构体类型(是嵌套在主结构体类型里面的)


具体用法也不说了,前面的正点原子资料说的很清楚了

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkDljZPliJst55S15o6nLWh5Yg,size_20,color_FFFFFF,t_70,g_se,x_16

 watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkDljZPliJst55S15o6nLWh5Yg,size_20,color_FFFFFF,t_70,g_se,x_16

二、应用:分别用模拟spi和硬件spi驱动6针oled

注意1:模拟spi是利用四个端口来模拟硬件spi,这样的好处是通用型强,不管怎样的32单片机,只要配置四个GPIO就可以。硬件spi的话不同单片机需要有不同的配置(引脚、功能等),通用型相对模拟spi比较低,但是硬件spi的性能比模拟spi强。


注意2:信泰微电子卖的oled有4针(i2c驱动)、6针(spi驱动)、7针(spi/i2c驱动)三种版本,这里用的是6针的。


注意3:模拟spi驱动6针oled不可以使用刷新函数


硬件spi可以使用刷新函数,但中文汉字的具体代码需要修改


1、模拟spi驱动6针oled:


配置好四个端口

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkDljZPliJst55S15o6nLWh5Yg,size_20,color_FFFFFF,t_70,g_se,x_16

将端口在这里对应好

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkDljZPliJst55S15o6nLWh5Yg,size_20,color_FFFFFF,t_70,g_se,x_16

然后接线接可以了,scl(时钟)、sda,rst、dc对应着接就可以了


主函数怎么编写代码,怎么用取模软件、怎么去显示动态变量/汉字/图片、每一种oled函数怎么用限于篇幅这里都不说了


2、硬件spi驱动oled:


配置好spi,这样就有了mosi、miso和sck

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkDljZPliJst55S15o6nLWh5Yg,size_20,color_FFFFFF,t_70,g_se,x_16

dc和rst还是得用端口模拟(也得配置一下端口) 

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkDljZPliJst55S15o6nLWh5Yg,size_20,color_FFFFFF,t_70,g_se,x_16

然后scl—scl,sda—mosi,rst—rst,dc—dc


主函数怎么编写代码也省略了,具体的oled移植代码限于篇幅也省略了


三、模拟i2c

模拟i2c是正点原子提供的,因为stm32的硬件i2c是鸡肋,为了规避版权而弄的很复杂,效率低,所以才使用了模拟i2c,用两个端口来模拟

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkDljZPliJst55S15o6nLWh5Yg,size_20,color_FFFFFF,t_70,g_se,x_16

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkDljZPliJst55S15o6nLWh5Yg,size_20,color_FFFFFF,t_70,g_se,x_16

模拟i2c代码部分(.c+.h):


利用这些i2c函数就可以实现一定的操作了

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkDljZPliJst55S15o6nLWh5Yg,size_20,color_FFFFFF,t_70,g_se,x_16 

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkDljZPliJst55S15o6nLWh5Yg,size_20,color_FFFFFF,t_70,g_se,x_16 

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkDljZPliJst55S15o6nLWh5Yg,size_20,color_FFFFFF,t_70,g_se,x_16 

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkDljZPliJst55S15o6nLWh5Yg,size_20,color_FFFFFF,t_70,g_se,x_16 

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkDljZPliJst55S15o6nLWh5Yg,size_20,color_FFFFFF,t_70,g_se,x_16 

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkDljZPliJst55S15o6nLWh5Yg,size_20,color_FFFFFF,t_70,g_se,x_16

四、硬件i2c

1、cubemx配置:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkDljZPliJst55S15o6nLWh5Yg,size_20,color_FFFFFF,t_70,g_se,x_16

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkDljZPliJst55S15o6nLWh5Yg,size_20,color_FFFFFF,t_70,g_se,x_16 

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkDljZPliJst55S15o6nLWh5Yg,size_20,color_FFFFFF,t_70,g_se,x_16 

2、代码部分:


这里也是和spi差不多,一个初始化去配置基础参数,一个回调函数(被HAL_I2C_Init调用)去配置端口

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkDljZPliJst55S15o6nLWh5Yg,size_20,color_FFFFFF,t_70,g_se,x_16 

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkDljZPliJst55S15o6nLWh5Yg,size_20,color_FFFFFF,t_70,g_se,x_16

还有一些其他硬件i2c函数,具体的知识可以参考对应系列芯片的st中文参考手册和其他csdn博客,这里博主用的不多,就不展开了


五、应用:用硬件i2c驱动mpu6050

1、配置好硬件i2c,这里省略了


2、将mpu和inv代码移植过来,在mpu6050.h里面对应好I2c结构体和端口初始化函数,要和刚刚配置的i2c对应好。至于mpu6050的移植代码,可以去csdn找,f1/f4/h7等等都是有的。当然了如果单片机比较厉害,自带陀螺仪,那么就不要再去单独买了,直接写代码即可

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkDljZPliJst55S15o6nLWh5Yg,size_20,color_FFFFFF,t_70,g_se,x_16

3、具体的主函数内使用这里也不讲了,这里就是讲讲移植的思路


4、mpu6050也可以用模拟i2c驱动,这里限于篇幅就不展开了

关键字:stm32  模拟  硬件  spi  i2c通信 引用地址:stm32的模拟/硬件的spi和i2c通信及其应用

上一篇:利用usmart组件对stm32进行调试
下一篇:stm32F407zgt6的LCD+FSMC

推荐阅读最新更新时间:2024-11-13 00:23

STM32 使用通用计时器实现微秒延时
为了驱动ARF2496K这款芯片,做STM32上的移植,所以第一步需要解决的就是时序问题,很显然在STM32下类似于51的延时方法并不适用,自然想到了采用定时器进行定时来延时。目前使用的是查询方式进行延时。 环境: STM32F107主控,采用STLINK仿真 代码如下: static void TIM5_Init_Query(CALC_TYPE type,uint32_t val) { TIM_TimeBaseInitTypeDef Tim5; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE); Tim5.TIM_Period=1; //?
[单片机]
<font color='red'>STM32</font> 使用通用计时器实现微秒延时
STM32开发笔记3: STM32F407定时器2-5的使用方法
单片机型号:STM32F407 STM32F4有多种定时器,其中TIM2-TIM5称为通用定时器,具有相似的软件设置及使用方法。在这里还需要注意的是TIM3和TIM4为16位定时器,TIM2和TIM5为32位定时器。 使用TIM2-5可以遵循以下步骤: 1、打开config.h文件,对如下图所示的宏进行设置,设置为0表示不启动相应的定时器,设置为1表示当前定时器定时1ms,设置为2表示当前定时器定时10ms,设置为3表示当前定时器定时100ms,设置为4表示当前定时器为1s。 上图所示的设置结果为,启动定时器2设置为1ms定时,启动定时器5设置为1s定时,定时器3和定时器4没有启动。
[单片机]
<font color='red'>STM32</font>开发笔记3: STM32F407定时器2-5的使用方法
在学习STM32时为什么要学习汇编?
不同的平台的汇编代码是不一样的,最早的汇编在50年代就发明了,比很多人的父母的年龄都大,老掉牙,不用学习怎么写汇编。一个公司有一个人知道怎么写汇编就够了。但要学习读汇编,为什么学习汇编? 1、性能 直接翻译为机器语言,性能最高。优秀的C语言效率只能达到汇编的80%左右。其他高级语言跟汇编一比差得更远。语言越高级性能越差。很多bootloader和BIOS用汇编写,汇编操作的是电脑,手机刚刚上电时,硬件和初始化的那些命令,它们的性能的要求比较高,效率高开机速度更快。 分析问题 个人认为,编程人与机器对话,我们写C,写JAVA,但是电脑并不认识这些语言,电脑只认识0和1;所以需要一个人来翻译这些语言,这个翻译官就是编译器,但是编译器不
[单片机]
在学习<font color='red'>STM32</font>时为什么要学习汇编?
STM32_DAC之软件触发
stm32_DAC可以用来输出固定的电压值,有些时候需要按键可调输出的电压值。其中一种方法是使用外部中断EXTI9, 另外一种方法就是使用软件触发。 如果将DAC_InitTypeDef.DAC_Trigger设置为DAC_Trigger_None, 那么,不需要其他任何的触发源,直接使用DAC_SetChannelxData(),就可以设定输出电压的大小。如果使用了软件触发,那么,每次在使用DAC_SetChannelxData()修改输出电压后,还需要调用DAC_SoftwareTriggerCmd(),目的是使能软件触发。由于:软件触发是硬件在一个APB1时钟周期后自动关断的,于是,每次修改输出电压的值后,都要调用DAC
[单片机]
STM32的GPIO 输出—使用固件库点亮LED
硬件设计 在本教程中STM32 芯片与LED 灯的连接见图1,这是一个RGB 灯,里面由红蓝绿三个小灯构成, 使用PWM控制时可以混合成256 不同的颜色。 图1 LED 硬件原理图 这些LED 灯的阴极都是连接到STM32 的GPIO引脚,只要我们控制GPIO引脚的电平输出状态,即可控制LED 灯的亮灭。若您使用的实验板LED 灯的连接方式或引脚不一样,只需根据我们的工程修改引脚即可,程序的控制原理相同。 软件设计 为了使工程更加有条理,我们把LED 灯控制相关的代码独立分开存储,方便以后移植。在“工程模板”之上新建“bsp_led.c”及“ bsp_led.h”文件,其中的“bsp”即BoardSupport
[单片机]
<font color='red'>STM32</font>的GPIO 输出—使用固件库点亮LED
MDK-ARM(Keil uVision V4.72)上STM32开发环境配置
以前我都是在Eclipse上面和arm-none-eabi交叉编译环境来开发STM32应用程序的。 现在改用MDK-ARM比较专业的工具搭建一个开发环境。 新建一个指定STM32微控制器型号的工程: 为了生成编译文件,勾选如下复选框: 配置编译项: STM32F4XX, USE_STDPERIPH_DRIVER 添加库编译符号,和语言/代码生成级别 其中最关键的头文件包含目录: 首先要添加包含工程目录,因为固件库会查找 stm32f4xx_conf.h 配置头文件,中断服务例程实现文件可能也会调用main.h中的函数。 再添加包含 xxxySTM32F4_LibLibrariesCMSISIn
[单片机]
MDK-ARM(Keil uVision V4.72)上<font color='red'>STM32</font>开发环境配置
STM32的CustomHID的各描述符介绍
俗话说的好,看协议手册,不如看源代码来的好!在USB的工程中,USB的各描述符定义在usb_desc.c文件里面,这里就将USB的各描述符定义代码贴上来,各个数值的意义都已经详细注释。当然很细节的东西看不懂还是建议去看手册去!!! /* USB标准设备描述符*/ const uint8_t CustomHID_DeviceDescriptor = { 0x12, /*bLength:长度,设备描述符的长度为18字节*/ USB_DEVICE_DESCRIPTOR_TYPE, /*bDescriptorType:类型,设备描述符的编号是0x01*/ 0x00, /*bcdUSB
[单片机]
福特三维模拟成像技术检测后车桥齿轮
福特近期正在利用一种新开发的3D测绘技术在组装过程中分析福特F系列皮卡的后桥组件,其目的是增加组件的平滑度,从而提升司机的驾驶感受。 与谷歌地球类似,采用三维成像映射,福特的摄影测量读取装置(photogrammetric pattern reader,以下简称PPR)使用一对数码摄像头将后桥齿轮的照片合成一系列的三维图像,然后将得到的图像与电脑上的工件理想模型进行比对,最后将比对后不符合模型标准的工件丢弃,保证工件的高质量与统一性。 该技术有助于工程师和质量监督人员更精确地分辨出工件质量,平时依靠肉眼无法辨别的误差可以靠PPR技术的比对得出结论。福特工程师指出今后公司会在检测商用车辆的工件质量中大量应用PPR技术
[汽车电子]
福特三维<font color='red'>模拟</font>成像技术检测后车桥齿轮
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved