📄 i2c.c
字号:
/******************************************************************************************
I2C程序包
作者:Lianyitian
公司:XMMALATA
日期:2004-3-19 14:05
*******************************************************************************************/
#include <i2c.h>
#include <intrins.h>
void i2c_start(void)
{
SDA = 1;
_nop_();_nop_();
SCL = 1;
_nop_();_nop_();
SDA = 0;
_nop_();_nop_();
SCL = 0;
_nop_();_nop_();
}
void i2c_stop (void);
void i2c_stop (void)
{
SCL = 0;
_nop_();_nop_();
SDA = 0;
_nop_();_nop_();
SCL = 1;
_nop_();_nop_();
SDA = 1;
_nop_();_nop_();
}
void i2c_ack(void);
void i2c_ack(void)
{
SCL = 0;
_nop_();_nop_();
SCL = 1;
_nop_();_nop_();
if(SDA==1)//no ack fail to write
IIC_ERROR=1;
else
IIC_ERROR=0;
SCL = 0;
_nop_();_nop_();
}
void i2c_write (unsigned char i2c_data);
void i2c_write (unsigned char i2c_data)
{
unsigned char index;
for(index = 0; index < 8; index++)
{
SCL = 0;
_nop_();_nop_();
SDA = ((i2c_data & 0x80) ? 1 : 0);
i2c_data <<= 1;
_nop_();_nop_();
SCL = 1;
_nop_();_nop_();
}
SCL = 0;
_nop_();_nop_();
}
unsigned char i2c_read(void);
unsigned char i2c_read(void)
{
unsigned char index;
for(index = 0; index < 8; index++)
{
SCL =0;
delay_ms(1);
SCL=1;
delay_ms(1);
i2c_data <<= 1;i2c_data |= SDA;
}
SCL=0;
delay_ms(1);
return i2c_data;
}
void i2c_device_sub_data(unsigned char i2c_device_address,i2c_sub_address,i2c_data_shift);
void i2c_device_sub_data(unsigned char i2c_device_address,i2c_sub_address,i2c_data_shift)
{
unsigned char temp=2,temp1=0;
for(;temp!=0;temp--)
{
i2c_start();
_nop_();
i2c_write(i2c_device_address);
_nop_();_nop_();_nop_();
i2c_ack();
if(IIC_ERROR)
temp1=1;
_nop_();_nop_();_nop_();
i2c_write(i2c_sub_address);
_nop_();_nop_();_nop_();
i2c_ack();_nop_();_nop_();
if(IIC_ERROR)
temp1=1;
i2c_write(i2c_data_shift);
i2c_ack();
if(IIC_ERROR)
temp1=1;
i2c_stop();
delay_ms(250);
_nop_();
if(temp1==1)
{temp1=0;IIC_ERROR=1;}//fail
else
temp=0x01;//success
}
}
unsigned char i2c_device_sub_data_r(unsigned char i2c_device_address,i2c_sub_address);
unsigned char i2c_device_sub_data_r(unsigned char i2c_device_address,i2c_sub_address)
{
_nop_();
_nop_();
_nop_();
_nop_();
delay_ms(250);
i2c_start();
_nop_();
_nop_();
i2c_write(i2c_device_address-1);
_nop_();
i2c_ack();
i2c_write(i2c_sub_address);
_nop_();
i2c_ack();
i2c_start();
i2c_write(i2c_device_address);
i2c_ack();
delay_ms(50);
i2c_read();
i2c_ack();
i2c_stop();
delay_ms(250);
return i2c_data;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -