IIC协议原理及IIC通信的具体实现(S3C2440裸机开发)

news2024/10/6 6:05:34

文章目录

  • 前言
  • 一、IIC协议
  • 二、IIC的控制
    • 2.1 IIC控制相关寄存器
    • 2.2 IIC控制中的特征信号
    • 2.3 IIC的数据传输格式
      • 2.3.1 ACK信号
      • 2.3.2 数据读写操作
      • 2.3.3 中止通信
  • 三、 IIC编程
    • 3.1 IIC编程的相关寄存器
    • 3.2 IIC代码实现
  • 总结


前言

本期和大家主要分享的是一种非常常见并且非常常用的的一种协议------IIC通信协议;既然能称为一种协议,那么一定是通信中人们需要去遵守的一种通信标准,接下来让我们细细来了解一下!


一、IIC协议

IIC有两条串行线,一条是专用串行数据线(SDA),另一条是专用串行时钟线(SCL),并且这两根线都是双向的;
同步串行半双工,多主的总线协议;

二、IIC的控制

2.1 IIC控制相关寄存器

S3C2440要是想控制IIC总线,那么必须写入值到以下寄存器中:

多主控 IIC 总线控制寄存器,IICCON
多主控 IIC 总线控制/状态寄存器,IICSTAT
多主控 IIC 总线 Tx/Rx 数据移位寄存器,IICDS
多主控 IIC 总线地址寄存器,IICADD

IIC的总线框图如下:
在这里插入图片描述

2.2 IIC控制中的特征信号

要想合理的控制IIC总线,必须清楚几个重要的信号:
(1)当IIC总线空闲时,SCL和SDA两个串行线都为高电平;
(2)IIC总线的起始信号:SCL为高时(总线空闲),SDA由高变低的这个信号,定义其为一个起始信号(start);
(3)IIC总线的停止信号:SCL为高时(总线使用时),SDA由低变高的这个信号,定义其为一个停止信号(stop);
在这里插入图片描述
这里需要注意的是start和end只能由主机发出;当产生了stop信号后,iic总线变为空闲状态;

2.3 IIC的数据传输格式

当start信号被发送后,要想进行通信,必须指出通信目标的地址,之后再进行数据发送;发送完毕后再发送stop信号;按字节发送,高位先发 ,每8位发送必须有一个位应答;

start发送后,紧接着的1个字节允许用户写入从机地址和读写标志,这一个字节中前七位为从机地址,最后一位是读写标志(0为写标志,1为读标志);

start	  +	1字节				+	ack	+	数据
SCL=1		前七位为从机地址		
SDA=0		最后一位为读写标志

2.3.1 ACK信号

(1)为了完成一次单字节传输操作,接收器应该发送一个 ACK 位给发送器。ACK 脉冲应该发生在 SCL 线的第 9个时钟。前 8 个时钟是提供给单字节传输的。主机需要应该产生时钟脉冲来发送 ACK 位。
(2)当发送器收到 ACK 时钟脉冲时,应该通过拉高 SDA 线(stop)来释放 SDA 线。当接收器在 ACK 时钟脉冲期间也应该驱动 SDA 线为低,在第 9 个脉冲的高电平时期期间保持 SDA 为低。
(3)ACK 位发送功能可以由软件(IICSTAT)使能或禁止。然而,需要 SCL 的第 9 个时钟上的 ACK 脉冲来完成单字节的传输操作。
在这里插入图片描述

2.3.2 数据读写操作

(1)发送模式中当发送了数据时,在 IIC 总线数据移位(IICDS)寄存器收到新数据之前 IIC 总线接口将会一直等待。在新数据写入到寄存器之前,SCL 线将会保持为低,然后在其写入后释放。S3C2440A 应该等待中断来确定当前数据发送的完成。在 CPU 收到中断请求后,需要再次写一个新数据到 IICDS 寄存器中。
(2)接收模式中当收到了数据时,在读取 IICDS 寄存器前 IIC 接口将会一直等待。在新数据读出前,SCL 线将会保持为低,然后在其读取后释放。S3C2440A 应该等待中断来确定当前数据接收的完成。在 CPU 收到中断请求后,需要从 IICDS 寄存器中读取数据。
在这里插入图片描述
这里当主机发送了一个数据后并且ACK信号产生之后,SCL会变为低电平,这个时候从机可以读取数据;

2.3.3 中止通信

(1)如果从接收器不能应答从地址的确认,其应该保持 SDA 线的电平为高。这种情况中,主机应该产生一个停止条件并且中止传输。
(2)如果主机接收器受到了传输中止的影响,其应该通过取消来自从机收到的最后数据字节后 ACK(nack)的产生来指示从发送操作的结束。从发送器应该随后释放 SDA 来允许主机产生停止条件。

三、 IIC编程

3.1 IIC编程的相关寄存器

  1. start stop ack noack
    IICCON 第7位 1使能ack 0禁止ack
    IICSTAT 第5位 写操作 1 start信号 0 stop信号 读操作 1 总线忙碌 0 总线空闲
    IICSTAT 第4位 1使能电路
    在这里插入图片描述
    在这里插入图片描述

  2. 数据
    IICDS发送和接收的缓存区
    IICADDIIC 总线地址寄存器
    在这里插入图片描述
    在这里插入图片描述

  3. 数据操作时刻
    IICCON第5位使能中断(发完8位 接够8位产生中断)
    IICCON第4位 中断标志(读操作 1 产生中断 0 没有中断 写0清除中断)
    IICSTAT 第0位 0 接收到ack 1没有ack

  4. 时钟 IICCON 第6位 一级分频 第3-0位二级分频值

3.2 IIC代码实现

void iic_init()
{
	GPECON &= ~(0xf<<28);
	GPECON |= 0xa<<28;						  //设置GPE14,15为IIC功能
	IICCON = (1<<7) | (1<<5) | (1<<6);		  //使能ack,使能中断,时钟=50M/512/1 = 97k;
	IICSTAT = 1<<4;							  //使能输出
}

int wait_pend()
{
	int cnt = 0xffff;

	while (cnt--)
	{
		if(IICCON & (1<<4))			//标志位是否置位,置位代表发完了
		{
			return 0;
		}
	}
	return -1;
}

void clear()
{
	IICCON &= ~(1<<4);	   //清除中断标志位
}

void stop()
{
	int num = 1000;

	IICSTAT = 0xd0;	//发送stop信号
	clear();	
	while(num--);	//电路作用需要时间
}

int iic_write(char s_addr, char d_addr, char data) //总流程是写入从机地址,写入数据地址,最后写入数据
{
	int ret = -1;

	IICDS = s_addr<<1;			//写入从机地址和写标志(最后一位是写标志)
	IICSTAT = 0xf0;				//发送start信号

	if(wait_pend() < 0)			//(如果中断标志位置位)判断发送完毕
	{
		stop();
		return ret;				//没发完,发的有问题
	}

	if(IICSTAT & 1)				//没有收到ack
	{
		stop();
		return ret;	
	}							//上面两个if的作用是条件不成立时退出

	IICDS = d_addr;
	clear();					//开始发送数据地址

	if(wait_pend() < 0)			//判断发送完毕
	{
		stop();
		return ret;
	}

	if(IICSTAT & 1)				//有没有收到ack
	{
		stop();
		return ret;	
	}							//上面两个if的作用是条件不成立时退出

	IICDS = data;
	clear();					//开始发送数据

	if(wait_pend() < 0)			//判断发送完毕
	{
		stop();
		return ret;
	}

	if(IICSTAT & 1)				//有没有收到ack
	{
		stop();
		return ret;	
	}							//上面两个if的作用是条件不成立时退出
	stop();
	ret = 0;
	return ret;
}


int iic_read(char s_addr, char d_addr, char *data)
{
	int ret = -1;

 	IICDS = s_addr<<1;			//写入从机地址和写标志(最后一位是写标志)
	IICSTAT = 0xf0;				//发送start信号

	if(wait_pend() < 0)			//判断发送完毕
	{
		stop();
		return ret;
	}

	if(IICSTAT & 1)				//没有收到ack
	{
		stop();
		return ret;	
	}							//上面两个if的作用是条件不成立时退出

	IICDS = d_addr;
	clear();					//开始发送数据地址

	if(wait_pend() < 0)			//判断发送完毕
	{
		stop();
		return ret;
	}

	if(IICSTAT & 1)				//没有收到ack
	{
		stop();
		return ret;	
	}
	stop();						//发送start信号的stop(一个start一个stop)

	IICDS = (s_addr<<1) | 1;	//写入从机地址和读标志(最后一位是写标志)
	IICSTAT = 0xb0;				//发送start信号

	if(wait_pend() < 0)			//判断发送完毕
	{
		stop();
		return ret;
	}

	if(IICSTAT & 1)				//没有收到ack
	{
		stop();
		return ret;	
	}

	IICCON &= ~(1<<7);			//禁止ack
	clear();					//清除标志位,也就是开始接收
	if(wait_pend() < 0)			//判断是否接收完毕
	{
		stop();
		return ret;
	}
	*data = IICDS;				 //一个字节收到

	stop();
	ret = 0;
	return ret;
}

