📄 i2c.c
字号:
//file:i2c.c
//description: i2c bus sub program
//author: yan ding bo
//version: ver1.0
//date: 2005-11-29
#include <ipHAL.h>
#define I2cSCL RD,0
#define I2cSDA RC,7
#define I2cRdOption 1
#define I2cWrOption 0
void I2cStart(void); //i2c开始条件函数声明//
void I2cStop(void); //i2c停止条件函数声明//
bool_t I2cRxdAck(void); //i2c接收应答函数声明(写操作)//
void I2cWrite8Bit(u8_t WrData); //从器件中写一个字节函数声明//
extern void Delay(u16_t temp);
void I2Cinit(void)
{
pin_dir_out(I2cSDA);
pin_dir_out(I2cSCL);
}
//从器件中写数据,chip_address为器件地址,reg_address为器件中寄存器地址,pcl_data为写地址的指针,data_num为向器件写数据的个数//
bool_t I2cWrite(u8_t ChipAddress,u8_t WRData)
{
bool_t DataNumSuccess; //成功标志//
DataNumSuccess=1;
I2cStart();
I2cWrite8Bit(ChipAddress|I2cWrOption); //写器件地址,写操作//
if(I2cRxdAck()==1) //返回低电平,表示写成功//
DataNumSuccess=0; //不成功//
I2cWrite8Bit(WRData); //写到器件的数据//
if(I2cRxdAck()==1) //返回低电平,表示写成功//
DataNumSuccess=0; //不成功//
I2cStop();
return DataNumSuccess;
}
//i2c总线开始//
void I2cStart(void)
{
pin_high(I2cSCL); //I2cScl先输出高,I2cSda再输出高,可以产生停止条件
pin_high(I2cSDA);
Delay(20);
pin_low(I2cSDA); //I2cSda先输出低(I2cScl为高的情况下)
Delay(20);
pin_low(I2cSCL); //I2cScl先输出低,产生开始条件(I2cScl为高的情况下)
Delay(20);
}
//i2c总线结束//
void I2cStop(void)
{
pin_low(I2cSCL); //I2cScl先输出低,I2cSda再输出低,无论什么情况都不会产生开始和停止条件
pin_low(I2cSDA);
Delay(20);
pin_high(I2cSCL); //I2cScl先输出高
Delay(20);
pin_high(I2cSDA); //I2cSda再输出高,产生停止条件(I2cScl为高的情况下)
Delay(20);
}
//接收应答位//
bool_t I2cRxdAck(void)
{
bool_t AckFlag;
pin_dir_in(I2cSDA); //I2cSda为输入
Delay(20);
pin_high(I2cSCL);
Delay(100);
AckFlag=read_pin(I2cSDA);
pin_low(I2cSCL);
Delay(20);
pin_dir_out(I2cSDA); //I2cSda为输出
return AckFlag;
}
//写一个字节//
void I2cWrite8Bit(u8_t WrData)
{
u8_t temp;
for(temp=0x80;temp;temp>>=1)
{
if(temp&WrData)
pin_high(I2cSDA);
else
pin_low(I2cSDA);
Delay(20);
pin_high(I2cSCL);
Delay(20);
pin_low(I2cSCL);
Delay(20);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -