STM32:IIC详解

文章目录

  • 1.IIC历史
  • 2.IIC优势
  • 3.IIC时序
    • 3.1 初始化IIC
    • 3.2 产生IIC起始信号
    • 3.3 产生IIC停止信号
    • 3.4 等待ACK
    • 3.5 产生ACK / 不产生ACK
    • 3.6 IIC发送一个字节
    • 3.7 IIC读取一个字节
    • 3.8 IIC发送多字节
    • 3.9 IIC读取多字节
  • 4 IIC问题
    • 4.1 STM32 HAL库的IIC设备地址没有左移

1.IIC历史

2.IIC优势

3.IIC时序

3.1 初始化IIC

//初始化IIC
void PCA9557_Init(void)
{					     RCC->APB2ENR |= 1<<4;//先使能外设IO PORTC时钟 							 GPIOC->CRH &= 0XFFFF00FF;//PC10/11 推挽输出GPIOC->CRH |= 0X00003300;	   GPIOC->ODR |= 1<<10;     //PC10 输出高GPIOC->ODR |= 1<<11;     //PC11 输出高
}

3.2 产生IIC起始信号

//产生IIC起始信号
void PCA9557_Start(void)
{PCA9557_SDA_OUT(); //sda线输出PCA9557_SDA=1;PCA9557_SCL=1;delay_us(4);PCA9557_SDA=0;//START:when CLK is high,DATA change form high to lowdelay_us(4);PCA9557_SCL=0;//钳住I2C总线,准备发送或接收数据
}

3.3 产生IIC停止信号

//产生IIC停止信号
void PCA9557_Stop(void)
{PCA9557_SDA_OUT();//sda线输出PCA9557_SCL=0;PCA9557_SDA=0;//STOP:when CLK is high DATA change form low to highdelay_us(4);PCA9557_SCL=1;PCA9557_SDA=1;//发送I2C总线结束信号delay_us(4);
}

3.4 等待ACK

//等待应答信号到来
//返回值:1,接收应答失败
// 0,接收应答成功
uint8_t PCA9557_Wait_Ack(void)
{uint8_t ucErrTime=0;PCA9557_SDA_IN(); //SDA设置为输入PCA9557_SDA=1;delay_us(1);PCA9557_SCL=1;delay_us(1);while(PCA9557_READ_SDA){ucErrTime++;if(ucErrTime>250){PCA9557_Stop();return 1;}}PCA9557_SCL=0;//时钟输出0return 0;
}

3.5 产生ACK / 不产生ACK

//产生ACK应答
void PCA9557_ACK(void)
{PCA9557_SCL=0;PCA9557_SDA_OUT();PCA9557_SDA=0;delay_us(2);PCA9557_SCL=1;delay_us(2);PCA9557_SCL=0;
}//不产生ACK应答
void PCA9557_NAck(void)
{PCA9557_SCL=0;PCA9557_SDA_OUT();PCA9557_SDA=1;delay_us(2);PCA9557_SCL=1;delay_us(2);PCA9557_SCL=0;
}

3.6 IIC发送一个字节

//IIC发送一个字节
//返回从机有无应答
//1,有应答
//0,无应答
uint8_t PCA9557_Send_Byte(uint8_t txd)
{uint8_t t;PCA9557_SDA_OUT();PCA9557_SCL=0;//拉低时钟开始数据传输for(t=0;t<8;t++){if (txd&0x80) PCA9557_SDA = 1;else PCA9557_SDA = 0;txd<<=1;delay_us(2); //对TEA5767这三个延时都是必须的PCA9557_SCL=1;delay_us(2);PCA9557_SCL=0;delay_us(2);}t=PCA9557_Wait_Ack();  //这里固定只要写字节就需要等待应答return (t);
}

3.7 IIC读取一个字节

//读1个字节,ack=1时,发送ACK,ack=0,发送nACK
uint8_t PCA9557_Read_Byte(uint8_t ack)
{uint8_t i,receive=0;PCA9557_SDA_IN();//SDA设置为输入for(i=0;i<8;i++ ){PCA9557_SCL=0;delay_us(2);PCA9557_SCL=1;receive<<=1;if(PCA9557_READ_SDA)receive |= 1;delay_us(1);}if (!ack)PCA9557_NAck();//发送nACKelsePCA9557_ACK(); //发送ACKreturn receive;
}

3.8 IIC发送多字节

uint8_t PCA9557Write(uint8_t addr, uint8_t len, uint8_t *pData)
{uint8_t i;PCA9557_Start();if(PCA9557_Send_Byte(PCA9557_ADDR_WRITE)==1){PCA9557_Stop();return 0;}if(PCA9557_Send_Byte(addr)==1){PCA9557_Stop();return 0;}for(i = 0; i < len; i++){if(PCA9557_Send_Byte(pData[i])==1){PCA9557_Stop();return 0;}}PCA9557_Stop();return 1;
}

