IIC时序操作24C02芯片
1.心血来潮看自己能不能参考时序图重新写一个IIC驱动,加强一下时序图的理解。记录下来,以后遇到此类的IIC时序的芯片可以直接操作。
先说说自己参照手册来写AT24c02的IIC低层驱动,从写完到最后调试成功所遇到的问题:
1.先确定SDA、SCL两根线的硬件连接。 (由于自己换了一套开发板,自己当时没有意识到,最后发现了)。
2.先调串口便于打印调试 (但是之前调试好的代码,竟然不能用)自己也是醉了。然后把总中断关掉,就莫名其妙的变好了。这个问题自己也没搞明白。
3.自己错在了起始信号那里,我把SCL拉高后,没有再拉低,就直接去写数据了。这肯定就悲剧了。。
4.还有不能很频繁不断擦除、写入。不然会出错。。。
自己的想法是 写入一个字节在读出用串口发出来。
2.模拟iic时序
2.1起始信号

先是 SDA和SCL都拉高 并延时(延时时间可以参考手册<读写周期那块>)
//总线初始化
void Iic_init()
{
SDA=1;
delay10us();
SCL=1;
delay10us();
}
//iic的开始信号(在时钟线SCL为高的时候数据线由高变低)
void start()
{
SDA=0;
delay10us();
SCL=0;
delay10us(); //之前是这里没有把时钟线拉低。才导致没有正确的起始信号。
}
2.2停止信号
//停止信号 (在时钟线SCL为高时数据线由低变高)
void stop()
{
SCL=1;
delay10us();
SDA=0;
delay10us();
SDA=1;
delay10us();
}
2.3 写一个字节带应答信号:

//写一个字节(带应答的) 返回值为1,成功写入并应答。否则反之。
unsigned char Iic_write(unsigned char date) //高位在前
{
unsigned char i,j=0; for(i=0;i<8;i++) // 比如: data: 10011001
{
SDA=date>>7; //第一次发送一个字节的最高位(bit7),第二次发送一个字节的bit6,
//先送给数据线,让他准备好
date=date<<1; // 为了方便读取下一位 // C语言的位操作自己要特别熟悉<C语言高级专题>
//delay10us();
SCL=1;
delay10us();
SCL=0;
delay10us(); //成功给SDA写入一位数据。
}
//此时在这里 SCL(时钟线) 已经为低了。
SDA=1; //应答信号 acknowledge 时序是先把 数据先拉高,第九个时钟周期,看SDA是否被拉低。
delay10us();
SCL=1;
delay10us();
while(SDA) //由时序图知 如果发送应答 SDA由高置低
{
j++; //如果不应答避免死循环
if(j>200)
{
SCL=0;
return 0; //SDA=1; SCL=0
} }
SCL=0;
delay10us();
return 1; //SDA=0; SCL=0
}
2.3 读一个字节的数据
//iic读一个字节
unsigned char Iic_read()
{
unsigned char dat=,i;
SDA=; //不知道为什么这里要把数据线拉高,我感觉高低都行吧!
delay10us();
for(i=;i<;i++)
{
SCL=; // 这个时候就要准备往SDA数据线里送数据了。
delay10us();
dat=dat<<;
dat=dat|SDA; // 这两句代码的顺序要注意,第八次的时候就直接把最低位的赋给dat了
SCL=;
delay10us();
}
return dat;
}
然后在写稍微高层(针对器件)的时序协议:
写、读一个字节的时序:

