📄 iic.c
字号:
#include "target.h"
#define I2C_DELAY_TIME 8
#define CHECK_I2C_ACK_TIME 200
#define iic_ClrSda() Clr_P1_5()
#define iic_SetSda() Set_P1_5()
#define iic_ClrScl() Clr_P1_4()
#define iic_SetScl() Set_P1_4()
#define iic_GetSda() Get_P1_5()
#include "iiccore.c"
/*******************************************************************
send bytes to I2c device
addr: Slave device address
subadr: Sub address
ptrdata: point a buffer which to been send
len:the length of data which to be send
*******************************************************************/
unsigned char iic_WriteBytes(unsigned char addr,unsigned char subadr,unsigned char *ptrdata,unsigned char len)
{
unsigned char ack;
unsigned char i;
ShowLcdHex(0x40,addr);
iic_StartCode();
iic_SendData(addr&0xfe);
ack = iic_CheckAck();
if( !ack )
{
return FALSE;
}
iic_SendData(subadr);
ack = iic_CheckAck();
if( !ack )
{
return FALSE;
}
ShowLcdHex(0x44,subadr);
for(i=0;i<len;i++){
iic_SendData(ptrdata[i]);
ack = iic_CheckAck();
if( !ack )
{
return FALSE;
}
ShowLcdHex(0x46+2*i,ptrdata[i]);
}
iic_StopCode();
return TRUE;
}
/*******************************************************************
send one byte to I2c device
addr: Slave device address
subadr: Sub address
ucdata: data to been send
*******************************************************************/
unsigned char iic_WriteByte(unsigned char addr,unsigned char subadr,unsigned char ucdata)
{
return iic_WriteBytes(addr,subadr,&ucdata,1);
}
/*******************************************************************
Read data from I2c Slave device
addr: Slave device address
subadr: Sub address
ptrdata: point a buffer that store one unsigned char data
len:the length of data which to be read
*******************************************************************/
#if 0
unsigned char iic_ReadBytes(unsigned char addr,unsigned char subadr,unsigned char* ptrdata,unsigned char len)
{
unsigned char i;
unsigned char ack;
iic_StartCode();
iic_SendData(addr & 0xfe); // write sub address
ack = iic_CheckAck();
if( !ack )
{
return FALSE;
}
iic_SendData(subadr);
ack = iic_CheckAck();
if( !ack )
{
return FALSE;
}
iic_StartCode(); // re-start
iic_SendData(addr | 0x01); // read data
ack = iic_CheckAck();
if( !ack )
{
return FALSE;
}
for(i=0;i<len;i++){
ptrdata[i] = iic_GetData();
if(i!=len-1)
iic_SendAck();
}
iic_SendUnack(); //last byte should send unack to stop the process
iic_StopCode();
return TRUE;
}
#endif
/*******************************************************************
Read data from I2c Slave device
addr:
subadr: Sub address
ptrdata: point a buffer that store one unsigned char data
*******************************************************************/
#if 0 //
unsigned char iic_ReadByte(unsigned char addr,unsigned char* ptrdata)
{
unsigned char ack;
iic_StartCode();
iic_SendData(addr | 0x01); // read data
ack = iic_CheckAck();
if( !ack )
{
return FALSE;
}
*ptrdata = iic_GetData();
iic_SendUnack(); //last byte should send unack to stop the process
iic_StopCode();
return TRUE;
}
#endif
/*
Following is for EEprom function
*/
unsigned char WriteEepromBytes(unsigned char subadr,unsigned char *ptrdata,unsigned char len)
{
unsigned char ack;
unsigned char i;
unsigned char code addr = 0xa0;
for(i = 0;i<10;i++){
iic_StartCode();
iic_SendData(addr&0xfe);
ack = iic_CheckAck();
if( ack )
break;
}
if(i>=10)
return FALSE;
iic_SendData(subadr);
ack = iic_CheckAck();
if( !ack )
{
return FALSE;
}
for(i=0;i<len;i++){
iic_SendData(ptrdata[i]);
ack = iic_CheckAck();
if( !ack )
{
return FALSE;
}
}
iic_StopCode();
return TRUE;
}
unsigned char ReadEepromBytes(unsigned char subadr,unsigned char* ptrdata,unsigned char len)
{
unsigned char i;
unsigned char ack;
unsigned char code addr = 0xa0;
for(i = 0;i<10;i++){
iic_StartCode();
iic_SendData(addr&0xfe);
ack = iic_CheckAck();
if( ack )
break;
}
if(i>=10)
return FALSE;
iic_SendData(subadr);
ack = iic_CheckAck();
if( !ack )
{
return FALSE;
}
iic_StartCode(); // re-start
iic_SendData(addr | 0x01); // read data
ack = iic_CheckAck();
if( !ack )
{
return FALSE;
}
for(i=0;i<len;i++){
ptrdata[i] = iic_GetData();
if(i!=len-1)
iic_SendAck();
}
iic_SendUnack(); //last byte should send unack to stop the process
iic_StopCode();
return TRUE;
}
#ifdef __AT24C02_TEST__
void Test24c02(unsigned int uikey)
{
static unsigned char addr = 0;
unsigned char uctemp;
unsigned char i;
switch(uikey){
case EJECT_KEY:
for(i=0;i<16;i++){
uctemp = addr+i;
WriteEepromBytes(addr+i,&uctemp,1);
}
break;
case UP_KEY:
addr += 16;
ShowLcdHex(0x24,addr);
break;
case DOWN_KEY:
addr -= 16;
ShowLcdHex(0x24,addr);
break;
case ENTER_KEY:
for(i=0;i<16;i++){
uctemp = 0xff;
ReadEepromBytes(addr+i,&uctemp,1);
ShowLcdHex(0x40+i*2,uctemp);
}
ShowLcdHex(0x24,addr);
break;
}
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -