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