在上篇博客中,我已经介绍完了i2c的各种特征,这次就结合师兄给我的编程实例来分析学习。首先i2c协议的编程可以分为硬件i2c和模拟i2c,一般在51之类的低端单片机都是使用模拟i2c(即用软件编程来控制io口上的时序变化以符合i2c协议的biao标准),而在stm32一类的中高端单片机本身就自带可以某些硬件gpio口自动实现i2c协议。下面就分别讨论下两种方式的编程初始化配置过程。
1.1.模拟i2c编程
1.1.1初始化i2c函数
首先i2c协议通信需要两根总线数据线SDA与时钟线SCL,所以我们先选择两个gpio口进行相应初始化。gpio口的初始化过程在之前博客也详细介绍过这里就不过多赘述,主要就是调用库函数开启gpio口时钟,选择输入输出模式在i2c通信中我们选择是推挽留输出,然后速度是50MHZ。最后在把定义好的SDA与SCL拉高,准备进行i2c通信。i2c初始化函数如下图:
1.1.2 起始信号与结束信号函数
在初始化函数编写完后,我们按照i2c协议中时序图所需要的起始信号和结束信号以及应答信号的编写。整个编程过程严格对照下图的数据传输图以及时序图:
如上图可知,要产生起始信号条件即为在SCL为高电平的情况下,SDA产生一个下降沿脉冲。同理结束信号便是在SCL为高电平的情况下,SDA产生一个上升沿脉冲。具体实现代码如下:
1.1.3发送数据函数
由于i2c协议规定发送数据一次只能发送一个字节8位,所以我们编程也要严格按照标准。编程内容主要先定义一个8位发送数据,然后将时钟总线SCL拉低这一步非常重要,因为在SCL为高电平时SDA的变化都是起始或者停止信号,所以要发送数据必须先拉低。一个字节的发送数据8位,用右移一位位发送即可,最后是默认收到应答信号故不再编写应答信号函数。整个编程代码如下图:
2.1.硬件i2c
硬件i2c的初始化过程和软件i2c相似,同样都需要初始化配置gpio口,然后配置下i2c硬件的模式。具体的起始信号以及结束信号以及应答函数都在官方固件库中编写好了,所以只需调用配置模式即可。具体编程代码如下图:
具体发送函数会根据不同的接受设备而有一些变化,以上代码是根据与CH423进行通信的编程,也请读者们参考时留心。
关键字:stm32 i2c协议 编程
引用地址:
stm32中的i2c协议编程
推荐阅读最新更新时间:2024-11-12 20:48
STM32-TIMx_OCMode的两种模式的理解
通用定时器可以输出四路互不影响的pwm信号,高级定时器可以输出三对互补pwm信号外加ch4通道,也就是一共七路。所以stm32一共可以生成4*5+7*2=30路pwm信号。但功能上有区别:通用定时器的pwm信号比较简单,就是普通的调节占空比调节频率;高级定时器的还带有互补输出功能,同时互补信号可以插入死区,也可以使能刹车功能,所以高级定时器的pwm通常用来控制电机的。 那么TIMx_ARR寄存器的值是怎样来确定pwm的频率的呢? TIM_Period(即是TIMx_ARR寄存器的值) 的大小实际上表示的是需要经过TIM_Period 次计数后才会发生一次更新或中断。接下来需要设置时钟预分频数TIM_Prescaler,这里有一个公
[单片机]
手把手教你学linux驱动开发 OK6410系列之01---模块编程
一、实验环境 开发机环境 操作系统:ubuntu 9.10 交叉编译环境:arm-linux-gcc 4.2.2 ,安装位置 /usr/local/arm/4.3.2/ 6410板子内核源码路径:/work/linux-2.6.36.2-v1.05/ 目标板环境:OK6410-A linux2.6.36 二、实验原理 模块时在内核空间运行的,模块中不能使用glibc库中的函数。 模块可以动态的装载到内核中。 三、实验步骤 注意:最好使用root用户进行以下实验,否则需要利用sudo 1、验证交叉编译
[单片机]
Allegro MicroSystems, LLC推出双芯片 高度可编程线性霍尔传感器IC
美国马萨诸塞州伍斯特市 – Allegro MicroSystems, LLC宣布推出全新双芯片高度可编程线性霍尔传感器IC A1346,这是一款适用于注重安全应用的理想解决方案。A1346把完整的芯片冗余和全诊断的附加优势整合在一起,这两种特性的组合可以实现更高的诊断水平,而无需中断应用(其中的诊断会导致芯片暂时无响应)。当芯片输出不一致时(指双输出),该组合还使控制器能够判断哪个芯片可以信任。新器件主要针对汽车市场,终端应用包括电动助力转向系统(EPS)扭矩检测、制动(踏板行程、活塞位置、刹车磨损)及变速器/离合器位置检测等等。 Allegro的A1346器件拥有两个具备开路漏极输出的高精度可编程霍尔线性传感器IC,适用于
[传感器]
STM32 IO口的八种方式的解释
1、上拉输入:上拉就是把电位拉高,比如拉到Vcc。上拉就是将不确定的信号通过一个电阻嵌位在高电平!电阻同时起限流作用!弱强只是上拉电阻的阻值不同,没有什么严格区分。 2、下拉输入:就是把电压拉低,拉到GND。与上拉原理相似。 3、浮空输入:浮空(floating)就是逻辑器件的输入引脚即不接高电平,也不接低电平。由于逻辑器件的内部结构,当它输入引脚悬空时,相当于该引脚接了高电平。一般实际运用时,引脚不建议悬空,易受干扰。 通俗讲就是让管脚什么都不接,浮空着。 4、模拟输入:模拟输入是指传统方式的输入.数字输入是输入PCM数字信号,即0,1的二进制数字信号,通过数模转换,转换成模拟信号,经前级放大进入功率放大器,功率放大器还是模拟的
[单片机]
stm32寄存器版矩阵键盘库函数(附详细注释)
在STM32F105和STM32F107互连型系列微控制器之前,意法半导体已经推出STM32基本型系列、增强型系列、USB基本型系列、互补型系列;新系列产品沿用增强型系列的72MHz处理频率。内存包括64KB到256KB闪存和 20KB到64KB嵌入式SRAM。新系列采用LQFP64、LQFP100和LFBGA100三种封装,不同的封装保持引脚排列一致性,结合STM32平台的设计理念,开发人员通过选择产品可重新优化功能、存储器、性能和引脚数量,以最小的硬件变化来满足个性化的应用需求。本文为大家介绍stm32寄存器版矩阵键盘库函数。 stm32寄存器版矩阵键盘库函数 ////////////////////.h文件 #ifnd
[单片机]
STM32学习笔记之DMA使用
实验:控制串口一以DMA方式发送(TX)数据 一、初始化DMA 对STM32任何模块使用前都要对其初始化、首先就是初始化外设时钟,查看时钟 数可知DMA时钟由AHB得来。 初始化时钟:RCC- AHBENR|=1 0; 在读数据手册可知:直接存储器存取(DMA)用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU干预,数据可以通过DMA快速地移动,这就节省了CPU的资源来做其他操作。 两个DMA控制器有12个通道(DMA1有7个通道,DMA2有5个通道),每个通道专门用来管理来自于一个或多个外设对存储器访问的请求。还有一个仲裁器来协调各个DMA请求的优先权。我们实
[单片机]
一文解析STM32启动流程
可执行程序 - cpu执行第一条用户代码 这个流程中着重讲述的是 HEX 文件如何被烧写到 STM32 内部的指定地址处。(烧写到 STM32 中的可执行文件不仅只有 HEX 格式,还有 axf、bin。针对不同格式的可执行文件,用不同的工具进行烧写)。 而本篇文章将要详细地描述一个流程: cpu执行第一条用户代码 - 调用 __main 函数- __rt_entry - main函数 这里需要注意一下,__main 是 c 库中的一个函数,和 main 函数是有区别的!!! 启动文件内容描述 上图中的汇编关键字最好记住,因为比较常用。 在此基础上,我们继续深入一点。 DCD指令 STM32 启动文件中使用 DCD 指令的
[单片机]
STM32网络通信之DM9000A电路设计
1 总体描述: DM9000A的PHY 能够以10BASE-T 的标准在UTP3\4\5或者以100BASE-T的标准在UTP5上接口通信。它的自动协商功能是够自动配置DM9000A最大地发挥出自身性能。它同时支持IEEE 802.3X全双工数据流通信。 2、结构图: 3、硬件电路的设计 (1)电源连接: 引脚号 电气连接 说明 2、9 模拟2.5V 为RX和TX供电,必须为2.5V 23、30、42 数字3.3V1 数字电源3.3V为芯片供电 15、33、45 数字地 数字地 5、6、47、48 模拟地 5、47、6分别为RX和TX的GND,48是通带宽带的GND 41
[单片机]