STM32的I2C特性及架构:
1 硬件实现协议:
由STM32的I2C片上外设专门负责实现I2C通讯协议,只要配置好该外设,它就会自动根据协议要求产生通讯信号,收发数据并缓存起来,CPU只要检测该外设的状态和访问数据寄存器,就能完成数据收发。这种由硬件外设处理I2C协议的方式减轻了CPU的工作,且使软件设计更加简单。
stm32的硬件IIC,在某些情况下会出现错误,但也没有必要去纠结这个问题。
2 软件模拟协议:使用CPU直接控制通讯引脚的电平,产生出符合通讯协议标准的逻辑。
STM32的I2C外设可用作通讯的主机及从机,支持100Kbit/s和400Kbit/s的速率,支持7位、10位设备地址,支持DMA数据传输,并具有数据校验功能。
stm32硬件IIC的内部:
1 通讯引脚
IIC1
IIC2
2 时钟控制逻辑
时钟控制逻辑,直接通过一些信号线与SCL引脚相连,通过这些硬件逻辑控制SCL线。时钟控制寄存器CCR,配置了SCL线的模式(标准模式100kHz,快速模式400kHz)、速度、占空比等参数,而实际上,标准库函数会帮我们计算好的,不需要每次都去手动计算。
这里计算分频系数,如何理解?
以标准模式为例,APB1总线的时钟信号PCLK1 = 36M,则T(PCLK1) = (1/36)ns,要产生100kHz的频率,则CCR必须写入的值为:2 * CCR * (1 / 36)ns = 100kHz,计算得到CCR = 180。
3 数据控制逻辑
连接到SDA引脚。
I2C的SDA信号主要连接到数据移位寄存器上,数据移位寄存器的数据来源及目标是数据寄存器(DR)、地址寄存器(OAR)、
PEC(帧校验)寄存器以及SDA数据线。
首先来看数据寄存器DR
当向外发送数据的时候,数据移位寄存器以“数据寄存器”为数据源,把数据一位一位地通过SDA信号线发送出去;
当从外部接收数据的时候,数据移位寄存器把SDA信号线采样到的数据一位一位地存储到“数据寄存器”中;
比较器的作用:IIC会有一个自身地址寄存器,用于作为从机。当作为从机时,必须要有IIC设备地址,通过软件配置可以写入到自身地址寄存器内。当主机寻址时,比较器会将地址比较,来确定主机是否在叫自己。
PEC寄存器:用于做数据校验,几乎不用。
4 整体控制逻辑
包含控制寄存器CR1 CR2和状态寄存器SR1 SR2。
整体控制逻辑负责协调整个I2C外设,控制逻辑的工作模式根据我们配置的“控制寄存器(CR1/CR2)”的参数而改变。其中,CR1寄存器控制各种起始、结束的使能,CR2寄存器管理中断。
还有一个比较重要的地方:
配置的是CR2寄存器的FREQ[5:0]位:
在外设工作时,控制逻辑会根据外设的工作状态修改“状态寄存器(SR1和SR2)”,只要读取这些寄存器相关的寄存器位,就可以了解I2C的工作状态,这个非常重要,我们编程时要参考这些标志位。接下来,详细的看一下每个标志位的意义。
这些标志位,对应了IIC的时序图种,产生的各种事件标志。
然后是状态寄存器CR2
关键字:stm32 IIC
引用地址:
stm32专题十六:IIC(一)硬件结构框图
推荐阅读最新更新时间:2024-11-05 11:25
stm32之断言详细讲解
最近公司不忙,就想着充实下自己,偶然看到了“断言机制”,也认真试验了一番,便赶紧记录下来,也是为了温故而知新,再者与大家分享一下! 首先看一个应用:(网络不好,图片不好上传,原谅我偷懒) void TIM_DeInit(TIM_TypeDef* TIMx) { /* Check the parameters */ assert_param(IS_TIM_ALL_PERIPH(TIMx)); if (TIMx == TIM1) { RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM1, ENABLE); RCC_APB2PeriphResetCmd(RCC_AP
[单片机]
keil+stm32+jlink利用swd方式进行printf输出
使用ITM机制实现调试stm32单片机,实现printf与scanf。 1. ITM简介 ITM机制是一种调试机制,是新一代调试方式,在这之前,有一种比较出名的调试方式,称为半主机(semihosting)方式。 在pc上编写过C语言的人都知道,printf可以向控制台输出,scanf可以从控制台获取输入,这里的printf/scanf都是标准库函数,利用操作系统的这些函数,我们可以很方便的调试程序。在嵌入式设备上(如stm32单片机平台上)开发工具(如MDK/IAR)也都提供了标准库函,自然也提供了printf/scanf函数,那么这些函数是否可以使用呢? 问题来了,printf向哪里输出呢?并且大部分情况下,也没有键盘,又如何
[单片机]
【STM32平衡小车】电磁巡线技术的发展及电磁巡线介绍(一)
一、常见的路径识别 路径识别方法主要有两大类,一类是依靠红外光电传感器,一类是依靠摄像头。 红外光电传感器以其体积小、价格低廉、安装灵活方便且不受环 境可见光干扰等特点得到了广泛的应用。 对于该类传感器来说,相应于不同的路面条件(主要是黑白度),接收管接收到地面漫反射 红外线后其两端电压将有所不同,即传感器接收管正对白色路面,则其电压较高,若正对黑 色的路径标记线,则电压较低。 因此,基于这个原理可以提出一种比较常见的路径离散识别 算法:通过普通 I/O 端口将接收管电压读入单片机,根据端口输入的高低电平逻辑来判断 该传感器是否处于路径标记线上方, 再筛选出所有处于标记线上方的传感器, 便可以大致判 断此时车身相对道路的位置,
[单片机]
STM32_TIM定时-中断
今天讲解STM32F103定时器定时-中断功能,在昨天定时器延时的软件工程上添加TIM3定时的功能,自己也可以试着将昨天的工程添加修改得到。 今天的软件工程下载地址(360云盘): https://yunpan.cn/cPnJ9KYcXbPsP 访问密码 acd8 工程现象:间隔(定时器定时)500ms LED变化一次, 并且串口打印 STM32F103ZE有8个定时器(TIM1 – TIM8), 改工程以TIM3定时为例。 STM32F10x的资料可以在我360云盘下载: https://yunpan.cn/crBUdUGdYKam2 访问密码 ca90 关于TIM延时,我把重要的几点在下面分别讲述
[单片机]
STM32初学笔记1之RCC(上)
我参考了STM32的标准外设库中的RCC例程,然后对其在原有的基础上做了一定的修改,单独添加到了RCC_ClkConfig.C和RCC_ClkConfig.H两个文件当中,把这个作为以后系统时钟配置的通用函数,在这里共享出来,示例代码如下: ////////////////////////////////////////////////////////////////////////////////////////////////////// RCC_ClkConfig.C /////////////////////////////////////////////////////////
[单片机]
STM32时钟问题(重点)
STM32上电默认时钟内部8MHZ,经过库函数SystemInit的初始化,设置成启用外部晶振模式,并设为系统时钟为PLL倍频后的时钟:72MHZ. * SYSCLK 72MHz * AHB 72MHz * PCLK1 36MHz * PCLK2 72MHz * PLL 72MHz 但是用户可以自己选择使用不同时钟,下面给出了几个函数。 可以配置成内部时钟或者外部时钟。 /* * 寄存器的方式设置系统时钟: * 输入PLL倍频因子,输入PLL的倍频值2—16倍频(注意:不同的芯片有不同的倍频因子) * HCLK = PLLCLK=SYSCLK=P2CLK=P1CLK*2=ADCCLK*2=TIMCLK=U
[单片机]
STM32上的CAN通讯是什么?CAN模式功能的详细分析
CAN模式 一.工作模式 通过CAN_MCR寄存器控制INRQ和SLEEP1.初始化INRQ=1 SLEEP=0软件初始化应该在硬件2.正常INRQ=0 SLEEP=0在初始化完成后,软件应该让硬件进入正常模式,以便正常接收和发送报文3.睡眠SLEEP=1 bxCAN可工作在低功耗的睡眠模式 二.测试模式 通过CAN_BTR寄存器控制LBKM和SILM1. 静默 可以接受不能发送 2. 循回 可以发送不能接受3.环回静默 只能自发自收 三.调试模式 STM32标识符筛选器 在CAN协议里,报文的标识符不代表节点的地址,而是跟报文的优先级相关的。因此,节点在接收报文时-根据标识符的值-决定软件是否需要该报文;如果需要,就
[单片机]
STM32之ADC实例(基于DMA方式)
ADC简介: ADC(Analog-to-Digital Converter,模/ 数转换器)。也就是将模拟信号转换为数字信号进行处理,在存储或传输时,模数转换器几乎必不可少。 STM32在片上集成的ADC外设非常强大,我使用的奋斗开发板是STM32F103VET6,属于增强型的CPU,它有18个通道,可测量16个外部和2个内部信号源。各通道的A/D转换可以单次,连续,扫描或间断模式执行,ADC的结果可以左对齐或右对齐方式存储在16位数据寄存器中。 ADC工作过程分析: 我们以ADC规则通道转换过程来分析,如上图,所有的器件都是围绕中间的模拟至数字转换器部分展开的。它的左端VREF+,VREF- 等ADC参考电
[单片机]