江科大STM32入门——IIC通信笔记总结

wx:嵌入式工程师成长日记

ddd39e6b19e14e33897aa6213919c759.png

(一)简介

  • STM32内部集成了硬件I2C收发电路,可以由硬件自动执行时钟生成、起始终止条件生成、应答位收发、数据收发等功能,减轻CPU的负担

  • 支持多主机

  • 支持7位/10位地址模式

  • 支持不同的通讯速度,标准速度(高达100 kHz),快速(高达400 kHz)

  • 支持DMA

多主机模式下,两个主机同时通讯占用总线就要发起总线仲裁。可变多主机模式,所有设备一视同仁,谁想当主机谁就站出来。

关于I2C地址,可以通过修改低位可变地址部分来避免地址冲突,也可以另外再开辟I2C总线,比较容易解决。

SCL:串行时钟线,传输CLK信号,一般是主设备向从设备提供

SDA:串行数据线,传输通信数据 I2C使用一个7bit的设备地址,一组总线最多和112个节点通信。最大通信数受限于地址空间及400pF的总线电容。

I2C总线广泛应用在EEPROM实时时钟LCD及其他芯片的接口

I2C允许相当大的工作电压范围,典型的电压基准为:+3.3V或+5V

常见的I2C总线传输速率的不同分为不同的模式:标准模式(100Kbit/s)、低速模式(10Kbit/s)、快速模式(400Kbit/s)、高速模式(3.4Mbit/s), 时钟频率可以被下降到零,即暂停通信。

图片

(二)I2C框图

图片

核心部分是数据寄存器和移位寄存器:

  • 当我们需要发送数据时,可以把一个字节数据写到数据寄存器DR,这个数据寄存器的值就会进一步转到移位寄存器里,在移位的过程中,就可以把下一个数据放到数据寄存器里等着了,一但前一个数据移位完成,下一个数据就可以无缝衔接,继续发送。其中数据寄存器转到移位寄存器时候,就会置状态寄存器的TXE位为1,表示发送数据寄存器为空。

  • 当我们需要接收时候,也是输入的数据一位一位的,从引脚移入到移位寄存器里,当一个字数据具收齐后,数据整体从移位寄存器转移到数据寄存器,同时置标志位RXNE,表示接收数据寄存器非空。这时候就可以把数据读出来了。

(三)I2C基本结构

图片

(四)硬件I2C操作流程

图片

1、主机发送

图片

7位地址起始条件后的一个字节是寻址,10位地址起始条件后的两个字节都是寻址;STM32默认从模式,将硬件标志位置位,会因此转成主模式,表示有数据要发。

2、主机接收

图片

设备地址:用于表示外设在总线上的唯一性,也就是同一个I2C总线上,不同的外设具有唯一的。

一个设备地址,也就是如果CPU要想访问某个外设,CPU只需向总线上发送这个外设的设备地址即可设备地址的有效位数为7位或者10位(极其少见),设备地址不包含读写位。

设备地址通常是7位

7bit设备地址 + 1bit读写位

起始位(S):在SCL为高电平时,SDA由高电平变为低电平。

结束位(P):在SCL为高电平时,SDA由低电平变为高电平。

//IO方向设置#define SDA_IN()  {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)8<<28;}#define SDA_OUT() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)3<<28;}

起始和结束信号:

