首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

关于24C02与IIC

关于24C02与IIC

今天学习了用51单片机对24C02的操作。资料是在同学那里找的,有关于24C02的介绍,也有C代码。原理和介绍以前也看过。看时序图的时候始终觉得很麻烦,不知具体的代码该怎么写,可以看了别人写的代码又觉得这么简单就实现了想要的功能。可以还是对原理理解得不够深入,有些代码不太懂,但大概思路没问题。
      首先,24C02是IIC的方式进行通信的,所以先来看看IIC。IIC通信,涉及到的主要操作有:启动总线、停止总线、应答、非应答、写字节、读字节。下面是关于这些操作的代码.
#include
#include "intrins.h"
#include "iic.h"


void delay(void)
{
_nop_(); _nop_(); _nop_();
_nop_(); _nop_(); _nop_();
_nop_(); _nop_(); _nop_();
}

/**************************************
Function:   void iic_start(void)
Description: 启动iic总线
Calls:   无
Input:   无
Output;   无
Return:   无
Others:   涉及到总线地址 scl & sda
****************************************/
void iic_start(void) //iic总线启动
{
scl = 1;
delay();
sda = 1;
delay();
sda = 0;
delay();
}

/**************************************
Function:   void iic_stop(void)
Description: 停止iic总线
Calls:   无
Input:   无
Output;   无
Return:   无
Others:   涉及到总线地址 scl & sda
****************************************/
void iic_stop(void)  //iic总线停止
{
sda = 0;
delay();
scl = 1;
delay();
sda = 1;
delay();
}

/***************************************
Function:   void iic_ack(void)
Description: 应答信号
Calls:   无
Input:   无
Output;   无
Return:   无
Others:   
****************************************/
void iic_ack(void)  //iic总线应答
{
uint i;
scl = 1;
delay();
while((sda==1)&&(i<200))
{
  i++;
}
scl = 0;
delay();  
}
/**************************************
Function:   void iic_noack(void)
Description: 无应答信号
Calls:   无
Input:   无
Output;   无
Return:   无
Others:   
***************************************/
void iic_noack(void) //iic总线非应答
{
sda = 1;
delay();
scl = 1;
delay();
scl = 0;
delay();
}
/***************************************
Function:   void iicwr_byte(void)
Description: iic总线写一位(8bit)数据
Calls:   void delay(void)
Input:   dat
Output;   无
Return:   无
Others:   涉及到总线地址 scl & sda
*****************************************/
void iicwr_byte(uchar dat)
{       //iic总线写一位(8bit)数据
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();
}
/***************************************
Function:   void iicre_byte(void)
Description: iic总线写一位(8bit)数据
Calls:   void delay(void)
Input:   无
Output;   无
Return:   dat
Others:   涉及到总线地址 scl & sda
*****************************************/
uchar iicre_byte()  //iic总线读一位(8bit)数据   
{
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();
}
sda = 1;
return dat;   //数据返回
}

在读以上代码时,有这样一些问题:1、while((sda==1)&&(i<200))
{
  i++;
}这句不太懂。2、非应答信号有什么用?



然后是24C02操作的一些代码:
#include
#include "iic.h"
#include "24c02.h"


/**************************************
Function:   void write_byte(uchar add,uchar dat)
Description: 在24c02某一地址写一位数据
Calls:   iic_star(),iic_ack(),iicwr_byte(),iic_stop()
Input:   add,dat
Output;   无
Return:   无
Others:   
****************************************/
void write_byte(uchar add,uchar dat)
{
scl = 1;     //初始化iic总线
sda = 1;
iic_start();
iicwr_byte(0xa0);
iic_ack();
iicwr_byte(add);  //写地址上
iic_ack();
iicwr_byte(dat);  //要写的数据
iic_ack();
iic_stop();
}

/**************************************
Function:   write_page(uchar *buff,uchar n,uchar add)
Description: 在24c02某一地址开始,连续写一数组
Calls:   iic_star(),iic_ack(),iicwr_byte(),iic_stop()
Input:   *buff(数组名),n(要写数组的个数),add(开始写的地址)
Output;   无
Return:   无
Others:   采用指针进行数组的读操作
****************************************/
void write_page(uchar *buff,uchar n,uchar add)

{
uint i;   
iic_start();
iicwr_byte(0xa0);
iic_ack();
iicwr_byte(add);
iic_ack();
for(i=0;i<n;i++)
  {
  iicwr_byte(buff);  //要写的数据
  iic_ack();
}
    iic_stop();
}</n;i++)

/**************************************
Function:   uchar read_byte(uchar add)
Description: 从24c02中任一地址读取一位数据(随机读)
Calls:   iic_star(),iic_ack(),iicwr_byte(),iicre_byte(),iic_stop()
Input:   add(读数据的地址)
Output;   无
Return:   i
Others:   使用随机读的方式,可对芯片内任一地址直接读操作
****************************************/
uchar read_byte(uchar add)   //随机读
{
uchar i;
scl = 1;       //初始化iic总线
sda = 1;
iic_start();
iicwr_byte(0xa0);
iic_ack();
iicwr_byte(add);
iic_ack();
iic_start();
iicwr_byte(0xa1);
iic_ack();
i = iicre_byte();
iic_noack();
iic_stop();
return i;
}

/**************************************
Function:   uchar read_page(uchar *buff,uchar n,uchar add)
Description: 从24c02中任一地址开始连续读操作
Calls:   iic_star(),iic_ack(),iicwr_byte(),iicre_byte(),iic_stop()
Input:   *buff(数组名),n(要读数组的个数),add(开始读的地址)
Output;   buff
Return:   无
Others:   此函数之前需要定义一个合适大小的数组,调用本函数后,将24c02中数据读进数组中
****************************************/
void read_page(uchar *buff,uchar n,uchar add)
{
uint i;
iic_start();
iicwr_byte(0xa0);
iic_ack();
iicwr_byte(add);
iic_ack();
iic_start();
iicwr_byte(0xa1);
iic_ack();
for(i=0;i<n;i++)
  {
  buff = iicre_byte();
  if(i!=n-1)
  {
   iic_ack();   
  }
  else
  {
      iic_noack();
  }
}
iic_stop();
}</n;i++)

问题:iicwr_byte(0xa0);
             iicwr_byte(0xa1);这两句不太懂。

哎,写到这儿,突然感觉自己完全没懂。
返回列表