调用底层时序来完成就行了。
IIC时序操作24C02芯片的更多相关文章
- MSP430F149模拟IIC读写24C02程序
板子上设置了EEPROM存储器,型号为AT24C02.板子的硬件连接为:SCL--->P2.4,SDA--->P2.5.直接了当,贴上程序! ======================= ...
- 十天学会单片机Day5 IIC总线AT2402芯片(EEPROM)应用
1.采用串行总线技术可以使系统的硬件设计大大简化.系统的体积减小.可靠性提高.同时,系统的更改和扩充极为容易. 常用的串行扩展总线有: IIC (Inter IC BUS)总线.单总线(1-WIRE ...
- 十天学会单片机Day6 学会看数据手册 (IIC总线PCF859芯片( A/D D/A)应用)
1.实际电路 2.引脚图 3.地址 高四位为固定地址1001,A2A1A0可编程地址,通过观察实际电路,可知A2A1A0 为000.最低位为读写为,1为读,0为写. 4.控制字 控制寄存器的高半字节用 ...
- IIC接口下的24C02 驱动分析
本节来学习IIC接口下的24C02 驱动分析,本节学完后,再来学习Linux下如何使用IIC操作24C02 1.I2C通信介绍 它是由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据,是一个多 ...
- 【STM32】IIC的基本原理(实例:普通IO口模拟IIC时序读取24C02)(转载)
版权声明:本文为博主原创文章,允许转载,但希望标注转载来源. https://blog.csdn.net/qq_38410730/article/details/80312357 IIC的基本介绍 ...
- [51单片机] EEPROM 24c02 [I2C代码封装-保存实现流水灯]
这里把EEPROM 24c02封装起来,今后可以直接调用,其连线方式为:SDA-P2.1;SCL-P2.0;WP-VCC >_<:i2c.c /*--------------------- ...
- [51单片机] EEPROM 24c02 + 数码管 + 中断 [统计开机次数]
>_<:24c02的SCL连P2.0;SDA连P2.1;WP接GND;P0接8位数码管的8针;P2.2连段码;P2.3连位码; >_<:delay.c #include &qu ...
- 复习IIC协议---以AT24C02为例
1.总纲--复习IIC(inter integrated circuit)协议以及自己顺便读一下数据手册. /********************************************* ...
- 基于USB接口芯片CH372的人机接口设备设计与实现(转)
摘 要: 基于一种新型USB 总线接口芯片CH372,设计出一种人机接口设备-USB 鼠标.阐述了CH372 的工作原理和特点,给出了系统的硬件电路图:在软件设计中,分析了HID 类设备描述符枚举过程 ...
随机推荐
- Springboot 系列(八)动态Banner与图片转字符图案的手动实现
使用过 Springboot 的对上面这个图案肯定不会陌生,Springboot 启动的同时会打印上面的图案,并带有版本号.查看官方文档可以找到关于 banner 的描述 The banner tha ...
- C#实现.ini文件读写操作
1.ini文件是什么? 见百度百科:https://baike.baidu.com/item/ini%E6%96%87%E4%BB%B6/9718973?fr=aladdin 2.C#语 ...
- oracle学习笔记(一) oracle 体系结构简单介绍以及创建表空间和用户
体系结构 oracle数据服务器由oracle数据库和实例组成 实例由后台进程和内存结构组成 内存结构由共享池,数据缓冲区,日志缓存区 Oracle数据库是通过表空间来存储物理表的,一个数据库实例可以 ...
- 03 入门 - 安装MVC 5和创建应用程序
目录索引:<ASP.NET MVC 5 高级编程>学习笔记 本篇内容: 1. ASP.NET MVC 5的软件需求 2. 安装ASP.NET MVC 5 1)安装MVC 5开发组件 2)服 ...
- js中console使用2
接着上一篇js中console使用1,本片继续介绍js中console的用法 测试代码如下: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 ...
- Ext JS中的typeOf
Ext JS中的typeOf:以字符串格式,返回给定变量的类型 其中对字符串对象.元素节点.文本节点.空白文本节点判断并不准确 测试代码如下: <!DOCTYPE HTML PUBLIC &qu ...
- python xlrd 读取excel.md
文章链接:https://mp.weixin.qq.com/s/fojkVO-AB2cCu7FtDtPBjw 之前的文章介绍过关于写入excel表格的方法,近期自己在做一个网站,涉及到读取excel, ...
- ORACLE 查询某表中的某个字段的类型,是否为空,是否有默认值等
最近写的功能中有这样一个小功能,根据数据库查询此库中是否有某表,如果有,查询某表下面的某个字段的详细信息 其中一种是... select ATC.OWNER, atC.TABLE_NAME, ATC. ...
- C语言面试基础知识整理
一.预处理 1.什么是预编译?何时需要预编译? (1)预编译又称预处理,是做些代码文本的替换工作,即程序执行前的一些预处理工作.主要处理#开头的指令,如拷贝#include包含的文件代码.替换#def ...
- Linux学习历程——Centos 7 diff命令
一.命令介绍 diff命令用于比较文本差异. diff以逐行的方式,比较文本文件的异同处.如果指定要比较目录,则diff会比较目录中相同文件名的文件,但不会比较其中子目录. ------------- ...