void IIC_Start(void){    SDA_OUT();//输出模式    IIC_SCL = 1;    IIC_SDA = 1;    delay_us(4);    IIC_SDA = 0;    delay_us(4);    IIC_SCL = 0;}
void IIC_Stop(void){    SDA_OUT();//SDA线输出模式    IIC_SCL = 0;    IIC_SDA = 0;    delay_us(4);    IIC_SCL = 1;    IIC_SDA = 1;    delay_us(4);}

图片

图片

图片

发送字节:

void IIC_Send_Byte(u8 txd){    u8 t;    SDA_OUT();    IIC_SCL = 0; //拉低时钟    for(t = 0; t < 8; t++){        if((txd&0x80)>>7){            IIC_SDA = 1;        }else{            IIC_SDA = 0;        }        txd <<=1; //左移7位后,拿到数据,右移1位,保证高位永远是高位        delay_us(2);        IIC_SCL = 1;        delay_us(2);        IIC_SCL = 0;//高电平期间数据保持不变        delay_us(2); //数据有效性    }}

接收字节:

void IIC_Read_Byte(unsigned char ack){    unsigned char i,receive=0;	SDA_IN();        //SDA设置为输入    for(i = 0;i < 8; i++)	{        IIC_SCL=0;         delay_us(2);	IIC_SCL=1;        receive<<=1;        if(READ_SDA)receive++;   		delay_us(1);     }					     if (!ack)        IIC_NAck();        //发送nACK    else        IIC_Ack();         //发送ACK       return receive;}

应答信号:

void IIC_NAck(void){    SDA_OUT();//sda线输出模式    IIC_SCL = 0;    IIC_SDA = 1;    delay_us(2);    IIC_SCL = 1;    delay_ms(2);    IIC_SCL = 0;}
void IIC_Ack(void){    SDA_OUT();//SDA线输出模式    IIC_SCL = 0;    IIC_SDA = 0;    delay_us(2);    IIC_SCL = 1;    delay_ms(2);    IIC_SCL = 0;}

图片

应答(ACK):

I2C数据以字节(即8bits)为单位传输,每个字节传输完后都会有一个ACK应答信号。应答信号的时钟是由主设备产生的。

当采集IIC上的数据时,其时钟线SCL必须是高电平且SDA的数据必须保持稳定不变

在SCL为低电平的时候,SDA上的数据可以进行跳变

每8bit数据传输结束,需要一个ACK

起止信号都由MASTER发出,而ACK则可能由MASTER或者SLAVE来发出

(五)IIC传输流程

图片

针对SCL低放高取:

图片

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/66496.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue3 vite 动态加载路由遇到的问题

记录一下动态加载路由遇到的问题 正常使用import引入静态路由是没问题的 component: () > import(/components/ExampleComponent.vue)动态引入的时候写成import就不行了 由于后端给的路由格式比较反人类…我这边先递归把获取到的数据格式做了一个整合. const processedDa…

MySQL安装,配置教程

一、Linux在线yum仓库安装 打开MySQL官方首页&#xff0c;链接为&#xff1a;https://www.mysql.com/ 界面如下&#xff1a; 在该页面中找到【DOWNOADS】选项卡&#xff0c;点击进入下载页面。 在下载界面中&#xff0c;可以看到不同版本的下载链接&#xff0c;这里选择【My…

Elixir语言的面向对象编程

Elixir语言的面向对象编程探讨 引言 Elixir是一种基于Erlang虚拟机的函数式编程语言&#xff0c;旨在支持可扩展性和维护性。尽管Elixir的核心特性是函数式编程模型&#xff0c;但它依然能够实现面向对象编程&#xff08;OOP&#xff09;的某些特性。本文将深入探讨如何在Eli…

【工具】HTML自动识别用户正在讲话 以及停止讲话

【工具】HTML自动识别用户正在讲话 以及停止讲话 <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>语…

HTML5 滑动效果(Slide In/Out)详解

HTML5 滑动效果&#xff08;Slide In/Out&#xff09;详解 滑动效果&#xff08;Slide In/Out&#xff09;是一种常见的动画效果&#xff0c;使元素从一侧滑入或滑出&#xff0c;增强页面的动态感和用户体验。以下是滑动效果的详细介绍及实现示例。 1. 滑动效果的特点 动态视…

面试题: 对象继承的方式有哪些

在 JavaScript 中&#xff0c;对象继承可以通过多种方式实现。每种方法都有其特点和适用场景。以下是几种常见的对象继承方式&#xff1a; 1. 原型链继承&#xff08;Prototype Chain Inheritance&#xff09; 这是最基础的对象继承方式&#xff0c;利用了 JavaScript 的原型…

React路由拦截器详解

在React中&#xff0c;路由拦截器是一种机制&#xff0c;用于在导航到特定路由之前执行一些逻辑&#xff0c;比如权限校验、用户认证或动态路由控制。通常&#xff0c;React使用react-router-dom库来管理路由&#xff0c;通过<Routes>和<Route>定义路由规则。 实现…

力扣经典题目之219. 存在重复元素 II

今天继续给大家分享一道力扣的做题心得今天这道题目是 219. 存在重复元素 II&#xff0c;我使用 hashmap 的方法来解题 题目如下&#xff0c;题目链接&#xff1a;219. 存在重复元素 II 1&#xff0c;题目分析 此题目给我们了一个整数数组 nums 和一个整数 k &#xff0c;需要…

四、VSCODE 使用GIT插件

VSCODE 使用GIT插件 一下载git插件与git Graph插件二、git插件使用三、文件提交到远程仓库四、git Graph插件 一下载git插件与git Graph插件 二、git插件使用 git插件一般VSCode自带了git&#xff0c;就是左边栏目的图标 在下载git软件后vscode的git插件会自动识别当前项目 …

消息队列MQ(二)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 MQ学习笔记 前言一、发送者的可靠性1. 生产者重试机制2. 生产者确认机制3. 实现生产者确认 二、MQ的可靠性1. 数据持久化2. LazyQueue 前言 在用MQ实现异步调用时&#xff0…

docker 常用命令实践DEMO

1.1 docker run -d -p 8080:80 --name web_server nginx 命令的详细解读 docker run: 这是 Docker 的一个基本命令&#xff0c;用于从指定的镜像启动一个新的容器。 -d: 这个参数是 --detach 的简写&#xff0c;意味着容器将在后台运行。也就是说&#xff0c;命令会立即返回&a…

Ubuntu18.04离线安装audit

Ubuntu18.04离线安装audit 查看ubuntu系统版本 lsb_release -a安装版本 下载地址 https://launchpad.net/ubuntu/bionic/arm64/libauparse0/1:2.8.2-1ubuntu1.1 https://launchpad.net/ubuntu/bionic/arm64/auditd/1:2.8.2-1ubuntu1 sudo dpkg -i libauparse0_2.8.2-1ubunt…

Meilisearch ASP.Net Core API 功能demo

安装 MeiliSearch 0.15.5 0.15.5demo code using Meilisearch; using System.Data; using System.Text.Json; using System.Text.Json.Serialization;namespace MeiliSearchAPI {public class MeilisearchHelper{public MeilisearchHelper(){DefaultClient…

关于element自定义样式popper-class

当我们在使用element组件时&#xff0c;会遇到需要修改组件的样式&#xff0c;但是样式无法覆盖原样式的情况。 用popper-class属性&#xff0c;给组件传递样式&#xff0c; 原理&#xff1a;其实就是传递给组件一个class名&#xff0c;然后设置class的样式&#xff0c;所以自定…

2024.1.5总结

今日不开心:这周本来想花点时间学习的&#xff0c;没想到全都花在刷视频&#xff0c;外出消费去了。 今日思考: 1.找对象这件事确实不能强求&#xff0c;顺其自然吧&#xff0c;单身和不单身&#xff0c;其实&#xff0c;各有各的利弊。在一次坐地铁的过程中&#xff0c;我一…

数据分析思维(九):分析方法——AARRR模型分析方法

数据分析并非只是简单的数据分析工具三板斧——Excel、SQL、Python&#xff0c;更重要的是数据分析思维。没有数据分析思维和业务知识&#xff0c;就算拿到一堆数据&#xff0c;也不知道如何下手。 推荐书本《数据分析思维——分析方法和业务知识》&#xff0c;本文内容就是提取…

【计算机网络】课程 实验四 配置快速生成树协议(RSTP)

实验四 配置快速生成树协议&#xff08;RSTP&#xff09; 一、实验目的 1&#xff0e;理解快速生成树协议RSTP的工作原理。 2&#xff0e;掌握如何在交换机上配置快速生成树。 二、实验分析与设计 【背景描述】 某学校为了开展计算机教学和网络办公&#xff0c;建立了一个计…

Tauri教程-基础篇-第一节 Tauri项目创建及结构说明

“如果结果不如你所愿&#xff0c;就在尘埃落定前奋力一搏。”——《夏目友人帐》 “有些事不是看到了希望才去坚持&#xff0c;而是因为坚持才会看到希望。”——《十宗罪》 “维持现状意味着空耗你的努力和生命。”——纪伯伦 Tauri 技术教程 * 第四章 Tauri的基础教程 第一节…

【Docker项目实战】使用Docker部署Typemill轻量级平面文件CMS

【Docker项目实战】使用Docker部署Typemill轻量级平面文件CMS 一、Typemill介绍1.1 Typemill简介1.2 主要特点1.3 主要使用场景二、本次实践规划2.1 本地环境规划2.2 本次实践介绍三、本地环境检查3.1 检查Docker服务状态3.2 检查Docker版本3.3 检查docker compose 版本四、下载…

pyinstaller冻结打包多进程程序的bug:无限创建进程直至系统崩溃

前面写过两篇相关的文章&#xff1a; PyQt应用程序打包Python自动按键 这两篇文章都没有提到下面的这个重要问题&#xff1a; 采用Pyinstaller冻结打包多进程程序时&#xff0c;必须非常小心。这个技术线在Windows上会有一个非常严重的Bug。直接运行打包后的程序会造成无限创…