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

📄 hal24c64.c

📁 威望公司MP3 + USB MCU 的参考软件
💻 C
字号:
/****************************************************************
*                      Viaon Technology (Suzhou) Co.,Ltd
*
*    Copyright 2007, Viaon Technology (Suzhou) Co.,Ltd,Suzhou,China
*                    All rights reserved.
*
*
* Filename:      	hal24c64.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_24C64)
/**********以下为读写24c64的函数**********/
#if 0
/*add SDA_OUTPUT() and SDA_INPUT()*/
void Write_One_Byte(WORD addr, BYTE thedata)
{
      bit acktemp=1;
      /*write a byte to mem*/
      SDA_OUTPUT();
      I2C_Start();     
      WriteI2CByte(DEVICE_WRITE);	//device address(7bit) + write(1bit)
      SDA_INPUT();
      acktemp=Check_Acknowledge();
      SDA_OUTPUT();	  
      WriteI2CByte((addr&0x1fff)>>8);/*first word address*/	
      SDA_INPUT();	  
      acktemp=Check_Acknowledge();
      SDA_OUTPUT();	  
      WriteI2CByte(addr&0xff);/*second word address*/
      SDA_INPUT();	  
      acktemp=Check_Acknowledge();
      SDA_OUTPUT();		  
      WriteI2CByte(thedata);/*thedata*/
      SDA_INPUT();		  
      acktemp=Check_Acknowledge();
      SDA_OUTPUT();		  
      I2C_Stop();

}
#endif
//Surely write/read from address 0 // len in page unit
void WriteE2PRom(BYTE *buf, WORD len, WORD addr) //addr is byte address
{
	//BYTE i, cnt, residue;
	//WORD addr = 0;
	BYTE  data i;
#if 0
	cnt = len>>E2PROM_PAGE_SIZEEXP;
	residue = len&((1<<E2PROM_PAGE_SIZEEXP)-1);

	if(residue != 0) 
		cnt ++;
#endif

	for(i=0; i<len; i++){
		Write_A_Page(buf, addr);
		buf += E2PROM_PAGE_SIZE;
		addr += E2PROM_PAGE_SIZE;	

		
		DelayMs(WRITE_DELAY_MS);
//		DelayMs(200);
//		DelayMs(200);
//		DelayMs(200);
	}

	return;
}

void ReadE2PRom(BYTE* buf, WORD len, WORD addr)//addr is byte address
{
	Read_N_Bytes(buf, len, addr);//Byte address?

	return;
}


//For E2PROM_24C64, 32-byte page write
//addr: data address should be aligned to 32byte
void Write_A_Page(BYTE *buffer,WORD addr)
{
      BYTE data i;
      /*write a page to at24c64*/
      // 1. Acknowledge Polling ?	  
      //SDA_OUTPUT();	  
      I2C_Start();	  
      WriteI2CByte(DEVICE_WRITE);
      //SDA_INPUT();		  
      Check_Acknowledge();
      //SDA_OUTPUT();		  
      WriteI2CByte(addr>>8);/*first word address*/	
      //SDA_INPUT();
      Check_Acknowledge();
      //SDA_OUTPUT();	
      WriteI2CByte(addr&0xff);/*second word address*/
      //SDA_INPUT();	  
      Check_Acknowledge();
		  
      for(i=0;i<E2PROM_PAGE_SIZE;i++){
        //SDA_OUTPUT();     
        WriteI2CByte(buffer[i]);
        //SDA_INPUT();			
        Check_Acknowledge();
       }
	  
      //SDA_OUTPUT();	  
      I2C_Stop();

#if 0
//Waiting the write operation done. Acknowledge Polling 
do{
      //SDA_OUTPUT();	  
      I2C_Start();	  
      WriteI2CByte(DEVICE_WRITE);
      //SDA_INPUT();		  
      acktemp=Check_Acknowledge();

	//SDA_OUTPUT();	
	I2C_Stop();	  
}while(acktemp == I2C_NAK);
#endif

      return;	   
}
#if 0
/*read one byte from addr*/
BYTE Read_One_Byte(WORD addr)
{     bit acktemp=1;
      BYTE mydata;

      //Dummy write: data address	  
      SDA_OUTPUT();	  	         
      I2C_Start();
      WriteI2CByte(DEVICE_WRITE);
      SDA_INPUT();		  
      acktemp=Check_Acknowledge();
      SDA_OUTPUT();	  	  
      WriteI2CByte((addr&0x1fff)>>8);/*first word address*/
      SDA_INPUT();	  
      acktemp=Check_Acknowledge();
      SDA_OUTPUT();	  
      WriteI2CByte(addr&0xff);/*second word address*/
      SDA_INPUT();	  
      acktemp=Check_Acknowledge();

      //read data	  
      SDA_OUTPUT();		  
      I2C_Start();  
      WriteI2CByte(DEVICE_READ);
      SDA_INPUT();	  
      acktemp=Check_Acknowledge();
      mydata=ReadI2CByte();
      SDA_OUTPUT();		  
      //acktemp=Check_No_Acknowledge();      
      SEND_1();//Send_NoAcknowledge();
      I2C_Stop();
	  
      return mydata;	
}
#endif
 /*read n bytes from addr,store to buffer[]*/
void Read_N_Bytes(BYTE *buffer,WORD n,WORD addr)
{
      //bit acktemp=1;
      WORD data i=0;

      //Dummy write: data address	  
      //SDA_OUTPUT();	      
      I2C_Start();
      WriteI2CByte(DEVICE_WRITE);
      //SDA_INPUT();	  
      Check_Acknowledge();
      //SDA_OUTPUT();	    	  
      WriteI2CByte(((BYTE *)&addr)[0]);/*first word address*/
      //SDA_INPUT();	  
      Check_Acknowledge();
      //SDA_OUTPUT();	  
      WriteI2CByte(((BYTE *)&addr)[1]);/*second word address*/
      //SDA_INPUT();	  
      Check_Acknowledge();

      //Read data from device, host should sent back ACK/NAK	  
      //SDA_OUTPUT();		  
      I2C_Start();
      WriteI2CByte(DEVICE_READ);
      //SDA_INPUT();		  
      Check_Acknowledge();

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

	     //DelayUs(100);		
      }

	  
      //SDA_OUTPUT();
      I2C_Stop();
}
  
#endif

⌨️ 快捷键说明

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