这里是讲的模拟IIC,不是采用硬件IIC。为啥用软件模拟IIC而不用硬件IIC? 除了ST的IIC模块本身问题,还因为硬件IIC移植不方便,在不同的MCU中无法通用;而且有的项目需要在IIC主从模式切换。
网上的资料大部分都是模拟IIC主模式的,很少有资料告诉我怎么实现模拟IIC从模式。
因为特殊要求,我们在做汽车电容屏升级的时候,要扔掉原车屏的一个部件,即IIC从机部分,只保留IIC主芯片,并采用STM32替代被扔掉的IIC从机功能,而且在不同应用内容下,需要切换IIC的主从工作模式。
要实现IIC从机功能,最核心的部分就是如何精确的抓住IIC_SCL,也就是IIC主机发出来的时钟信号。只有抓住精确的时钟SCL,才能正确的读取到SDA的数据,才能真正模拟出IIC时序。
但是要抓住SCL信号可不容易,IIC最高速度有400K,最小有效脉宽达到1.4us(数字0/1),最小脉冲是0.8us(应答和STOP信号产生的尖刺),采用中断来识别SCL是不可能的做到的,因为即使在最高主频72MHZ情况下,STM32最小指令周期是1/72(us),从SCL中断发生到STM32进入中断响应,至少要要40个指令周期,也就是40/72(us),加上堆栈操作及变量,很可能已经错过了SCL信号。
图1.高速模式下IIC波形
图2 应答和STOP信号产生的尖刺
所以只能采用查询方式来识别SCL,而到目前为止,我还没有看到哪篇文章是采用查询SCL的方式来模拟IIC从模式。
所以很多文章说模拟IIC从模式的内容都是假的,要么骗人要么就是从来没有实践过。
写这篇文章,就是想提醒很多跟我一样的人,不要老是拷贝别人的程序,以为改改就行了的,这样的想法肯定是会吃苦头的;
越是简单的事情,越是要多花时间来理顺,因为这是大厦的基石;
这是花了好多时间走了很多弯路,很愤怒差点被带沟里的博主,写于20160711。
关键字:STM32 IIC 模拟从模式
引用地址:
STM32-IIC模拟从模式
推荐阅读最新更新时间:2024-03-16 16:00
STM32——粗谈基础知识
对于STM32来说,首先我们从其精密性、可靠性以及安全性三个方面来进行说明: 精密性:与单片机的外设基本相同,除了其包含了7个DMA(直接存储器访问)通道。每个通道都可以用来在设备与内存之间进行8/16/32位数据的传输。每个设备都可以向DMA控制器发出发送或者接受数据的请求。 可靠性:采用硬件来对可靠性进行支持,包括一个低电压检测器,一个时钟安全管理系统和两个看门狗定时器(一个为窗口看门狗,一个为独立看门狗)。 安全性:STM32可以锁住其内部的Flash而使得破解人员无法通过端口读取其内容。STM32还有一小块电池备份RAM区,当该RAM区域检测到其入侵检测引脚产生电平变化时,就会自动将电池备份的RAM区域上的内容
[单片机]
STM32的中断及是如何使用
中断是一种机制,通过这种机制,I/O或指令可以暂停处理器的正常执行,并像具有最高优先级一样先执行自己的任务。也就是说,当外部中断发生时(比如来自某个传感器),处理器暂停其正在执行,首先提供中断服务,然后继续其正常执行。 为了了解 STM32F103C8 中的中断,我们将使用按钮作为外部中断。在这里,我们让一个变量从 0 开始每秒增1,并将其显示在16x2 LCD上,每当按下按钮时,LED 亮起,LCD 显示屏会显示 INTERRUPT。 中断类型和 ISR(中断服务程序) 中断大致可以分为两类: 1.硬件中断: 如果到处理器的信号来自某些外部设备,例如按钮或传感器,或者来自其他信号并告诉处理器执行 ISR 中存在的特定任务
[单片机]
stm32定时器时间计算
STM32定时器的工作原理 STM32之所以能够实现定时,是单片机内部在计数脉冲(来自晶振) T=1/F (F为频率) 例如:我们以51单片机举例,假设单片机搭配12MHz的晶振,由于51单片机是12分频(即1个机器周期有12个时钟周期),则单片机的最小定时时间为 1 2 MHz / 2 = 1 MHz Tt = 1 / 1 MHz = 1 us 最小定时时间T=1/1MHz=1us 51单片机定时器: 方式0 13位最大定时时间间隔2^13=8.192ms 方式1 16位最大定时时间间隔2^16=65.536ms 方式2 8位最大定时时间间隔2^8=256us 由此我们知道对于
[单片机]
stm32 窗口看门狗 wwdg与独立看门狗iwdg的配置运用
STM32笔记之十二:时钟不息工作不止,systic时钟应用 a) 目的:使用系统时钟来进行两项实验 周期执行代码与精确定时延迟。 b) 初始化函数定义: void SysTick_Configuration(void); c) 初始化函数调用: SysTick_Configuration(); d) 初始化函数: void SysTick_Configuration(void) { SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);//时钟除8 SysTick_SetReload(250000);
[单片机]
stm32影子寄存器、预装载寄存器
一直没搞清楚stm32定时器的TIM_OC1PreloadConfig、TIM_ARRPreloadConfig函数的作用,影子寄存器、预装载寄存器、重载寄存器的概念。今天来研究一下: 首先看定时器的框图: 图中有阴影的小方框,代表该功能对应的寄存器有影子寄存器,也就是:PSC预分频器、自动重装载寄存器、REP寄存器和4个通道的捕获/比较寄存器。 可以看到这几个寄存器都是经常用到的,而且存在定时器工作过程中修改他们的可能性。在定时器工作过程中修改他们的值,就会出现一个问题了:如果上次ARR的值是200,通道1的比较寄存器CCR1值是100,产生占空比为50%的PWM。这个时候我要改变PWM的频率,我把ARR的值改为10
[单片机]
关于STM32定时器中TI1FP1 与TI1FP2及相关话题
整体来讲,STM32各个系列的TIMER外设基本框架和功能是类似的,大体分高级定时器、通用定时器和基本定时器。除了基本定时器外,每个高级定时器或部分通用定时器都可以产生4对中间信号,分别是TI1FP1 与TI1FP2,TI2FP1 与TI2FP2,TI3FP3 与TI3FP4,TI4FP3 与TI4FP4,即每个输入通道可以生产1对信号。这里以STM32F103系列为例聊聊T这个 TImFPn,。 在SMT32各系列的参考手册的定时器部分,在描述高级定时器或通用定时器时都可以看到如下的一副图。图中对那4对信号被清晰地描绘了出来。 这四对信号可以统一写为:TImFPn,其中 m代表滤波和边沿检测器前的输入通道号,n代表经过滤
[单片机]
【STM32】STM32驱动 LCD12864程序代码(串行方式)
引言: 这里我们只讲解接线和代码实现,具体的原理在上一篇博客中已经讲解,如果想了解具体原理可以查看上一篇博客 《STM32 LCD12864 串行通信模式 (从原理让你理解)》 下方代码的实现也是基于上一篇的讲解顺序来的 设备: STM32F407ZGT6 引脚接线: VSS——GND VDD——VCC(5V or 3.3V) V0 亮度调节 不接 CS ——接VCC,持续高电平,一直选通。 SID ——接PE1 SCLK ——接PE0 PSB——接GND 串行模式 或者飞线与1脚相连 BLA——VCC(5V or 3.3V) 或者飞线与2脚相连 BLK——
[单片机]
学习单片机和STM32的一道坎
刚开始学单片机的你,是不是会因用程序把LED点亮而感到高兴,会因用程序把数码管点亮而感到高兴。这是好事,这也是想继续学习下去的动力。 但是数据相关的实验是学习单片机和STM32的一道坎,此时就需要用好本文要说的串口这个调试工具。串口通信介绍关于串口通信的介绍,也可以点击阅读之前发的一篇文章:STM32串口通信基本原理。串口通信是指外设和计算机间,通过数据信号线 、地线、控制线等,按位进行传输数据的一种通讯方式......这种太过理论了,看似懂了,但又不懂。还是用我笔者自己的话来说吧。串口通信就是可以把程序在单片机或者STM32芯片中运行的结果发送到电脑的一种通信方式。 如何使用串口通讯,你需要知道的几个重要的知识点: 波特
[单片机]