3.9 IIC读取多字节

uint8_t PCA9557Read(uint8_t addr,uint8_t len,uint8_t *pData)
{uint8_t i;PCA9557_Start();if(PCA9557_Send_Byte(PCA9557_ADDR_WRITE)==1){PCA9557_Stop();return 0;}if(PCA9557_Send_Byte(addr)==1){PCA9557_Stop();return 0;}PCA9557_Start();if(PCA9557_Send_Byte(PCA9557_ADDR_READ)==1){PCA9557_Stop();return 0;}for(i=0; i<len-1; i++){pData[i] = PCA9557_Read_Byte(1);}pData[len-1] = PCA9557_Read_Byte(0);PCA9557_Stop();return 1;
}

4 IIC问题

4.1 STM32 HAL库的IIC设备地址没有左移

#define I2C_7BIT_ADD_WRITE(__ADDRESS__)                    ((uint8_t)((__ADDRESS__) & (uint8_t)(~I2C_OAR1_ADD0)))
#define I2C_7BIT_ADD_READ(__ADDRESS__)                     ((uint8_t)((__ADDRESS__) | I2C_OAR1_ADD0))

底层中并没有把设备的地址左移,而是直接把最低位改为“0”或“1”,需要自己把器件地址的左移了一位。

	stat = HAL_I2C_Mem_Read(&hi2c1,(PCA9557_I2C_BUS_ADDR << 1),PCA9557_INPUT_REG,1,&io_statu,1,0xFF);if(stat != 0 ){LOG_INFO("io %d Read Error STAT %d\r\n",io,stat);}

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

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

相关文章

C语言指针的介绍

零.导言 在日常生活中&#xff0c;我们常常在外出时居住酒店&#xff0c;细心的你一定能发现酒店不同的房间上有着不同的门牌号&#xff0c;上面写着像308&#xff0c;512之类的数字。当你定了酒店之后&#xff0c;你就会拿到一个写有门牌号的钥匙&#xff0c;凭着钥匙就能进入…

【Spring MVC】DispatcherServlet 请求处理流程

一、 请求处理 Spring MVC 是 Spring 框架的一部分&#xff0c;用于构建 Web 应用程序。它遵循 MVC&#xff08;Model-View-Controller&#xff09;设计模式&#xff0c;将应用程序分为模型&#xff08;Model&#xff09;、**视图&#xff08;View&#xff09;和控制器&#x…

[ 问题解决篇 ] win11远程桌面报错:出现身份验证错误要求的函数不受支持(附完整解决方案)

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…

汽车免拆诊断案例 | 2010款起亚赛拉图车发动机转速表指针不动

故障现象  一辆2010款起亚赛拉图车&#xff0c;搭载G4ED 发动机&#xff0c;累计行驶里程约为17.2万km。车主反映&#xff0c;车辆行驶正常&#xff0c;但组合仪表上的发动机转速表指针始终不动。 故障诊断  接车后进行路试&#xff0c;车速表、燃油存量表及发动机冷却温度…

自动化运维

自动化运维是指使用工具和脚本自动化管理、配置、监控和维护IT基础设施的过程。通过自动化运维&#xff0c;可以提高工作效率&#xff0c;减少人为错误&#xff0c;增加系统的可预测性和稳定性。以下是实现自动化运维的常见步骤和工具&#xff1a; 常见步骤&#xff1a; 1. 定义…

驱动——线程断链和信息获取

实验环境&#xff1a;win7 x32 断链&#xff1a; #include <ntifs.h>NTSTATUS EnumThread(ULONG ulPid, ULONG ulTid) {PEPROCESS pProcessAddr PsGetCurrentProcess();PLIST_ENTRY pHeadlink (PLIST_ENTRY)((ULONG)pProcessAddr 0xb8);PLIST_ENTRY pNextlink pHead…

AWD挨打记录

前言 昨天参加了星盟的AWD集训&#xff0c;本来寻思能猛猛乱杀&#xff0c;结果加固时间只有20分钟&#xff0c;WAF还没push上去就被三家上了不死马QAQ cms是站帮主&#xff0c;之前没打过&#xff0c;D盾啥也没扫出来&#xff0c;还寻思是个贼安全的系统&#xff0c;结果洞满…

鸿蒙打包hvigorw clean报错No npmrc file is matched in the current user folder解决

问题 在执行hvigorw clean等命令时&#xff0c;报错如下&#xff1a; Error: The hvigor depends on the npmrc file. No npmrc file is matched in the current user folder. Configure the npmrc file first解决方案 在用户当前目录下新建.npmrc文件&#xff0c;并配置如下…

前端如何实现进度条

将进度条的宽度动态控制&#xff0c;通过css的transition动画来控制 <template><div class"container"><div class"base-progress"><div class"inner" :style"{ width: w % }"><div class"text&qu…

SWAT-MODFLOW地表水与地下水耦合实践技术

耦合模型被应用到很多科学和工程领域来改善模型的性能、效率和结果&#xff0c;SWAT作为一个地表水模型可以较好的模拟主要的水文过程&#xff0c;包括地表径流、降水、蒸发、风速、温度、渗流、侧向径流等&#xff0c;但是对于地下水部分的模拟相对粗糙&#xff0c;考虑到SWAT…

江协科技STM32学习- P27 实验-串口发送/串口接收

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是黄桃罐头&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​…

Linux笔记--基础入门

文章目录 Linux基础知识点文件目录*磁盘分区**基础命令*Linux运行级别关机重启手册alias别名ntsysv系统服务管理程序 Linux常用命令命令分类命令行格式选项参数 命令行辅助操作 真常用命令()help命令&#xff1a;帮助指令man手册页manual page绝对路径与相对路径绝对路径&#…

11月1日星期五今日早报简报微语报早读

11月1日星期五&#xff0c;农历十月初一&#xff0c;早报#微语早读。 1、六大行今日起实施存量房贷利率新机制。 2、谷歌被俄罗斯罚款35位数&#xff0c;罚款远超全球GDP。 3、山西吕梁&#xff1a;女性35岁前登记结婚&#xff0c;给予1500元奖励。 4、我国人均每日上网时间…

Pandas DataFrame学习补充

1. 从字典创建&#xff1a;字典的键成为列名&#xff0c;值成为列数据。 import pandas as pd# 通过字典创建 DataFrame df pd.DataFrame({Column1: [1, 2, 3], Column2: [4, 5, 6]}) 2. 从列表的列表创建&#xff1a;外层列表代表行&#xff0c;内层列表代表列。 df pd.Da…

<项目代码>YOLOv8 煤矸石识别<目标检测>

YOLOv8是一种单阶段&#xff08;one-stage&#xff09;检测算法&#xff0c;它将目标检测问题转化为一个回归问题&#xff0c;能够在一次前向传播过程中同时完成目标的分类和定位任务。相较于两阶段检测算法&#xff08;如Faster R-CNN&#xff09;&#xff0c;YOLOv8具有更高的…

推荐一款功能强大的文字处理工具:Atlantis Word Processor

Atlantis word proCEssor是一款功能强大的文字处理工具。该软件可以让用户放心的去设计文档&#xff0c;并且软件的界面能够按用户的意愿去自定义&#xff0c;比如工具栏、字体选择、排版、打印栏等等&#xff0c;当然还有更多的功能&#xff0c;比如你还可以吧软件界面中的任何…

「虚拟现实中的心理咨询:探索心灵世界的新方法」

内容概要 当我们想到虚拟现实时&#xff0c;很多人会联想到游戏或娱乐&#xff0c;但如今其在心理咨询领域的应用正在逐渐崭露头角。传统的心理咨询方式常常局限在咨询室内&#xff0c;面临着空间和情感隔阂的问题。然而&#xff0c;沉浸式环境的出现&#xff0c;使得治疗者能…

图像修复与重建——几何失真(畸变)的概念

一 几何失真&#xff08;畸变&#xff09;的概念 在实际的成像系统中&#xff0c;图像捕捉介质平面和物体平面之间不可避免地存在有一定的转角和倾斜角。转角对图像的影响是产生图像旋转&#xff0c;倾斜角的影响表现为图像发生投影变形。另外一种情况是由于摄像机系统本身的原…

Spark的集群环境部署

一、Standalone集群 1.1、架构 架构&#xff1a;普通分布式主从架构 主&#xff1a;Master&#xff1a;管理节点&#xff1a;管理从节点、接客、资源管理和任务 调度&#xff0c;等同于YARN中的ResourceManager 从&#xff1a;Worker&#xff1a;计算节点&#xff1a;负责利…

使用 Python 的 BeautifulSoup 与 Flask/Flask-RESTful 集成进行数据爬取和 API 构建

使用 Python 的 BeautifulSoup 与 Flask/Flask-RESTful 集成进行数据爬取和 API 构建 在现代 Web 开发中&#xff0c;许多应用需要从其他网页提取数据并将其呈现为 API 服务。Python 的 BeautifulSoup 是一个流行的 HTML 解析库&#xff0c;用于从网页抓取和解析数据&#xff…