27,373
社区成员
发帖
与我相关
我的任务
分享
void T_I2C_Start()//定义I2C起始条件产生
{
T_OUT_SDA;//设置SDA为输出口
T_S_SDA; //SDA管脚输出高电平
T_I2C_Delay(5);//延迟一点时间
T_S_SCL; //SCL管脚输出高电平
T_I2C_Delay(5);//延迟一点时间
T_C_SDA; //SDA管脚输出低电平
T_I2C_Delay(5);//延迟一点时间
T_C_SCL; //SCL管脚输出低电平
T_I2C_Delay(5);//延迟一点时间
}
void T_I2C_Stop() //定义I2C终止条件产生
{
T_OUT_SDA;//设置SDA为输出口
T_C_SDA; //SDA管脚输出低电平
T_I2C_Delay(5);//延迟一点时间
T_S_SCL; //SCL管脚输出高电平
T_I2C_Delay(5);//延迟一点时间
T_S_SDA; //SDA管脚输出高电平
T_I2C_Delay(5);//延迟一点时间
T_C_SCL; //SCL管脚输出低电平
}
void T_I2C_TxByte(char ch)//定义写字节函数
{//数据发送顺序是从高到低位发送的
int i;
T_OUT_SDA;//设置SDA为输出口
T_C_SCL;
T_I2C_Delay(1);////延迟一点时间
for(i=8; i>0; i--)
{
if((ch & 0x80) == 0x80)//依次取最高位,并输出到数据输出管脚
{
T_S_SDA; //SDA管脚输出高电平
}
else
{
T_C_SDA; //SDA管脚输出低电平
}
ch <<=1; //左移发送下一位
T_S_SCL; //置高电平,确认数据
T_I2C_Delay(5);//延迟一点时间
T_C_SCL;
T_I2C_Delay(5);
}
T_I2C_Delay(5);//延迟一点时间
T_I2C_GetACK();
}
char T_I2C_RxByte()//定义读字节函数
{//从低位到高位的顺序接收
char ch=0;
int i;
T_IN_SDA;//定义SDA为输入口
//T_I2C_Delay(5);//延迟一点时间
for(i=8; i>0; i--)
{
T_C_SCL;
T_I2C_Delay(5);//延迟一点时间
T_S_SCL;
T_I2C_Delay(5);//延迟一点时间
ch = ch<<1;
if(T_R_SDA)
{
ch++;
}
}
T_C_SCL;
T_I2C_Delay(5);//延迟一点时间
return(ch);
}
char T_I2C_GetACK() //定义确认函数
{
char ch;
//T_OUT_SDA;//设置SDA为输出口
//T_I2C_Delay(8);//延迟一点时间
T_C_SCL; //SCL管脚输出低电平
T_S_SDA; //SDA管脚输出高电平
T_I2C_Delay(5);//延迟一点时间
T_S_SCL; //SCL管脚输出高电平
T_IN_SDA;//定义SDA为输入口
T_I2C_Delay(5);//延迟一点时间
ch = (T_R_SDA);//读SDA
int i=0;
while(ch!=0)
{
ch = (T_R_SDA);
if((i++) > 250) break;
}
T_C_SCL; //SCL管脚输出低电平
T_I2C_Delay(5);//延迟一点时间
return(ch);
}
void T_I2C_Write(char nAddr,char ch)//定义写字节操作
{
T_I2C_Start();
T_I2C_TxByte(0x0A2);//发写命令
T_I2C_TxByte(nAddr);// 发送地址
T_I2C_TxByte(ch);// 发送字节
T_I2C_Stop();
}
char T_I2C_Read(char nAddr)//定义读字节操作
{
char ch;
T_I2C_Start();
T_I2C_TxByte(0x0A2);//发写命令
T_I2C_TxByte(nAddr);// 发送地址
T_I2C_Start();
T_I2C_TxByte(0x0A3);//发读命令
ch = T_I2C_RxByte();
T_I2C_Stop();
return(ch);
}