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

📄 hal24c08.c

📁 威望公司MP3 + USB MCU 的参考软件
💻 C
字号:
/****************************************************************
*                      Viaon Technology (Suzhou) Co.,Ltd
*
*    Copyright 2007, Viaon Technology (Suzhou) Co.,Ltd,Suzhou,China
*                    All rights reserved.
*
*
* Filename:      	hal24c08.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_24C08)
/**********以下为读写24c08的函数****------------------------------------------******/
#ifdef SDENUM_RETRY_ENABLE
/*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 |((addr>>7) & 0x06));	//device address(7bit) + write(1bit)
      //SDA_INPUT();
      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();	  
      Check_Acknowledge();
      //SDA_OUTPUT();		  
      WriteI2CByte(thedata);/*thedata*/
      //SDA_INPUT();		  
      Check_Acknowledge();
      //SDA_OUTPUT();		  
      I2C_Stop();

}
#endif

#ifdef DISP_WE2PROM_ENABLE
//Surely write/read from address 0 // len in page unit
void WriteE2PRom(BYTE *buf, WORD len, WORD addr) //addr is page start addr, len is page count
{
	//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);
	}

	return;
}



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

	return;
}
#endif

//For E2PROM_24C08, 16-byte page write
//addr: data address should be aligned to 16byte
void Write_A_Page(BYTE *buffer,WORD addr)
{

	BYTE data i;
	/*write a page to at24c08*/
	// 1. Acknowledge Polling ?	  
	
	I2C_Start();
	WriteI2CByte(DEVICE_WRITE |((addr>>7) & 0x06));//device address
	Check_Acknowledge();
	WriteI2CByte(addr&0xff);//word address
	Check_Acknowledge();

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

	I2C_Stop();

      return;	   
}
 /*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 |((addr>>7) & 0x06));
      WriteI2CByte(DEVICE_WRITE|((addr>>7) & 0x06)); 
	//SDA_INPUT();	  
      Check_Acknowledge();
      //SDA_OUTPUT();	    	  
 //     WriteI2CByte(((BYTE *)&addr)[0]);/*first word address*/
      //SDA_INPUT();	  
//      Check_Acknowledge();
      //SDA_OUTPUT();	  
      WriteI2CByte(addr&0xff);/*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 + -