C51IO口模拟I2C总线驱动AT24C16 (I2C协议部分)
/*
名称:C51IO口模拟I2C总线驱动EEPROM(AT24C16)
说明:I2C总线是由Philips公司开发的一种简单、半双工同步串行总线。它只需要两根线(SCL、SDA)即可在连接于总线上的器件之间传送信息。其中SCL时钟总线用于同步数据,SDA数据总线用来发送数据(或地址)。
和SPI总线不同的是,I2C总线通过在SDL上发送存储器的地址用来选中总线上对应的设备。关于具体的通信协议这里就不说了,无非是通过IO口模拟产生所需信号
(如通信开始信号是SCL为高时,SDA产生一个下降沿信号。) 驱动程序中有 具体的说明。
*/
//定义I2C相关变量
sbit SCL=P2^1; //I2C 时钟
sbit SDA=P2^0; //I2C 数据 bit ack; /*应答标志位*/static void Delay_I2C() /*延时函数*/
{_Nop();_Nop();_Nop();_Nop();_Nop();
}//启动I2C总线,即发送I2C起始条件:SCL为高电平期间,SDA出现下降沿
void Start_I2C()
{SDA = 1;Delay_I2C(); //延时一段时间SCL = 1;Delay_I2C();SDA = 0;Delay_I2C();SCL = 0; //??? /*钳住I2C总线,准备发送或接收数据 */Delay_I2C(); }//停止I2C总线信号,即发送I2C停止条件:SCL为高电平期间,SDA出现上升沿
void Stop_I2C()
{SDA = 0;Delay_I2C(); //延时一段时间SCL = 1;Delay_I2C();SDA = 1;Delay_I2C();
}//检验应答信号
bit CheckAck(void)
{bit val;/*发送完一个字节后检验设备的应答信号*/SDA=1;SCL=1;Delay_I2C();val=SDA;Delay_I2C();SCL=0;Delay_I2C();return val;
}//通过I2C总线发送一个字节
bit SendByte_I2C(unsigned char c)
{unsigned char i = 0;SCL = 0; //??? /*钳住I2C总线,准备发送或接收数据 */Delay_I2C(); for(i = 0;i<8;++i){if(c<<i & 0x80)SDA = 1;elseSDA = 0;SCL = 1; /*置时钟线为高,通知被控器开始接收数据位*/Delay_I2C(); SCL = 0;Delay_I2C(); //???}return CheckAck(); //返回接收方的确认结果
}//从I2C总线中接收一个字节的数据
unsigned char RecByte_I2C()
{unsigned char retc;unsigned char BitCnt;retc=0; SDA=1; /*释放总线*/for(BitCnt=0;BitCnt<8;BitCnt++){SCL=0; /*置时钟线为低,准备接收数据位*/Delay_I2C();SCL=1; /*置时钟线为高使数据线上数据有效*/Delay_I2C();retc=retc<<1;if(SDA==1)retc=retc+1; /*读数据位,接收的数据位放入retc中 */Delay_I2C(); }SCL=0; Delay_I2C();return(retc);
}//发送应答信号
void Ack_I2C(bit ack)
{if(ack==0)SDA=0; /*在此发出应答或非应答信号 */elseSDA=1;Delay_I2C(); SCL=1;Delay_I2C();SCL=0; /*清时钟线,钳住I2C总线以便继续接收*/Delay_I2C();
}
C51IO口模拟I2C总线驱动AT24C16 (I2C协议部分)相关推荐
- SylixOS iMX6平台I2C总线驱动
原理概述 I2C总线驱动概述 I2C总线驱动是I2C适配器的软件实现,提供I2C适配器与从设备间完成数据通信的能力,比如起始,停止,应答信号和MasterXfer的实现函数.驱动程序包含初始化I2C总 ...
- i.MX6ULL终结者Linux I2C驱动实验IMX6ULL的I2C总线驱动分析
在上一节中我们了解了I2C框架分为I2C核心.I2C总线驱动和I2C设备驱动三部分.其中I2C总线驱动就是SOC的I2C控制器驱动,一般来说都是SOC厂家实现好的.而I2C设备驱动是用户根据自己不同的 ...
- Linux I2C子系统分析-I2C总线驱动
在drivers/i2c/busses下包含各种I2C总线驱动,如S3C2440的I2C总线驱动i2c-s3c2410.c,使用GPIO模拟I2C总线的驱动i2c-gpio.c,这里只分析i2c-gp ...
- arm linux i2c 总线驱动,ARM-Linux中I2C总线驱动开发
摘 要: 针对I2C总线的特点,Linux内核中定义了I2C驱动体系结构.在分析Linux的I2C总线驱动体系结构基础上,介绍了在S3C2410中设计I2C总线驱动的方法. 关键词: ARM-Lin ...
- linux I2C总线驱动框架
本文为转载,只为方便复习,如有侵权请联系我. 1.i2c子系统软件框架 应用------------------------------------------i2c driver:从设备驱动层需要和 ...
- Linux设备驱动---OMAP3630 Linux I2C总线驱动分析(2)
4 OMAP3630 I2C device驱动 在Linux内核中,I2C device驱动位于drivers/i2c/chips目录下,可以看到该目录下有很多相关的device驱动,这里以x ...
- OMAP3630 Linux I2C总线驱动分析(2)
4 OMAP3630 I2C device驱动 在Linux内核中,I2C device驱动位于drivers/i2c/chips目录下,可以看到该目录下有很多相关的device驱动,这里以x ...
- omap3630 linux i2c总线驱动分析,OMAP3630 Linux I2C总线驱动分析
4 OMAP3630 I2C device驱动在Linux内核中,I2C device驱动位于drivers/i2c/chips目录下,可以看到该目录下有很多相关的device驱动,这里以xxxx项目 ...
- linux i2c 总线驱动编写及分析笔记
1.写i2c控制器驱动即是写i2c_adapter或者i2c_bus驱动, 写这个驱动属于对i2c control的硬件操作驱动,必须要将芯片手册的关于i2c control的硬件启动流程仔细研读 ...
最新文章
- c盘怎么扩容_给电脑减压,C盘清理全攻略!
- 切换卡TabHost控件的使用
- 计算机缺乏内存将无法运行,电脑增加内存为什么无法启动
- ​多任务学习漫谈:行梯度之事
- 从需求到设计,嵌入式产品开发流程
- python flask框架是什么_Flask框架是什么?带你安装运行第一个Flask程序
- 扩展 CommandField 类别 - Header 加入新增钮
- Problem I: 函数---判断某年某月某日是这一年中的第几天
- 1024节日快乐~~~~
- html复选框全选按钮代码,全选复选框JavaScript编写小结(附代码)
- vector java 复制_面试官:关于Java性能优化,你有什么技巧
- Project 3 resources reassigned !!!
- .net core linux 串口,.Net Core 跨平台应用使用串口、串口通信 ,可能出现的问题、更简洁的实现方法...
- 数学建模算法与应用习题 1-4 解析 MATLAB 换一下思路做题
- 交换机/路由器实验:保姆级别的iperf安装和使用教程
- 2021深圳杯东三省建模
- python 红黑树_手把手教你43行代码写红黑树(包括删除操作)
- 小米手机TCP连接一些奇怪现象
- 华为eNSP--4多个路由器连接配置(静态路由)
- 氢原子光谱、类氢原子光谱和类氢离子光谱
热门文章
- 中专是不是学计算机就只要学理科,中专计算机是理科?
- 橡皮筋类CRectTracker
- 雷军和马化腾的战争?
- 人脸识别安全面临三重挑战
- 2022年全国最新消防设施操作员(中级消防设施操作员)题库及答案
- 论文摘要(一):Reinforcement Learning on Variable Impedance Controller for High-Precision Robotic Assembly
- 20140102-lua binder另一只轮子的雏形
- javaScript技巧集合
- 零基础程序员想要学好.Net,跟着这7个步骤学习就可以了
- sqlserver 获取汉字拼音首字母