📄 hal24c02.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 + -