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

📄 2402.c

📁 ad7705在打包机仪表中的应用
💻 C
字号:
/*========对2402的读写========*/
/*调用时需要参数DELY_TIME*/
#include <2402.h>
/*
函数:delayus(unsigned int t)
功能:毫秒级的时间延时函数
参数:t:延时的时间
*/

void delayus(unsigned int data t)
 {
  while(t!=0)
  t--;
 }

/*
函数:I2C_Start(void)
功能:启动I2C总线
参数:
说明:当SCL为高电平时使SDA产生一个负跳变
*/

void I2C_Start(void)
 {
  SDA=1;
  SCL=1;
  delayus(DELAY_TIME);
  SDA=0;
  delayus(DELAY_TIME);
  SCL=0;
  delayus(DELAY_TIME);
 }

/*
函数:I2C_Stop(void)
功能:终止I2C总线
参数:
说明:当SCL为高电平时使SDA产生一个正跳变
*/
 
void I2C_Stop(void)
 {
  SDA=0;
  SCL=1;
  delayus(DELAY_TIME);
  SDA=1;
  delayus(DELAY_TIME);
  SCL=0;
  delayus(DELAY_TIME);
 }

/*
函数:SEND_0(void)
功能:发送0
参数:
说明: 在SCL为高电平时使SDA信号为低
*/

void SEND_0(void)
 {
  SDA=0;
  SCL=1;
  delayus(DELAY_TIME);
  SCL=0;
  delayus(DELAY_TIME);
 }

/*
函数:SEND_1(void)
功能:发送1
参数:
说明:在SCL为高电平时使SDA信号为高
*/
 
void SEND_1(void)
 {
  SDA=1;
  SCL=1;
  delayus(DELAY_TIME);
  SCL=0;
  delayus(DELAY_TIME);
 }

/*
函数:Check_Acknowledge(void)
功能:发送完一个字节后检验设备的应答信号
参数:
说明: 
*/
  
bit Check_Acknowledge(void)
 {
  char data F0;
  SDA=1;
  SCL=1;
  delayus(DELAY_TIME/2);
    F0=SDA;
  delayus(DELAY_TIME/2);
    SCL=0;
  delayus(DELAY_TIME);
   if(F0==1)
  return FALSE;
  return TRUE;
 }

/*
函数:WriteI2CByte(char b)
功能:向I2C总线写一个字节
参数:b:写入的字节
说明: 
*/ 

void WriteI2CByte(char b)
 {
  char data i;
  for(i=0;i<8;i++)
  if((b<<i)&0x80)
     SEND_1();
  else
     SEND_0();
 }

/*
函数:ReadI2CByte(void)
功能:从I2C总线读一个字节
参数:
说明: 
*/ 
 
char ReadI2CByte(void)
 {
 char data  b=0,i,F0;
 for(i=0;i<8;i++)
  {
   SDA=1;          /*释放总线*/
   SCL=1;          /*接受数据*/
     delayus(10);
   F0=SDA;
     delayus(10);
   SCL=0;
    if(F0==1)
     {
      b=b<<1;
      b=b|0x01;
     }
    else
   b=b<<1;
  }
  return b;
 }

/*
函数:Write_One_Byte(char addr,char thedata)
功能:向2402写一个字节
参数:addr: 数据存储的地址
      thedata:所要存储的数据
说明: 
*/ 

void Write_One_Byte(char addr,char thedata)
 {
   bit acktemp=1;
   I2C_Start();                /*总线开始*/
   WriteI2CByte(0xa0);
   acktemp=Check_Acknowledge();/*发送完一个字节后检验设备的应答信号*/
   WriteI2CByte(addr);         /*向address首地址开始写数据*/
   acktemp=Check_Acknowledge();/*发送完一个字节后检验设备的应答信号*/
   WriteI2CByte(thedata);      /*把thedata写进去*/
   acktemp=Check_Acknowledge();/*发送完一个字节后检验设备的应答信号*/
   I2C_Stop();                 /*总线停止*/
 }

/*
函数:Write_A_Page(char *buffer,char m,char addr)
功能:向2402写一个数组
参数:*buffer:所要存储的数组
       m:存储的字节数
      addr: 数据存储的首地址
说明: 
*/  

void Write_A_Page(char *buffer,char m,char addr)
 {
   bit acktemp=1;
   int i;
   I2C_Start();
   WriteI2CByte(0xa0);
   acktemp=Check_Acknowledge();/*发送完一个字节后检验设备的应答信号*/
   WriteI2CByte(addr);         /*address*/
   acktemp=Check_Acknowledge();/*发送完一个字节后检验设备的应答信号*/
   for(i=0;i<m;i++)
   {
    WriteI2CByte(buffer[i]);
     if(!Check_Acknowledge())
      {
       I2C_Stop();
      }
   }
   I2C_Stop();
 }

/*
函数:Read_One_Byte(char addr)
功能:从2402读一个子节
参数:addr: 数据存储的地址
说明: 
*/  
 
char Read_One_Byte(char addr)
 {
   bit acktemp=1;
   char mydata;
   I2C_Start();           /*启动I2C总线*/
   WriteI2CByte(0xa0);    /*向I2C总线写一个字节*/
   acktemp=Check_Acknowledge();/*发送完一个字节后检验设备的应答信号*/
   WriteI2CByte(addr);         /*向I2C总线写一个字节,addr 是地址*/
   acktemp=Check_Acknowledge();/*发送完一个字节后检验设备的应答信号*/
   I2C_Start();
   WriteI2CByte(0xa1);
   acktemp=Check_Acknowledge();/*发送完一个字节后检验设备的应答信号*/
   mydata=ReadI2CByte();
   acktemp=Check_Acknowledge();/*发送完一个字节后检验设备的应答信号*/
   return mydata;
   I2C_Stop();            /*停止I2C总线*/
 }

/*
函数:Read_N_Bytes(char *buffer,char n,char addr)
功能:从2402顺序读n个字节到指定的数组
参数:*buffer:读取的字节数据所要存储的数组
       n:读取的字节数
      addr: 数据所存储的首地址
说明: 
*/  
 
void Read_N_Bytes(char *buffer,char n,char addr)
 {
   bit acktemp=1;
   int data i=0;
   I2C_Start();           /*启动I2C总线*/
   WriteI2CByte(0xa0);
   acktemp=Check_Acknowledge();/*发送完一个字节后检验设备的应答信号*/
   WriteI2CByte(addr);         /*address*/
   acktemp=Check_Acknowledge();/*发送完一个字节后检验设备的应答信号*/
   I2C_Start();
   WriteI2CByte(0xa1);
   acktemp=Check_Acknowledge();/*发送完一个字节后检验设备的应答信号*/
   for(i=0;i<n;i++)
   {
    buffer[i]=ReadI2CByte();
     if(i!=n-1)
      SEND_0();    /*发送应答*/
     else
      SEND_1();    /*发送非应答*/
   }
   I2C_Stop();     /*停止I2C总线*/
 }

⌨️ 快捷键说明

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