STM32的IIC应用详解1
概要
IIC(IIC,inter-Integrated circuit),两线式串行总线,用于MCU和外设间的通信。
IIC只需两根线:数据线SDA和时钟线SCL。以半双工方式实现MCU和外设之间数据传输,速度可达400kbps。
多主机I2C总线结构
注意SDA和SCL两根总线需要上拉,使总线处于空闲状态。
IIC协议
空闲状态
协议规定,SDA和SCL同时为高电平时,总线处于空闲状态。上拉电阻保证电平处于高电平。
起始信号和停止信号
起始信号:SCL为高电平时,SDA电平发生高到低的跳变
停止信号:SCL为高电平时,SDA电平发生低到高的跳变
应答信号
发送器每发送完一个字节(8个脉冲),在第9个脉冲间释放总线,接收器返回一个ACK信号,协议规定,低电平为有效应答,高电平为无效应答。
数据有效性
协议对有效数据进行了规定:即时钟信号为高电平期间,数据必须保持稳定,时钟信号低电平期间,数据线上的电平才允许变化。也就是说,数据在时钟信号到来前必须准备好,并保持到时钟信号的下降沿之后。
数据传输
I2C为同步传输,时钟控制数据位的传输,边沿触发。
驱动程序
直接引用实验中的代码。测试没问题。
起始信号
//产生IIC起始信号
void IIC_Start(void)
{SDA_OUT(); //sda线输出IIC_SDA=1; IIC_SCL=1;delay_us(4);IIC_SDA=0;//START:when CLK is high,DATA change form high to low delay_us(4);IIC_SCL=0;//钳住I2C总线,准备发送或接收数据
}
停止信号
//产生IIC停止信号
void IIC_Stop(void)
{SDA_OUT();//sda线输出IIC_SCL=0;IIC_SDA=0;//STOP:when CLK is high DATA change form low to highdelay_us(4);IIC_SCL=1; IIC_SDA=1;//发送I2C总线结束信号delay_us(4);
}
有效应答
//产生ACK应答
void IIC_Ack(void)
{IIC_SCL=0;SDA_OUT();IIC_SDA=0;delay_us(2);IIC_SCL=1;delay_us(2);IIC_SCL=0;
}
无效应答
//不产生ACK应答
void IIC_NAck(void)
{IIC_SCL=0;SDA_OUT();IIC_SDA=1;delay_us(2);IIC_SCL=1;delay_us(2);IIC_SCL=0;
}
发送单字节
//IIC发送一个字节
//返回从机有无应答
//1,有应答
//0,无应答
void IIC_Send_Byte(u8 txd)
{ u8 t; SDA_OUT(); IIC_SCL=0;//拉低时钟开始数据传输for(t=0;t<8;t++){ IIC_SDA=(txd&0x80)>>7;txd<<=1; delay_us(2); //对TEA5767这三个延时都是必须的IIC_SCL=1;delay_us(2); IIC_SCL=0; delay_us(2);}
}
接收单字节
//读1个字节,ack=1时,发送ACK,ack=0,发送nACK
u8 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();//发送nACKelseIIC_Ack(); //发送ACK return receive;
}
EEPROM
24C02为IIC接口,容量为256字节。
封装如下图:
管脚定义:
设备地址的高四位固定,中间为地址线定义的地址,最后一位为读写位。
由于A0,A1,A2设置为0,所以
读的时候:Device Address = 0xA1;
写的时候:Device Address = 0xA0;
24C02字节写时序
- 起始信号
- 写设备地址,Device Address = 0xA0;
- 等待应答
- 确定写入的EEPROM地址即WORD ADDRESS
- 等待应答
- 向SDA数据线上写入数据DATA
- 等待应答
- 停止信号
//在AT24CXX指定地址写入一个数据
//WriteAddr :写入数据的目的地址
//DataToWrite:要写入的数据
void AT24CXX_WriteOneByte(u16 WriteAddr,u8 DataToWrite)
{ IIC_Start(); if(EE_TYPE>AT24C16){IIC_Send_Byte(0XA0); //发送写命令IIC_Wait_Ack();IIC_Send_Byte(WriteAddr>>8);//发送高地址 }else IIC_Send_Byte(0XA0+((WriteAddr/256)<<1)); //发送器件地址0XA0,写数据 IIC_Wait_Ack(); IIC_Send_Byte(WriteAddr%256); //发送低地址IIC_Wait_Ack(); IIC_Send_Byte(DataToWrite); //发送字节 IIC_Wait_Ack(); IIC_Stop();//产生一个停止条件 delay_ms(10);
}
24C02字节读时序
- 起始信号
- 写设备地址,Device Address = 0xA0;
- 等待应答
- 确定写入的EEPROM地址即WORD ADDRESS
- 等待应答
- 起始信号
- 读设备地址,Device Address = 0xA1;
- 等待应答
- 读SDA上数据
- 等待应答
- 停止信号
//在AT24CXX指定地址读出一个数据
//ReadAddr:开始读数的地址
//返回值 :读到的数据
u8 AT24CXX_ReadOneByte(u16 ReadAddr)
{ u8 temp=0; IIC_Start(); if(EE_TYPE>AT24C16){IIC_Send_Byte(0XA0); //发送写命令IIC_Wait_Ack();IIC_Send_Byte(ReadAddr>>8);//发送高地址 }else IIC_Send_Byte(0XA0+((ReadAddr/256)<<1)); //发送器件地址0XA0,写数据 IIC_Wait_Ack(); IIC_Send_Byte(ReadAddr%256); //发送低地址IIC_Wait_Ack(); IIC_Start(); IIC_Send_Byte(0XA1); //进入接收模式 IIC_Wait_Ack(); temp=IIC_Read_Byte(0); IIC_Stop();//产生一个停止条件 return temp;
}
参考
STM32F3与 F4 系列 Cortex M4 内核编程手册
STM32F4xxx中文参考手册
STM32F4xxx英文参考手册
STM32F4 开发指南(寄存器版)
STM32的IIC应用详解1相关推荐
- STM32的IIC应用详解3
分享: 这两天将STM32的IIC按照原子哥的程序,大致走了一遍,多少对IIC不是那么地陌生了,也多少有了自己的一些感悟,在这里,将这两天的学习的一个大致步骤总结下,一来可以让自己形成一个清晰地思路, ...
- STM32的IIC应用详解2
IIC简单介绍 小编能力有限,写的不对处还望诸位大侠指正哈! 平时所说的IIC通信指的是用单片机的两个I/O端口模拟出来的IIC,正真的IIC实际上是一块硬件电路,那是飞利浦公司的专利,要想用那就拿钱 ...
- STM32常用协议之IIC协议详解
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 IIC协议详解 前言 一.IIC协议简介 1.1 简介 1.2 IIC物理层 1.3 协议层 1.3.1 IIC基本读写过程 1.3. ...
- stm32项目平衡车详解(stm32F407)下
stm32项目平衡车详解(stm32F407)下 本文章学习借鉴于创客学院团队,以表感谢.教学视频 B站学习地址 HC-SRO4 超声波测距避障功能开发 TSL1401 CCD摄像头实现小车巡线功能 ...
- UART, SPI, IIC的详解及三者的区别和联系
1.UART, SPI, IIC的详解 UART.SPI.IIC是经常用到的几个数据传输标准,下面分别总结一下: UART(Universal Asynchronous Receive Transmi ...
- STM32—— AHB、APB详解
STM32-- AHB.APB详解 2016-07-14 20:35 590人阅读 评论(0) 收藏 举报 本文章已收录于: 版权声明:本文为博主原创文章,未经博主允许不得转载. 一.概括 首先 ...
- STM32开发 -- 蓝牙开发详解(2)
如需转载请注明出处:https://juyou.blog.csdn.net/article/details/100708695 接着 STM32开发 – 蓝牙开发详解(1) 这一篇接着讲. 看了好久好 ...
- STM32开发 -- 低功耗模式详解(2)
如需转载请注明出处:https://juyou.blog.csdn.net/article/details/98631012 上一篇文章 STM32开发 – 低功耗模式详解(1) 简单的总结了一下低功 ...
- IIC通信协议详解 PCF8591应用(Verilog实现FPGA)
IIC通信协议详解 & PCF8591应用(Verilog实现/FPGA) 该文章结合PCF8591 8-bit AD/DA 模数/数模转换器来详细介绍IIC通信协议,尽量做到条理清晰,通俗易 ...
最新文章
- [异常解决] ubuntu上安装虚拟机遇到的问题(vmware坑了,virtual-box简单安装,在virtual-box中安装精简版win7)
- mysql调用jieba库_jieba库的使用及实例
- 【Android 异步操作】线程池 ( 线程池简介 | 线程池初始化方法 | 线程池种类 | AsyncTask 使用线程池示例 )
- 解读小米MoGA:超过MobileNetV3的移动端GPU敏感型搜索
- redis-2.8.17安装指导(自己做测试了)
- 聊聊Function的bind()
- flask 继承模版的基本使用1
- 克隆需要验证_[实验技巧]CRISPR实验中如何验证编辑?
- 计算机工程说课稿,人教版数学说课稿集合五篇
- centos 7 下安装haproxy
- CF - 1214D
- oracle roseha 配置,RoseHA 9.0 for Windows配合Oracle11g配置文档_v2.0-2015-04.pdf
- 重装系统后计算机无法启动,重装系统后电脑重启没反应是怎么回事?如何解决呢?...
- 梅隆大学计算机专业申请,卡耐基梅隆大学计算机专业申请要求及研究方向
- 重构改善即有代码的设计
- 鹅厂同学:7 月开始不再进行薪酬调整?
- 诊断2018微商:从乱象到赋能,世界微商大会发明的新玩法为您指路
- SAS实验04 ——回归分析
- 【云和恩墨大讲堂】高凯 | Oracle 12c 新特性-多租户的维护管理
- Git LFS(Large File Storage)使用简介
热门文章
- Jmeter使用入门
- itchat 动态注册
- C 标准库 - ctype.h之isalnum使用
- 【2017-05-30】WebForm文件上传。从服务端删除文件
- The differences between capturing and bubbling
- selenium webdriver python 环境搭建
- 浙江大学PAT上机题解析之1009. 说反话 (20)
- 使用Microsoft Azure Backup备份Hyper-V数据
- 解决Access denied for user #39;#39;@#39;localhost#39; to database #39;mysql#39;问题
- 应用新安全组 - 每天5分钟玩转 OpenStack(116)