历史上的今天
今天是:2025年08月12日(星期二)
2018年08月12日 | 单片机模拟IIC时序读写24C02
2018-08-12 来源:eefocus
一、什么是IIC总线
IIC即集成电路总线,也是一种非常常用的总线是由飞利浦半导体公司在八十年代初设计出来的,主要是用来连接整体电路(ICS) ,IIC是一种多向控制总线,也就是说多个芯片可以连接到同一总线结构下,同时每个芯片都可以作为实时数据传输的控制源。
注意:IIC芯片在工业上的应用也是非常重要的,与串口、SPI、CAN等总线齐名。
二、IIC总线协议简介
IIC串行总线一般有两根信号线,一根是双向的数据线SDA,另一根是时钟线SCL。所有接到IIC总线设备上的串行数据SDA都接到总线的SDA上,各设备的时钟线SCL接到总线的SCL上。同时为了保证数据可靠地传送,任一时刻总线只能由某一台主机控制。
在I2C总线传输过程中,将两种特定的情况定义为开始和停止条件:当SCL保持"高"时,SDA由"高"变为"低"为开始条件;当SCL保持"高"且SDA由"低"变为"高"时为停止条件。开始和停止条件均由主控制器产生。使用硬件接口可以很容易地检测到开始和停止条件,没有这种接口的微机必须以每时钟周期至少两次对SDA取样,以检测这种变化。且SDA线上的数据在时钟"高"期间必须是稳定的,只有当SCL线上的时钟信号为低时,数据线上的"高"或"低"状态才可以改变。输出到SDA线上的每个字节必须是8位,每次传输的字节不受限制,但每个字节必须要有一个应答ACK。如果一接收器件在完成其他功能(如一内部中断)前不能接收另一数据的完整字节时,它可以保持时钟线SCL为低,以促使发送器进入等待状态;当接收器准备好接受数据的其它字节并释放时钟SCL后,数据传输继续进行。
IIC数据传输格式如下:
三、24C02芯片介绍
24C02串行E2PROM是基于IIC总线的存储器件,遵循二线制协议,由于其具有接口方便,体积小,数据掉电不丢失等特点,在仪器仪表及工业自动化控制中得到大量的应用。24C02在电路的作用主要是在掉电的情况下保存数据,具体参数不进行详细论述。详细资料请参考24C02的datasheet。
相关控制需要的时序参数如下:
四、协议时序详解
void start(void)
{
sda=1;
delay();
scl=1;
delay();
sda=0;
delay();
}
void stop(void)
{
sda=0;
delay();
scl=1;
delay();
sda=1;
delay();
}
void ack(void)
{
uchar i;
scl=1;
delay();
while((sda==1)&&(i<200))i++;
scl=0;
delay();
}
void noack(void)
{
sda=1;
delay();
scl=1;
delay();
scl=0;
delay();
}
void write_byte(uchar add,uchar dat)
{
init();
start();
iicwr_byte(0xa0);
ack();
iicwr_byte(add);
ack();
iicwr_byte(dat);
ack();
stop();
}
uchar read_byte(uchar add)
{
uchar a;
init();
start();
iicwr_byte(0xa0);
ack();
iicwr_byte(add);
ack();
start();
iicwr_byte(0xa1);
ack();
a=iicre_byte();
noack();
stop();
return a;
}
五、硬件电路设计
六、软件程序设计
设计程序,系统每开关机一次,记录一次并用数码管显示
#include
#include
#define uchar unsigned char
#define uint unsigned int
sbit sda=P1^1;
sbit scl=P1^0;
unsigned char code smg_du[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
void iic_init(void);
void start(void);
void stop(void);
void ack(void);
void noack(void);
void iicwr_byte(uchar dat);
uchar iicre_byte(void);
void delay (void);
void init(void);
void delay1(void);
void write_byte(uchar add,uchar dat);
uchar read_byte(uchar add);
///////////////////////////////////
void delay1(void)
{
uint a=30000;
while(a--);
}
void delay (void)
{
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
}
void start(void)
{
sda=1;
delay();
scl=1;
delay();
sda=0;
delay();
}
void stop(void)
{
sda=0;
delay();
scl=1;
delay();
sda=1;
delay();
}
void ack(void)
{
uchar i;
scl=1;
delay();
while((sda==1)&&(i<200))i++;
scl=0;
delay();
}
void noack(void)
{
sda=1;
delay();
scl=1;
delay();
scl=0;
delay();
}
void iic_init(void)
{
sda=1;
scl=1;
}
void iicwr_byte(uchar dat)
{
uchar i;
scl=0;
for(i=0;i<8;i++)
{
if(dat&0x80)
{
sda=1;
}
else
{
sda=0;
}
dat=dat<<1;
delay();
scl=1;
delay();
scl=0;
delay();
}
sda=1;
delay();
}
uchar iicre_byte(void)
{
uchar i;
uchar dat;
scl=0;
delay();
sda=1;
delay();
for(i=0;i<8;i++)
{
scl=1;
delay();
dat=dat<<1;
if(sda)
{
dat++;//
}
scl=0;
delay();
}
return dat;
}
void main()
{
uchar k;
iic_init();
k=read_byte(0x11);
k=k%10;
P1=smg_du[k]; //测试用,静态显示几个算啦
k++;
write_byte(0x11,k);
while(1);
}
void write_byte(uchar add,uchar dat)
{
iic_init();
start();
iicwr_byte(0xa0);
ack();
iicwr_byte(add);
ack();
iicwr_byte(dat);
ack();
stop();
}
uchar read_byte(uchar add)
{
uchar a;
iic_init();
start();
iicwr_byte(0xa0);
ack();
iicwr_byte(add);
ack();
start();
iicwr_byte(0xa1);
ack();
a=iicre_byte();
noack();
stop();
return a;
}
注意:并不是所有的24系列的存储芯片都适用本程序的读写流程,有些芯片有部分不同,如24C64就分高低地址,要根据实际应用的芯片参考相关的芯片数据手册,查看访问流程。
下一篇:单片机控制串口通信
史海拾趣
|
介绍了3DES加密算法的原理并详尽描述了该算法的FPGA设计实现。采用了状态机和流水线技术,使得在面积和速度上达到最佳优化;添加了输入和输出接口的设计以增强该算法应用的灵活性。各模块均用硬件描述语言实现,最终下载到FPGA芯片Stratix EP1S25F7 ...… 查看全部问答> |
|
刚学visual studio 2005 下VC++编串口通信老是弄不通 private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { if(COM1->Checked == true) &nbs ...… 查看全部问答> |
|
想要使DHCP Server输出调试信息需要定义DHCPS_DEBUG,但是在dhcp.h、dhcps.h、dhcpsLib.h、ioLib.h中\"#define DHCPS_DEBUG\"后重新编译镜像,系统启动后仍无调试信息输出,DHCP Server已经在运行。 另外Server对Client发出的DHCP DISCOVER请求也 ...… 查看全部问答> |
|
我使用一p-channel mosfet(最大电流16A). Vs=Vcc, d极经负载10欧姆到地,无其他元件。Vg 从Vcc 到0变化,整个过程中,mosfet似乎只有off(0v),on(Vcc) 两种状态,没有看到有线性放大区。 请问,是不是我的电路本身设计有问题,或是参数不对。 ...… 查看全部问答> |
|
网络断开重连-------线程 网络断开后重连的问题,可以使用线程去重连,即创建一个线程专门负责去建立连接,如果连接断开,则由这个线程去重新连接,连接完成后,这个线程则会阻塞(休眠)。 ...… 查看全部问答> |
|
误区:在C语言的教学中,发现很多学员老出现这个问题,在定义字符二维数组上,这样定义char buf[][50]={0};后面使用buf[0],buf[1]....总觉得有无穷无尽可以使用。 调试无果:一开始,学员用的没有问题,等项目代码多了,系统变大了,就出现些莫名 ...… 查看全部问答> |
|
还是我 强大阵容请看下表: 1.STM32F429探索套件。 2.志峰STM32F107。 3.新塘NUC472。 4.NUC240带can总线的板子。 5.瑞萨R7F080C212套件。 6.ZN_X STM32F103板子。 7.安富莱STM32 V2版。8.AMS NFC套件。 9.友善之臂Tiny2451 10.PPTv盒子 ...… 查看全部问答> |




