协议—IIC
I2C总线支持任何IC生产过程NMOS CMOS双极性,两线――串行数据 SDA 和串行时钟SCL线在连接到总线的器件间传递信息,每个器件都有一个唯一的地址识别,无论是微控制器、LCD 驱动器、存储器或键盘接口,而且都可以作为一个发送器或接收器。
总线空闲状态 :
SDA :高电平
SCL :高电平
硬件电路:
两线要各外接一个约3~10K欧的上拉电阻
宏定义必要参数:
#define SDA P1_0 //I2C 数据传送位
#define SCL P1_1 //I2C 时钟传送位
#define GuestAddr 0x1D //从机地址
延时函数:
1、
void iic_delay(){//延时约7us
for(i=16;i<16;i--);//延时时间us=(3+5*16)/12 值不可大于255
}
2、
#define iic_delay() Delay_1u(8)
void Delay_1u(uint microSecs)
{
while(microSecs--)
{
/* 32 NOPs == 1 usecs*/
asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop");
asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop");
asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop");
asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop");
asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop");
asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop");
asm("nop"); asm("nop");
}
}
起始和终止信号(灰色区域):
void iic_start() //函数功能:I2C通信开始
{
SDA = 1;
iic_delay();
SCL = 1;
iic_delay();
SDA = 0;
iic_delay();
}
void iic_stop() //函数功能:I2C通信停止
{
SDA = 0;
iic_delay();
SCL = 1;
iic_delay();
SDA = 1;
iic_delay();
}
应答信号时序:
void iic_ack() //函数功能:I2C通信查应答位
{
SCL = 1;
SCL = 0;
}
写字节代码:
void iic_write_byte(uchar wdata)//函数功能:向I2C从机写入一个字节
{
uchar i,temp,temp1;
temp1 = wdata;
for (i = 0; i < 8; i++)
{
SCL = 0;
iic_delay();
temp = temp1;
temp = temp&0x80;
SDA = (temp == 0x80? 1: 0);
iic_delay();
SCL = 1;
iic_delay();
SCL = 0;
iic_delay();
temp1 <<= 1;
}
}
读字节代码:
uchar iic_read_byte(void) //函数功能:从I2C从机中读出一个字节
{
uchar x;
uchar data;
for (x = 0; x < 8; x++) {
data <<= 1;
SDA = 1;
iic_delay();
SCL = 0;
iic_delay();
SCL = 1;
iic_delay();
P1DIR &= ~0x01
if(SDA == 1) data |= 0x01;
P1DIR |= 0x01
}
return data;
}
综合应用:
void iic_write(uchar byte_add,uchar wdata)//函数功能:按地址写入一字节数据
{
uchar t;
t = GuestAddr <<1;
/* 第一个字节的头 7 位组成了从机地址,最低位它决定了报文的方向:第一个字节的最低位是 0 表示主机会写信息到被选中的从机 ,1 表示主机会向从机读信息*/
iic_start(); //起始信号
iic_write_byte(t);
iic_ack();
iic_write_byte(byte_add);//内部寄存器地址
iic_ack();
iic_write_byte(wdata);//内部寄存器数据
iic_ack();
iic_stop();
}
uchar iic_read(uchar byte_add) //函数功能:按地址读出一字节数据
{
uchar t;
uchar x;
t = (GuestAddr << 1);
iic_start();
iic_write_byte(t);
iic_ack();
iic_write_byte(byte_add);
iic_ack();
t = (GuestAddr << 1) | 0x01;
/* 第一个字节的头 7 位组成了从机地址,最低位它决定了报文的方向:第一个字节的最低位是 0 表示主机会写信息到被选中的从机 ,1 表示主机会向从机读信息*/
iic_start();
iic_write_byte(t);
iic_ack();
x = iic_read_byte();
iic_ack();
iic_stop();
return x;
}
************************************************************************************************
延时函数参考:https://m.hqew.com/tech/fangan_1647539
来源于课堂整理
协议—IIC的更多相关文章
- 协议——IIC
I²C即Inter-Integrated Circuit(集成电路总线),它是一种串行通信总线,使用多主从架构,由飞利浦公司在1980年代设计出来的一种简单.双向.二线制总线标准.多用于主机和从机在数 ...
- FPGA基础设计(四):IIC协议
很多数字传感器.数字控制的芯片(DDS.串行ADC.串行DAC)都是通过IIC总线来和控制器通信的.不过IIC协议仍然是一种慢速的通信方式,标准IIC速率为100kbit/s,快速模式速率为400kb ...
- 九、IIC驱动原理分析
学习目标:学习IIC驱动原理: 一.IIC总线协议 IIC串行总线包括一条数据线(SDA)和一条时钟线(SCL),支持“一主多从”和“多主机”模式:每个从机设备都有唯一的地址来识别. 图 1 IIC ...
- 【STM32】IIC的基本原理(实例:普通IO口模拟IIC时序读取24C02)(转载)
版权声明:本文为博主原创文章,允许转载,但希望标注转载来源. https://blog.csdn.net/qq_38410730/article/details/80312357 IIC的基本介绍 ...
- IIC通信控制的AD5259------在调试过程中遇到的奇葩问题
首先说一下的遇到的问题: 1.AD5259按照SCL是100KHz的情况下,可以正常接收上位机的数据,但是一段时间后,就不能正确的按照时序来走了 原因在于AD5259在接收到上位机的数据后需要一定的响 ...
- 51单片机下实现软件模拟IIC通信
1.IIC协议简易概述 IIC全称Inter-Integrated Circuit (集成电路总线),是由PHILIPS公司在80年代开发的两线式串行总线,用于连接微控制器及其外围设备.IIC属于半双 ...
- 嵌入式LINUX入门到实践(一)
MINI2440 IIC协议 IIC协议在工程中应用广泛,在我看来,此协议的优势就在于其硬件及其简单,结构清晰. 首先来解读一下S3C2440A这款芯片的IIC协议. 一.一个协议的解读从如上结构图中 ...
- OLED屏幕详细使用
IC扩展-OLED屏的点亮,模拟IIC功能实现C代码点亮OLED屏,只要是可以C编程且有两个GPIO口的单片机均可更改小部分代码使用.OLED屏为像素自发光,其尺寸多为128*64,表示横轴上有128 ...
- 基于STM32F429的ADS1115驱动程序
1.ADS1115中文资料:https://wenku.baidu.com/view/8bab101feef9aef8941ea76e58fafab069dc44e7.html?rec_flag=de ...
随机推荐
- FTP做作业用到的知识点:
FTP做作业用到的知识点: 一: os.path 模块下常用的用法 os.path.abspath(file) #返回的是.py文件的绝对路径(完整路径) os.path.dirname(file) ...
- 浅谈Java和PHP的异同
编程范式: Java:纯面向对象的语言,有人说过:Java中一切皆对象!当然咯,人们都忘了Java的八种基本数据类型:int.double.boolean.byte.float.long.short. ...
- layer.tips属性
layer.tips(新加的内容,'选择节点',{time: 0, area: ['20%', '20%'], skin: 'layui-layer-rim', tips: [3, '#ffffff' ...
- RNQOJ PID28 / [Stupid]愚蠢的宠物
勉勉强强够着点并查集的边,题目吧他分类到并查集也无可厚非,这里与常规的并查集的区别在于要做一个mark数组进行一下标记,展开来说就是对于要查询的A,B,先对A进行处理,把A所有的前驱也就是双亲节点进行 ...
- 磨人的Fragment的转换
磨人的Fragment的转换 本次任务是 程序运行之后将第一个Fragment加载出来 然后点击"SHOW NEXT PAGE"切换到第二个Fragment 当再次点击按钮时下方出 ...
- 递归打印lua中的table
在lua中,table是比较常用的数据形式,有时候为了打印出里面的内容,需要做一些特殊处理. 废话不多讲,直接粘代码: print = release_print -- 递归打印table local ...
- nlp L1
前向最大匹配: 最大匹配出的词必须保证下一个扫描不是词表中的词或词的前缀才可以结束. 正向最大匹配算法:从左到右将待分词文本中的几个连续字符与词表匹配,如果匹配上,则切分出一个词.但这里有一个问题:要 ...
- 登陆页、注册页、会员中心页logo图的替换
关闭 PHP在线开发笔记 目录视图 摘要视图 订阅 异步赠书:9月重磅新书升级,本本经典 程序员9月书讯 每周荐书:ES6.虚 ...
- 基于UML的时空建模
一.基本信息 标题:基于UML的时空建模 时间:2018 出版源:东北大学学报(自然科学版) 领域分类:UML模型:RCC-8空间拓扑:Allen-13时态拓扑:时空数据:建模 二.研究背景 问题定义 ...
- Activiti工作流数据库表详细介绍
Activiti的后台是有数据库的支持,所有的表都以ACT_开头. 第二部分是表示表的用途的两个字母标识. 用途也和服务的API对应. ACT_RE_*: 'RE'表示repository. 这个前缀 ...