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