测试代码:

void main(void)
{
	uart_init();
	iic_init();
	uprintf("ni hao pc!\r\n");
	
//	while(iic_write(0x50, 0x23, 0x45) < 0);		  //返回值为0跳出循环,写入成功
	
	while(iic_read(0x50, 0x23, &info) < 0);
	uprintf("info = %c\r\n", info);
	while(1)
	{
	
	}
}

总结

本期和大家分享的是IIC协议以及IIC编程,将数据写入板载的EEPROM中,再从EEPROM中读出来,实现一个IIC协议的demo,希望通过这个demo各位小伙伴们能够掌握IIC通信的全过程。个人观点:S3C2440中的IIC机制相对比较完善,如果想要更深一步学习IIC,大家可以使用IO口模拟IIC,以此提升自己对IIC协议的理解!最后,各位小伙伴们如果喜欢我的分享可以点赞收藏哦,你们的认可是我创作的动力,一起加油!

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

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

相关文章

【笔记】欧拉回路与欧拉路径

先放结论 对于一个无向连通图1&#xff1a; 存在欧拉路径的充分必要条件为&#xff1a;度数为奇数的点只有 0 0 0 或 2 2 2 个。存在欧拉回路的充分必要条件为&#xff1a;没有度数为奇数的点。 对于一个有向连通图&#xff1a; 存在欧拉路径的充分必要条件为&#xff1a; 所…

asm:常用语法

常用语法 1、循环1.1、使用条件跳转指令实现循环1.2、使用LOOP指令实现循环 2、字符串2.1、指定字符串的长度2.2、字符串指令2.3、重复前缀 3、数组4、递归5、宏6、文件操作7、内存管理 1、循环 1.1、使用条件跳转指令实现循环 汇编语言中实现循环通常需要使用跳转指令和条件…

k8s概念-DaemonSet

回到目录 参考链接https://v1-23.docs.kubernetes.io/zh/docs/concepts/workloads/controllers/daemonset/ DaemonSet 确保全部&#xff08;或者某些&#xff09;节点上运行一个 Pod 的副本 当节点加入到K8S集群中&#xff0c;pod会被&#xff08;DaemonSet&#xff09;调度到…

昆腾存储XSAN架构迁移误格式化系统的服务器数据恢复案例

服务器数据恢复环境&#xff1a; 昆腾存储&#xff0c; 操作系统&#xff1a;MAC OS&#xff0c; 存放的数据类型&#xff1a;MXF、MOV等格式视频文件。 存储中有9个数据卷&#xff0c;其中包括1个META信息卷&#xff0c;8个DATA信息卷。 服务器故障&#xff1a; 由于业务需求…

《入门级-Cocos2d 4.0塔防游戏开发》---实战

第一课&#xff1a;coco2dx4.0开发环境搭建 在uos专业版本搭建cocos2dx4.0开发环境 ---》 点击学习 第二课&#xff1a;游戏加载界面开发 介绍coco2dx4.0的场景添加. ---》 点击学习 第三课&#xff1a;欢迎界面开发&#xff08;一&#xff09; 开发欢迎界面的精灵添加和位…

git 生成change-id的解决方法

解决问题 1&#xff0c;在提交代码时的信息会要求添加change-id的要求&#xff0c;但对于默认的git来说&#xff0c;是不会自动生成change-id的 2&#xff0c;当git push的时候&#xff0c;报错 remote: ERROR: commit 7c30eda: missing Change-Id in message footer 解决办…

Boost开发指南-3.7intrusive_ptr

intrusive_ptr intrusive_ptr也是一种引用计数型智能指针&#xff0c;但与之前介绍的 scoped_ptr&#xff0c;shared_ptr 不同&#xff0c;需要额外增加一些的代码才能使用。它的名字可能会给人造成误解&#xff0c;实际上它并不一定要修改代理对象的内部数据。 如果现存代码…

一个月,英语能提高多少?附资料分享

学习语言是一个漫长的过程&#xff0c;但对于我这样一个英语小白&#xff0c;利用业余时间&#xff0c;一个月的学习&#xff0c;还是能看到不少的进步。除了听、说、读、写等能力方面有提升之外&#xff0c;最大的收获就是培养了英语学习和运用的兴趣。这样的结果对我来说&…

《Python深度学习-Keras》精华笔记1:深度学习数学基础及张量

公众号&#xff1a;尤而小屋作者&#xff1a;Peter编辑&#xff1a;Peter 持续更新《Python深度学习》一书的精华内容&#xff0c;仅作为学习笔记分享。 本文是第一篇&#xff1a;深度学习中的数学基础和张量操作 In [1]: import pandas as pd import numpy as npimport tens…

