复习IIC协议---以AT24C02为例
1.总纲--复习IIC(inter integrated circuit)协议以及自己顺便读一下数据手册。
/*************************************************************************************/
1.1IIC协议的总结
1.2AT24C02的数据手册的阅读
1.3AT24C02关键部分的摘抄,以及IIC协议的引入及使用
1.4关键代码的编写,以及AT24C02的上层协议。
/*************************************************************************************/
1.1IIC协议
1.1.1、首先IIC协议分为物理层(四线结构)和协议层(主机,从机,时钟极性,时钟相位)。在多主机的系统中,如果有多个主机
只要求两条总线线路,一条是串行数据线SDA,一条是串行时钟线SCL, (IIC是半双工而不是全双工)
两根线经过上拉电阻上拉之VCC,所以总线在空闲的状态下都是高电平。
注意:IIC协议:在SCL的高电平周期内,SDA线上的数据必须保持稳定(因为在SCL为高电平时,SDA如果有跳变就会被认为起始信号或者终止信号),数据线SDA仅可以在时钟SCL为低电平时改变。这一点可以参考时序图看出。
1.1.2、起始信号:SCL为高时 SDA是由高电平向低电平变化。
1.1.3、终止信号:SCL为高时 SDA为由低电平向高电平变化。
1.1.4、应答信号:每当主机向从机发送8bit数据时第九个时钟周期,从机需要给出一个低电平表示应答,
1.1.4、发送寻址信号。
数据帧格式:
有应答与非应答,
分为地址信息 和 数据信息,地址8bit--- 7位表示从机地址 第8位表示读还是写。
数据则按照数据手册的时序图来编写。
具体编写代码时:
要注意是从高位到低位,还是从低位到高位传输数据。一样采用移位位与/位或的方式。
1.2AT24C02的数据手册的阅读
概括性知识:首先阅读一外设芯片的数据手册时,要大致这个芯片的作用是什么?然后要知道这款芯片对外的接口是什么?
(是标准的协议比如SPI、IIC或其他标准协议又或者是该芯片的自定义的时序图通信协议比如ds18B20单总线协议、LCD的驱动都是自定义的协议)。然后就是熟读该芯片的数据手册熟悉他的结构及寄存器,这样才能更了解该芯片的使用功能。
在这里先get一下重点:一般芯片的数据手册中比较重要(也是相通的地方)的地方:一般开头都是:概括,特性,封装
然后最重要的是 interface,然后就是按照他的上层协议得到相应的数据。
那么接下来介绍如何读24c02芯片的数据手册。
按照我们上边的分析来看,这是一个内存(flash)芯片,说白了就是存储数据,如何将数据写入存储,在需要的时候将数据读出使用。先把准一个大方向。
首先是特性,然后就是封装,引脚介绍, 当然我们通过其引脚判断 SDA、SCL、VCC、GND.我们就知道该芯片是通过IIC总线协议来通信的,具体我们可以先写IIC底层时序。(这次之前先要初始化GPIO,主要是SDA、SCL这两个引脚)这里把属于IIC的底层时序,写到这里(为了和AT24C02的上层时序写在一起)
启动、终止、应答、写一个字节、读一个字节,
1.2.1启动代码&&终止代码
在初始化gpio引脚后,将SCL和SDA拉高。让总线处于空闲状态。
void IIC_Start()
{
SCL=;
SDA=;
Delay();
SDA=;
Delay();
SCL= ; //这里将SCL线拉低,钳住SCL,已经准备好发送或接受数据。也就是说每次Start信号后,SCL是被拉低的。
}
void IIC_End()
{
SCL=;
SDA=;
Delay();
SCL=;
Delay();
SDA=;
Delay();
}
起始信号产生后总线处于被占用的状态,在终止信号产生后总线处于空闲状态。然后起始信号的终止信号都是由主机发出的。
1.2.2、IIC总线的数据传输
IIC数据传输:这里说的数据起始也包括地址数据和真正传输的数据,
然后发送一个字节的数据。
void Send_Byte(char data)
{
char a=0;
SCL=0; //先将SCL时钟线拉低
//MSB (the Most Significant Bit) 高位在前
for(a=0;a<8;a++)
{
SDA=(data&0x80)>>7
data=data<<1;
Delay();
SCL=1;
Delay();
SCL=0;
Delay(); //具体延时时间数据手册中的时序图中具体有写。
} }
应答信号:即就是在等待从机是否将SDA拉低。但是如果没有等到该信号的到来,我们软件的设计需要足够灵活,不能死等下去导致系统死机,如果没有看门狗就会真正的挂掉的,所以设置一个变量我们只需要等待一定的时间认定这次数据不对,接着再读。
// 返回1的话 成功应答 返回0 没有应答。
u8 IIC_Wait_Ack(void)
{
u8 ucErrTime=;
SDA_IN(); // 将SDA 数据线设置为输入
SDA=;delay_us();
SCL=;delay_us();
while(READ_SDA) //判断 SDA数据线是否为低,也就是是否应答。
{
ucErrTime++;
if(ucErrTime>) // 软件设置超时时间
{
IIC_Stop();
,return ;
}
}
SCL=;
return ;
}
读出一个字节的数据:根据IIC底层时序图。
char IIC_read_Byte()
{
char receive=,a=;
SCL=; //将SCL拉低,,在读数据之前,需要将io设置为输入模式
for(a=;a<;a++)
{
receive<<;
SCL=;
Delay();
SCL=;
Delay();
if(SDA)
receive|=0X01;
}
// 要添加应答信号,也就是说在第九个时钟周期,SDA是否为低电平。
// 具体看协议中是否规定了要求应答信号。如果有那么就要加上,如果无则不需要应答信号。 return receive;
}
数据手册中的接口协议(也就是基于IIC底层的上层的协议)
往AT24C02中的写入一个字节:(当然还有页写这里就以字节写为例)
往24c02中读出一个字节(当然还有页读这里以当前地址读为例):
从器件的地址 :
在起始信号后必须发一个从机的地址(7bit(地址信息)+1bit(R/W)( 写低电平有效 ))
E:\STM32\自己的总结回顾\各种总线知识汇总\iic-------文件夹中的iic、spi总线的ppt;
从AT24c02中一个地址中写入一个字节
//这是基于AT24C02数据手册也就是上边的数据帧格式(具体代码)
void Wirte_Byte(unsigned char addr,char date) //我们默认该内存芯片的只有 256 Byte
{ IIC_Start(); // 起始信号 该函数结束时 SCL=0;
Send_Byte(0XA0); // 发送从机地址,该函数刚开始时,SCL=0; 产生8个时钟周期后, SCL=0了。
IIC_Wait_Ack(); // ack的时候,首先将SDA设置成输入模式,SCL=1(第九个时钟周期的高电平),接下来等SDA是否为低电平,不管SDA是否
//为低电平,最后等待一定时间后,SCL最终就会拉低,(第九个时钟周期结束)。
Send_Byte(addr);
IIC_Wait_Ack();
Send_Byte(date);
IIC_Wait_Ack(); // 与上边次开始两行是一样的。最后 SCL=0;
TTC_End(); // 在SCL线为高时,SDA线产生下降沿。
}
复习IIC协议---以AT24C02为例的更多相关文章
- STM32F10x -- 利用IIC协议操作AT24C02
关于AT24C02芯片的一些参数性能可参考其他的一些相关资料.此处只贴出程序. 宏文件AT24CXX.h #ifndef _AT24CXX_H_ #define _AT24CXX_H_ #includ ...
- 第十六章 IIC协议详解+UART串口读写EEPROM
十六.IIC协议详解+Uart串口读写EEPROM 本文由杭电网友曾凯峰根据小梅哥FPGA IIC协议基本概念公开课内容整理并最终编写Verilog代码实现使用串口读写EEPROM的功能. 以下为原文 ...
- IIC协议建模——读写EEPROM
案例采用明德扬设计思想完成.IIC协议是非常常用的接口协议,在电子类岗位招聘要求中经常出现它的身影.关于IIC协议这里只做简要介绍,详细信息请自行百度或查阅相关Datasheet,网上资料非常多.该篇 ...
- IIC协议学习笔记
"移植"的重要性:并非所有的电路都得自己设计,到了一定阶段,"移植"也是一种学习能力.--CrazyBingo 转眼间期末又到了,最近开始了所谓的期末总预习,比 ...
- IIC协议理解(转)
目录 IIC协议理解(转) 个人小结记录 (记一下这个就够了) 以下为转载记录 概述 概述 输出级 主设备与从设备 速率 时序 空闲状态 起始位与停止位 数据的有效性 数据的传送 工作过程 主设备向从 ...
- IIC协议解释(转)
IIC协议解释 推荐资源: http://m.elecfans.com/article/574049.html and https://blog.csdn.net/firefl ...
- FPGA基础设计(四):IIC协议
很多数字传感器.数字控制的芯片(DDS.串行ADC.串行DAC)都是通过IIC总线来和控制器通信的.不过IIC协议仍然是一种慢速的通信方式,标准IIC速率为100kbit/s,快速模式速率为400kb ...
- IIC协议解释
IIC协议解释 (1)概述 I2C(Inter-Integrated Circuit BUS) 集成电路总线,该总线由NXP(原PHILIPS)公司设计,多用于主控制器和从器件间的主从通信,在小数据量 ...
- 基于STM8的IIC协议--实例篇--时钟模块(DS3231)读取
1. 综述 由上篇博客可知道IIC协议如何用代码实现,本篇博客就不涉及协议内容,只讲解如何使用. 本次的实验传感为:DS3231(时钟模块),对于时钟模块的具体信息我也就不多介绍,大家可以自行度娘,具 ...
随机推荐
- 使用Git进行版本管理
参考:http://www.runoob.com/git/git-tutorial.html 一.Git简介 1.Git 和 SVN 比较 (1)GIT是分布式的,SVN不是; (2)GIT把内容按元 ...
- MongoDB在Linux下常用优化设置
MongoDB在Linux下常用优化设置 以下是一些MongoDB推荐的常用优化设置.在生产环境下选取合适的参数值,例如预读值和默认文件描述符数目等,会对系统性能有很大的影响. 1.关闭数据库文件的 ...
- c/c++ 多线程 一个线程等待某种事件发生
多线程 一个线程等待某种事件发生 背景:某个线程在能够完成其任务之前可能需要等待另一个线程完成其任务. 例如:坐夜间列车,为了能够不坐过站, 1,整夜保持清醒,但是这样你就会非常累,不能够睡觉. 2, ...
- AFNetworking源码浅析
本文将从最简单的GET请求方法的使用入手,由表及里,逐步探究AFNetworking如何封装处理原生的网络请求. 一.AFNetworking的简单使用 -(void)getDemo{ AFHTTPS ...
- 小程序的js处理步骤
<!-- 包含请求路由 --> var hostUrl = require('../../config.js').hostUrl; Page({ <!-- 页面的初始数据 --> ...
- Cs231n课堂内容记录-Lecture 6 神经网络训练
Lecture 6 Training Neural Networks 课堂笔记参见:https://zhuanlan.zhihu.com/p/22038289?refer=intelligentun ...
- windows环境下安装yaf框架
windows环境下安装yaf框架 在windows下安装yaf框架 准备工作: php环境(过程略,wamp,xampp,phpstudy都行,php版本大于5.3) git工具(需要从github ...
- Saltstack_使用指南02_远程执行-验证
1. 主机规划 2. Master与哪些minion通信 2.1. Master与哪些minion正常通信 [root@salt100 ~]# salt '*' test.ping salt100: ...
- SQLServer之添加聚集索引
聚集索引添加规则 聚集索引按下列方式实现 PRIMARY KEY 和 UNIQUE 约束 在创建 PRIMARY KEY 约束时,如果不存在该表的聚集索引且未指定唯一非聚集索引,则将自动对一列或多列创 ...
- js字符串String提取方法比较
JavaScript: Slice, Substring, or Substr的选择! 在JavaScript中,字符串主要通过以下String方法之一提取: // slice // syntax: ...