📄 i2c.c
字号:
/**********************************************************************
*File Name : eeprom.c
*Creat Time : 2002/02/11
*Program Author : mqli
*File Discreption :
*
************************************************************************/
#include "common.h"
#include "Var.h"
#include "main.h"
#include "i2c.h"
#include "lcd.h"
#define I2C_CLK_0 I2C_CLK=0
#define I2C_CLK_1 I2C_CLK=1
#define I2C_DATA_0 I2C_DATA=0
#define I2C_DATA_1 I2C_DATA=1
BOOL IICWriteWaitAcknowlodge(void);
unsigned char IICrxbyte(void);
void IICstart(void);
void IICstop(void);
void IICReadAcknowledge(void);
void IICtxbyte(U8 DateByte);
U8 Comfirm_Var_Validity(U8 *var_address,U8 Max_Value,U8 Min_Value, U8 Normal_Value);
void IICstart(void)
{
// I2C_CLK_0;
//Delay_xuS(1);
I2C_DATA_1;
Delay_xuS(1);
I2C_CLK_1;
Delay_xuS(1);
I2C_DATA_0;
Delay_xuS(1);
I2C_CLK_0;
Delay_xuS(1);
}
void IICstop(void)
{
Delay_xuS(1);
I2C_CLK_0;
Delay_xuS(1);
I2C_DATA_0;
Delay_xuS(1);
I2C_CLK_1;
Delay_xuS(1);
I2C_DATA_1;
Delay_xuS(1);
}
void IICReadAcknowledge(void)
{
I2C_CLK_0;
I2C_DATA_0;
Delay_xuS(1);
I2C_CLK_1;
Delay_xuS(1);
I2C_CLK_0;
I2C_DATA_1;
}
BOOL IICWriteWaitAcknowlodge(void)
{
BOOL WriteSuccessFlag=FALSE;
I2C_CLK_1;
WriteSuccessFlag=(I2C_DATA)?FALSE:TRUE;
I2C_CLK_0;
if ( WriteSuccessFlag==FALSE )
{
Delay_xuS(1);
}
return WriteSuccessFlag;
}
void IICtxbyte(U8 DataByte)
{
DE_DATA U8 BitMast;
for(BitMast=0x80;BitMast>0;BitMast>>=1)
{
if (DataByte&BitMast)
I2C_DATA_1;
else
I2C_DATA_0;
Delay_xuS(1);
Delay_xuS(1);
I2C_CLK_1;
Delay_xuS(1);
Delay_xuS(1);
I2C_CLK_0;
}
I2C_DATA_1;
}
unsigned char IICrxbyte(void)
{
DE_DATA U8 ReceiveByte=0,i;
I2C_DATA_1;
for(i=0;i<8;i++)
{
I2C_CLK_1;
ReceiveByte<<=1;
ReceiveByte|=I2C_DATA;
I2C_CLK_0;
Delay_xuS(1);
}
return ReceiveByte;
}
/* Read EEPROM content */
U8 I2C_Read_Bytes(U8 device_address,U8* register_adrress, U8 register_address_length,U8 * buffer_pointer, U8 bytes_counter)
{
DE_DATA unsigned char errcnt;
errcnt=0;
while(1)
{
IICstart();
IICtxbyte(device_address);
if (IICWriteWaitAcknowlodge()==TRUE) break;
errcnt++;
if (errcnt>5)
{
IICstop();
return I2C_WRITE_DEVICE_ADDRESS_NO_ACKNOLOGE;
}
}
do{
IICtxbyte(*register_adrress);
if(IICWriteWaitAcknowlodge()==FALSE)
return I2C_WRITE_REGISTER_ADDRESS_NO_ACKNOLOGE;
register_address_length--;
register_adrress++;
}while(register_address_length);
IICstart();
IICtxbyte(device_address|0x01);
if(IICWriteWaitAcknowlodge()==FALSE)
return I2C_WRITE_DEVICE_ADDRESS_NO_ACKNOLOGE;
while (1)
{
*buffer_pointer=0;
*buffer_pointer=IICrxbyte();
bytes_counter--;
if (bytes_counter==0) break;
IICReadAcknowledge();
buffer_pointer++;
}
Delay_xuS(1);
IICstop();
return I2C_COMMUNICATION_OK;
}
/*******************************************************
for fast write fuction
care that some chip limit the total bytes of one write cycle
1K,2K=8 4K,8K,16K=16
************************************************************/
U8 I2C_Write_Bytes(U8 device_address,U8* register_adrress, U8 register_address_length,U8 * buffer_pointer, U8 bytes_counter)
{
DE_DATA unsigned char errcnt,temp;
errcnt=0;
while(1)
{
IICstart(); // IIC start condition
IICtxbyte(device_address);
if (IICWriteWaitAcknowlodge()==TRUE) break;
errcnt++;
if (errcnt>5)
{
IICstop();
return I2C_WRITE_DEVICE_ADDRESS_NO_ACKNOLOGE;
}
}
do{
temp=*register_adrress;
IICtxbyte(temp);
//IICtxbyte(*register_adrress); //write the address onchip
if(IICWriteWaitAcknowlodge()==FALSE)
return I2C_WRITE_REGISTER_ADDRESS_NO_ACKNOLOGE;
register_address_length--;
register_adrress++;
}while(register_address_length);
while(bytes_counter)
{
temp=*buffer_pointer;
IICtxbyte(temp); // transmit EEPROM data
if(IICWriteWaitAcknowlodge()==FALSE)
return I2C_WRITE_REGISTER_DATA_NO_ACKNOLOGE;
buffer_pointer++;
bytes_counter--;
}
IICstop(); // IIC stop condition
return I2C_COMMUNICATION_OK;
}
/************************************************************
* The followed is the application for IIC bus
*
*****************************************************************/
#define EEPROM_I2C_DEVICE_ADDRESS 0xA0
/* Read EEPROM content */
U8 ReadXEEprom(U8 * buffer_pointer, U16 register_address, U8 bytes_counter)
{
DE_DATA U8 result,temp_register_address;
temp_register_address=(U8)(register_address);
result= I2C_Read_Bytes(EEPROM_I2C_DEVICE_ADDRESS+((U8)(register_address/128)&0x0e),
&temp_register_address, 1,buffer_pointer, bytes_counter);
Delay_xmS(10);
if(result!=I2C_COMMUNICATION_OK)
Scroll_Promote_Information("READ EEP ERR:",result);
return result;
}
/*******************************************************
for fast write fuction
care that some chip limit the total bytes of one write cycle
1K,2K=8 4K,8K,16K=16
************************************************************/
U8 WriteXEEprom(U8 * bufptr, U16 register_address, U8 bytes_counter)
{
DE_DATA U8 result,temp_register_address;
temp_register_address=(U8)(register_address);
result= I2C_Write_Bytes(EEPROM_I2C_DEVICE_ADDRESS+((U8)(register_address/128)&0x0e),
& temp_register_address,1,bufptr,bytes_counter);
if(result!=I2C_COMMUNICATION_OK)
Scroll_Promote_Information("WRITE I'C COMM ERR:", result);
Delay_xmS(10);
return result;
}
void Check_EEProm_Var_Validity(void)
{
//Comfirm_Var_Validity
}
U8 Comfirm_Var_Validity(U8 *var_address,U8 Max_Value,U8 Min_Value, U8 Normal_Value)
{
if( (*var_address>Max_Value)||(*var_address<Min_Value) )
{
*var_address=Normal_Value;
return 0;
}
else
{
return 1;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -