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

📄 hal24c02.c

📁 威望公司MP3 + USB MCU 的参考软件
💻 C
字号:
/****************************************************************
*                      Viaon Technology (Suzhou) Co.,Ltd
*
*    Copyright 2007, Viaon Technology (Suzhou) Co.,Ltd,Suzhou,China
*                    All rights reserved.
*
*
* Filename:      	hal24c02.c
*
* Programmer:    	Greg
*
* Created: 	 	1/2/2008
*
* Description: 		public functions 
*              
*        
* Change History (most recent first):	2008.1.2
****************************************************************/
#include "utiltypedef.h"
#include "va4010reg.h"
#include "common.h"

#include "hali2c.h"


#if ((E2PROM_TYPE == E2PROM_24C02))
/**********以下为读写24c02的函数**********/
/*not change SDA's out_put and in_put */
void Write_One_Byte(BYTE addr,BYTE thedata)
{
//      bit acktemp=1;
      /*write a byte to mem*/
      I2C_Start();
      WriteI2CByte(DEVICE_WRITE);
      Check_Acknowledge();
      WriteI2CByte(addr);/*address*/
      Check_Acknowledge();
      WriteI2CByte(thedata);/*thedata*/
      Check_Acknowledge();
      I2C_Stop();

}

// A page write for 24C02 will consume 10ms at most.
void Write_A_Page(BYTE *buffer,BYTE addr)
{
 //     bit acktemp;
      BYTE data i;

      I2C_Start();
      WriteI2CByte(DEVICE_WRITE);
      Check_Acknowledge();

      WriteI2CByte(addr);/*address*/
      Check_Acknowledge();
	  
      for(i=0;i<E2PROM_PAGE_SIZE;i++)
      {
        WriteI2CByte(buffer[i]);
        Check_Acknowledge();
      }

      I2C_Stop();
/*
//Write cycle polling using ACK
do{
      I2C_Start();	  
      WriteI2CByte(DEVICE_WRITE);
      acktemp=Check_Acknowledge();
}while(acktemp == I2C_NAK);	

      I2C_Start();	  
      I2C_Stop();	
*/
      return;	   
}

#if 0
void Write_2_Page(BYTE *buffer,BYTE addr)
{
      BYTE acktemp;
      BYTE i;

      I2C_Start();
      WriteI2CByte(DEVICE_WRITE);
      Check_Acknowledge();

      WriteI2CByte(addr);/*address*/
      Check_Acknowledge();
	  
      for(i=0;i<E2PROM_PAGE_SIZE;i++)
      {
        WriteI2CByte(buffer[i]);
        Check_Acknowledge();
      }

      I2C_Stop();

//Write cycle polling using ACK
do{
      I2C_Start();	  
      WriteI2CByte(DEVICE_WRITE);
      acktemp=Check_Acknowledge();
}while(acktemp == I2C_NAK);	

      //I2C_Start();	  
      //I2C_Stop();	
      WriteI2CByte(addr+E2PROM_PAGE_SIZE);/*address*/
      Check_Acknowledge();

      for(i=0;i<E2PROM_PAGE_SIZE;i++)
      {
        WriteI2CByte(buffer[i+E2PROM_PAGE_SIZE]);
        Check_Acknowledge();
      }

      I2C_Stop();	  

      return;	   
}

BYTE Read_One_Byte(BYTE addr)
{         
      bit acktemp=1;
      BYTE mydata;
       /*read a byte from mem*/
      I2C_Start();
      WriteI2CByte(DEVICE_READ);
      acktemp=Check_Acknowledge();
      WriteI2CByte(addr);/*address*/
      acktemp=Check_Acknowledge();
      I2C_Start();
      WriteI2CByte(0xa1);
      acktemp=Check_Acknowledge();
      mydata=ReadI2CByte();
      acktemp=Check_Acknowledge();
      I2C_Stop();
	  
      return mydata;
}

BYTE Read_random(BYTE addr){
        bit acktemp=1;
      char mydata;
       /*read a byte from mem*/
      I2C_Start();
      WriteI2CByte(DEVICE_READ);
      acktemp=Check_Acknowledge();
      WriteI2CByte(addr);/*address*/
      acktemp=Check_Acknowledge();
      I2C_Start();
      WriteI2CByte(0xa1);
      acktemp=Check_Acknowledge();
      mydata=ReadI2CByte();
      return mydata;
      I2C_Stop();
	}

#endif
void Read_N_Bytes(BYTE *buffer,BYTE n, BYTE addr)
{
      BYTE data i=0;
      //BYTE addr=0;	  
	  
      I2C_Start();
      WriteI2CByte(DEVICE_WRITE);
      Check_Acknowledge();
      WriteI2CByte(addr);/*address*/
      Check_Acknowledge();
	  
      I2C_Start();
      WriteI2CByte(DEVICE_READ);
      Check_Acknowledge();

      for(i=0;i<n;i++)
      {
            buffer[i]=ReadI2CByte();
            if(i!=n-1)
                SEND_0();    /*发送应答*/
            else
                SEND_1();    /*发送非应答*/
      }
      I2C_Stop();

      return;
}

#if 0
void WriteE2PRom(BYTE *buf, BYTE len)
{
	BYTE i, cnt, residue;
	WORD addr = 0;

	cnt = len>>E2PROM_PAGE_SIZEEXP;
	residue = len&((1<<E2PROM_PAGE_SIZEEXP)-1);

	if(residue != 0) 
		cnt ++;

	for(i=0; i<cnt; i++){
		Write_A_Page(buf, addr);
		buf += E2PROM_PAGE_SIZE;
		addr += E2PROM_PAGE_SIZE;	
		DelayMs(WRITE_DELAY_MS);
	}

	return;
}

void ReadE2PRom(BYTE* buf, BYTE len)
{
	Read_N_Bytes(buf, len);//,0);

	return;
}
#endif

#endif

⌨️ 快捷键说明

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