【linux--->传输层协议】

文章目录 [TOC](文章目录) 一、端口号1.端口号划分范围2.常用知名端口号 二、网络命令1.netstat 命令2.pidof 命令 三、UDP协议1.格式2.协议的分离和合并3.特点4.缓冲区 四、TCP协议1.格式2.4位的数据偏移3.确认应答机制4.序号与确认序号5.16位窗口6.标志位7.超时重传8.三次握手…

腾讯云TencentOS Server镜像系统常见问题解答

腾讯云TencentOS Server镜像是腾讯云推出的Linux操作系统&#xff0c;完全兼容CentOS生态和操作方式&#xff0c;TencentOS Server操作系统为云上运行的应用程序提供稳定、安全和高性能的执行环境&#xff0c;TencentOS可以运行在腾讯云CVM全规格实例上&#xff0c;包括黑石物理…

2023-07-31力扣每日一题

链接&#xff1a; 143. 重排链表 题意&#xff1a; 将链表L0 → L1 → … → Ln - 1 → Ln变成L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → … 解&#xff1a; 线性表法还是好写的 这边搞一下翻转法&#xff0c;快慢指针求翻转点&#xff08;翻转后面一半然后双指针合并…

【运维】linkis1.3.2版本保姆级安装

文章目录 一.建议配置1 软硬件环境建议配置1.1 Linux 操作系统版本要求1.2 服务器建议配置1.3 软件要求1.4 客户端 Web 浏览器要求2.3 LDAP设置&#xff08;暂时不需要&#xff09; 二. 下载三. 安装部署linkis server端1. 首次安装准备事项1.1 Linux服务器1.2 添加部署用户 2.…

《入门级-Cocos2dx4.0 塔防游戏开发》---第四课:欢迎界面开发(二)

目录 一、开发环境介绍 二、开发内容 2.1. logo变化动画 2.2. logo帧动画 2.3 start按钮移动动画 2.4 Credite移动动画 三、显示效果 四、知识总结 1. 移动动画 2. 变大变小动画 3. 延时效果 4. 动画组 一、开发环境介绍 操作系统&#xff1a;UOS1060专业版本。 c…

Java常用API:Math、Syetem、Runtime、BigDecimal

Math类 //目标:了解下Nath类提供的常见方法。 // 1、public static int abs(int a):取绝对值&#xff08;拿到的结果一定是正数&#xff09; //public static double abs(double a) system.out.println(Math.abs(-12)); // 12 system.out.println(Math.abs(123));// 123 system…

upload-labs靶场全通关

upload-labs靶场全通关 pass-1pass-2pass-3pass-4pass-5pass-6pass-7pass-8pass-9pass-10pass-11pass-12pass-13pass-14pass-15pass-16pass-17pass-18pass-19pass-20 pass-1 首先我们新建一个php的webshell文件 在这里我写了一个rabb1t.php的shell文件 内容为这个样子 然后我…

【LeetCode经典算法】链表反转

题目 题目&#xff1a;给定单链表头节点&#xff0c;将单链表的链接顺序反转过来 例&#xff1a; 输入&#xff1a;1->2->3->4->5 输出&#xff1a;5->4->3->2->1 要求&#xff1a;按照两种方式实现 解决办法 方式一&#xff1a; 思路 单链表的结…

DH算法、DHE算法、ECDHE算法演进

ECDHE 算法解决了 RSA 算法不具备前向安全的性质 和 DH 算法效率低下的问题。 ECDHE 算法具有前向安全。所以被广泛使用。 由什么演变而来 DH 算法 -- > DHE 算法 -- > ECDHE 算法 DH 算法是非对称加密算法&#xff0c;该算法的核心数学思想是离散对数。 核心数学思…

wms-3代货架标签(电池版本)接口文档

一、查询标签信息接口 接口类型&#xff1a;POST, 参数格式&#xff1a;json array 链接形式&#xff1a; http://localhost/wms/associate/getTagsMsg 代码形式&#xff1a; { url : http://localhost/wms/associate/getTagsMsg, requestMethed : GET, requestParamet…

亚马逊买家账号ip关联怎么处理

对于亚马逊买家账号&#xff0c;同样需要注意IP关联问题。在亚马逊的眼中&#xff0c;如果多个买家账号共享相同的IP地址&#xff0c;可能会被视为潜在的操纵、违规或滥用行为。这种情况可能导致账号受到限制或处罚。 处理亚马逊买家账号IP关联问题&#xff0c;建议采取以下步骤…