⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 24wcxx.c

📁 这是铁路各工区
💻 C
字号:
//器件:24WC32/64
//注1:上电后需1MS才能进行读写操作
//注2:时钟频率Fscl_max=100Hz(1.8v,2.5v)/400Hz(4.5v~5.5v)
//注3:32字节页写缓冲器,内部低5 位地址加1 高位地址保持不变
//注4:当WP=VCC时,写保护(只读),当WP=GND/悬空时,可读/写,
//     CAT24WC32/64 可以接收从器件地址和字节地址但是装置在
//     接收到第一个数据字节后不发送应答信号从而避免寄存器区域
//     被编程改写

#include "fun.h"
#include "var.h"
/**********************只在本文件使用*****************************/
/*功能:提供I2C总线工作时序中的起始位*/
void I_start(void){
 SCL=1;
 SCL=1;
 SDA=0;
 SDA=0;
 SCL=0;
 SCL=0;
}

/*功能:提供I2C总线工作时序中的停止位*/
void I_stop(void)
{SDA=0;
 SDA=0;
 SCL=1;
 SCL=1;
 SDA=1;
 SDA=1;
 SCL=0;
 SCL=0;
}

/*功能:I2C总线初始化。在MAIN()函数中应先调用本函数,然后再调用其他函数。*/
void I_init(void)
{SCL=0;
 I_stop();}

/*功能:提供I2C的时钟信号,并返回在时钟电平为高期间SDA信号线上状态。
 *本函数可用于数据接收。*/
bit I_clock(void)
{bit sample;
 SCL=1;
 delay(1);
 sample=SDA;
 SCL=0;
 delay(1);
 return(sample);}

/*功能:向I2C总线发送8位数据,并请求一个应答信号ACK。
 *如果收到ACK应答则返回1,否则返回0*/
bit I_send(uchar I_data)
{uchar i;
 /*发送8位数据*/
 for (i=0;i<8;i++)
 {SDA=(bit)(I_data&0x80);
  I_data=I_data<<1;
  I_clock();}
 /*请求应答信号ACK*/
 SDA=1;
 return(~I_clock());}

/*功能:从I2C总线上接收8位数据信号,并将接收到8位数据作为一个
 *字节返回,不回送应答信号ACK。主函数在调用本函数之前应保证SDA
 *信号线处于浮置状态,即SDA置1。*/
uchar I_receive(void)
{uchar I_data=0;
 uchar i;
 for(i=0;i<8;i++)
 {I_data<<=1;
  if(I_clock())I_data++;}
 return(I_data);
}

/*功能:向I2C总线发送一个应答信号ACK,一般用于连续数据读取时。*/
void I_Ack(void)
{SDA=0;
 I_clock();
 SDA=1;}

/*功能:向24WCXX写入器件地址和一个指定的字地址*/
bit E_address(uchar Address)
{I_start();
 if(I_send(I2C_24WCXX_WR))return(I_send(Address));
 else return(FALSE);
}
/*bit E_address(uint Address)
{uchar i;
 I_start();
 if(I_send(I2C_24WCXX_WR))
 {i=(uchar)Address>>8;
  if(!I_send(i))return(FALSE);
  i=(uchar)Address;
  return(I_send(i));
 }
 else return(FALSE);
} */
/*******************************************************/
//写24wcxx
bit wr_24wcxx(uchar address)     //
{uchar i=7;
 uchar *p;
 p=(uchar *)&binary_24wcxx;
 I_init();
 if(E_address(address))
 {while(i--)
  {if(!I_send(*p++))
   {I_stop();return(FALSE);}
  }
  I_stop();delay(600);return(TRUE);
 }
 else{I_stop();return(FALSE);}
}

//读24wcxx
bit rd_24wcxx(uchar address)     //
{uchar i=7;
 uchar *p;
 p=(uchar *)&binary_24wcxx;
 I_init();
 if(E_address(address))/*发送重复启动信号*/
 {I_start();
  if(I_send(I2C_24WCXX_RD))
  {while(i--)
   {*p++=I_receive();if(i)I_Ack();}
    I_stop();
    return(TRUE);
   }
  else{I_stop();return(FALSE);}
 }
 else {I_stop();return(FALSE);}
}
/********************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -