📄 i2c.c
字号:
/*****************************************************************************/
/*公司名称: 杭州五星电子 */
/*模块名: i2c通信 */
/*创建人: 赖智城 日期 2008-4-17 */
/*修改人: 日期 2008-5-13 */
/*功能描述:24cxx eerom 进行指定地址的n位读写 */
/*其他功能 */
/*版本号:33 34 00 */
/*****************************************************************************/
uchar F0;
//发送起始信号
void str_i2c(void)
{
P6DIR|=SDA+SCL;
_NOP();
SDA_1;
_NOP();
SCL_1;
_NOP();
_NOP();
_NOP();
_NOP();
_NOP(); //起始建立时间大于4.7us
SDA_0;
_NOP();
_NOP();
_NOP();
_NOP(); //大于4us
SCL_0;
}
//发送结束信号
void stop_i2c(void)
{
SDA_0;
//_NOP();
SCL_1;
_NOP();
_NOP();
_NOP();
_NOP();
SDA_1;
_NOP();
_NOP();
_NOP();
_NOP();
SCL_0;
}
//发送iic总线应答信号
void ack_i2c(uchar a)
{
if(!a) SDA_0;//ACK
else SDA_1; //NACK
//_NOP();
SCL_1;
_NOP();
_NOP();
_NOP();
_NOP();//delay1(1);
SCL_0;
if(a)SDA_0; else SDA_1;
}
//发送一个字节
wrbyte_i2c(uchar c)
{
uchar i;
for(i=8;i;i--)
{
if(c&0x80)SDA_1;
else SDA_0;
//_NOP();
SCL_1;
_NOP();
_NOP();
_NOP();
_NOP();//delay1(1);
SCL_0;
c=c<<1;
}
//_NOP();
DIR_IN;
//SDA_1;//=释放数据线,准备接收应答信号
//_NOP();
SCL_1;
_NOP();
_NOP();
_NOP();
_NOP();//delay1(1);//SDA=0 SCL=1
if(SDA_IN) {F0=1;P6DIR&=~(SDA+SCL);}//判断是否收到应答信号-------未收到ACK
else F0=0;// ------收到ACK
SCL_0;
DIR_OUT;
}
//读取一个字节
uchar rdbyte_i2c(void)
{
uchar i,r=0;
DIR_IN;
for(i=8;i;i--)
{
r=r<<1; //左移补0
//_NOP();
SCL_1; //使数据有效
_NOP();
_NOP();
_NOP();
_NOP();
if(SDA_IN) r++;
SCL_0;
}
DIR_OUT;
return r;
}
//发送N个字节
void WRNBYTE_I2C(uchar addrh,uchar addrl,uchar *s,uchar num)
{
unsigned char i;
str_i2c();
wrbyte_i2c(addrh); //发送从器件地址
if(F0) return;
wrbyte_i2c(addrl);
if(F0) return;
if(s==0)return;//s=0不发送数据
for(i=num;i;i--)
{
wrbyte_i2c(*s);
if(F0) return;
s++;
}
stop_i2c();
delay_ms(15);//ATML
//延时10~15ms来将数据写入EEPROM
P6DIR&=~(SDA+SCL);
}
//读取N个字节
void RDNBYTE_I2C(uchar addrh,uchar addrl,uchar *s,uchar num)
{
uchar i;
str_i2c();
wrbyte_i2c(addrh); //发送从器件地址
if(F0) return;
wrbyte_i2c(addrl); //发送指令
if(F0) return;
str_i2c();
addrh|=1;
wrbyte_i2c(addrh); //发送从器件地址
if(F0) return;
for(i=num-1;i;i--)
{
*s=rdbyte_i2c();
ack_i2c(0);//ack
s++;
}
*s=rdbyte_i2c();
ack_i2c(1);//nack
stop_i2c();
P6DIR&=~(SDA+SCL);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -