📄 i2c.c
字号:
//ChangShu Micro-Electronics Technologies Co., Ltd.(CSMET)
//I2C Communication Route
//Copyright 2004,Ver 1.0
//Last Update:2005-5-7
#include "chip.h"
#include "i2c.h"
#include "sport0.h"
unsigned char I2CINT;
void I2CDelay(unsigned char dly)
{
while(dly) { dly--;}
}
void StartSig(void) //I2C initiation signal
{
I2C_OUT; //SDA,SCK out direction
SDA_HIGH;
I2CDelay(I2CDLY);
SCK_HIGH;
I2CDelay(I2CDLY);
SDA_LOW;
I2CDelay(I2CDLY);
SCK_LOW;
I2CDelay(I2CDLY);
}
void StopSig(void) //I2C stop signal
{
I2C_OUT; //SDA,SCK out direction
SCK_LOW;
I2CDelay(I2CDLY);
SDA_LOW;
I2CDelay(I2CDLY);
SCK_HIGH;
I2CDelay(I2CDLY);
SDA_HIGH;
I2CDelay(I2CDLY);
}
unsigned char Slaver_AckSig(void) //I2C slave devie acknowledge
{
unsigned int timeout;
I2C_IN; //SDA input,SCK output
I2CDelay(I2CDLY);
SCK_HIGH;
I2CDelay(I2CDLY);
timeout=0xff;
while(timeout && CHK_SDA){timeout--;} //check SDA status and timeout mechanism initiation
if(timeout) {SCK_LOW;I2C_OUT;return SUCCESS;} //slave node responsive
else {StopSig();return FAILURE;} //slave node unresponsive
}
void Master_AckSig(void) //I2C master device acknowledge
{
SCK_LOW;
I2CDelay(I2CDLY);
SDA_LOW;
I2C_OUT;
I2CDelay(I2CDLY);
SCK_HIGH;
I2CDelay(I2CDLY);
SCK_LOW;
I2CDelay(I2CDLY);
}
void Master_NAckSig(void) //I2C master device non-acknowledge
{
SCK_LOW;
I2CDelay(I2CDLY);
SDA_HIGH;
I2C_OUT;
I2CDelay(I2CDLY);
SCK_HIGH;
I2CDelay(I2CDLY);
SCK_LOW;
I2CDelay(I2CDLY);
}
unsigned char WrI2C(unsigned char c) //wirte one byte to I2C slave device
{
unsigned char cnt,timeout;
for(cnt=0;cnt<8;cnt++) //sending 8-bit continuously, MSB first
{
if(c & 0x80) SDA_HIGH; //SDA='1'
else SDA_LOW; //SDA='0'
I2CDelay(I2CDLY>>1);
SCK_HIGH;
I2CDelay(I2CDLY);
c<<=1; //ready tx next bit
SCK_LOW;
I2CDelay(I2CDLY);
}
I2C_IN; //SDA input,SCK output
I2CDelay(I2CDLY);
SCK_HIGH;
timeout=0xff;
while(timeout && CHK_SDA){timeout--;}//check SDA status and timeout mechanism initiation
if(timeout) //salve acknowledge is response
{
SCK_LOW;
I2C_OUT;
return SUCCESS; //slave node response
}
else {StopSig();return FAILURE;} //slave node unresponsive
}
unsigned char RdI2C(void) //read one byte from I2C salve device
{
unsigned char cnt;
unsigned char temp;
I2C_IN; //SDA input,SCK output
SCK_LOW;
I2CDelay(I2CDLY);
for(cnt=0,temp=0;cnt<8;cnt++) //read 8-bit from slave,MSB first
{
SCK_HIGH;
I2CDelay(I2CDLY);
temp<<=1;
if(CHK_SDA) {temp|=0x01;} //SDA='1'
SCK_LOW;
I2CDelay(I2CDLY);
}
return temp;
}
unsigned I2CWrByte(unsigned char addr,unsigned char c) //I2C portocol writting
{
StartSig(); //sending I2C initiation signal
if(WrI2C(addr)) return FAILURE; //sending salve I2C device address
if(WrI2C(c)) return FAILURE; //sending data to salve device
StopSig(); //sending I2C stop signal
return SUCCESS;
}
unsigned I2CRdByte(unsigned char addr,unsigned char *p)
{
StartSig(); //sending I2C initiation signal
if(WrI2C(addr)) {return FAILURE;}; //sending salve I2C device address
*p=RdI2C(); //read one byte from salve node
Master_NAckSig(); //sending master non-acknowledge signal for stopping
StopSig(); //sending I2C stop signal
return SUCCESS;
}
//following routines used for I2C memory device
unsigned I2CRdMem(unsigned char addr,unsigned char total,unsigned char *p)
{
unsigned char cnt;
if(AddrSetting(addr & 0xFE,*p,*(p+1))) return FAILURE; //writting I2C device logice address
StartSig(); //starting signal
if(WrI2C(addr)) { return FAILURE;} //writting memory address
for(cnt=2;cnt<total+2;cnt++) //read n bytes to memory
{
*(p+cnt)=RdI2C(); //read one byte
if(cnt==total+1) Master_NAckSig(); //master NACK for stopping I2C transaction
else Master_AckSig(); //master ACK
}
StopSig(); //stop I2C
return SUCCESS;
}
unsigned char I2CWrMem(unsigned char addr,unsigned char total,unsigned char *p)
{
unsigned char cnt;
StartSig(); //starting signal
if(WrI2C(addr)) return FAILURE; //writting I2C device logic address
for(cnt=0;cnt<total+2;cnt++) WrI2C(*(p+cnt)); //writting two-byte for locating the beging address in memory
StopSig(); //stop I2C
return SUCCESS;
}
unsigned char AddrSetting(unsigned char I2CAddr,unsigned char memhi,unsigned char memlo)
{
StartSig(); //starting signal
if(WrI2C(I2CAddr)) return FAILURE; //writting I2C device logic address
if(WrI2C(memhi)) return FAILURE; //writting memory high address
if(WrI2C(memlo)) return FAILURE; //writting memory low address
return SUCCESS;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -