|
unsigned char PCF8591_Conv(unsigned char addr,unsigned char channel)
{
unsigned char ad_result=0;
I2CStart();
if(!I2CWriteByte(addr<<1)) //器件寻址 方向上是写 写命令 7位地址进行移位看最低位是0还是1决定是读还是写0是写操作
{
I2CStop();
return 0;
}
I2CWriteByte(channel); //写命令字节 选择哪个通道 是采用单端还是差分 是装换
I2CStart(); //重启总线
I2CWriteByte((addr<<1)|0x01); //最后一位是1 进行读操作
I2CReadByte(); //空读一次,这一次是上一次的转换结果
SendAck(0);
ad_result=I2CReadByte();
SendAck(1);
I2CStop();
return ad_result;
}
程序一直卡死在
if(!I2CWriteByte(addr<<1)) //器件寻址 方向上是写 写命令 7位地址进行移位看最低位是0还是1决定是读还是写0是写操作
{
I2CStop();
return 0;
}
这段为I2C的代码
#include "I2C.h"
//bit ack;
void I2CStart() //I2C起始信号函数
{
I2C_SCL=1; //总线空闲时 SCL SDA都为高电平
I2C_SDA=1;
I2CDelay(); // SCL保持4.7us之后,拉低SDA,产生起始信号
I2C_SDA=0; //SDA先拉低
I2CDelay();
I2C_SCL=0; //延时4.7us再拉低
}
bit I2CWriteByte(unsigned char dat) // I2C写一个字节(8个位)函数 一个字节8个bit
{
unsigned char temp;
bit ack;
for(temp=0x80;temp!=0;temp>>=1)
{
if((temp&dat)==0) //当前位为0总线写0,
I2C_SDA=0;
else //当前位为1写1
I2C_SDA=1;
I2CDelay(); //延时至少4us,SCL保持低
I2C_SCL=1;
I2CDelay(); //延时至少4us,SCL保持高
I2C_SCL=0; //SCL拉低
}
ack=I2CRecAck();
return (~ack);
}
bit I2CRecAck() //接受ACK函数
{
bit ack;
I2C_SDA=1; //主机再主动释放SDA,为ACK读取做准备
I2CDelay(); //SCL保持4.7us低电平
I2C_SCL=1; //拉高
ack=I2C_SDA; //读取SDA
I2CDelay(); //SCL保持4.7us高电平
I2C_SCL=0; //SCL拉低
return(ack);
}
unsigned char I2CReadByte()
{
unsigned char dat=0;
unsigned char temp;
I2C_SDA=1;
for(temp=0x80;temp!=0;temp>>1)
{
I2CDelay();
I2C_SCL=1;
if(I2C_SDA==1)
{
dat|=temp;
}
else
{
dat&=~temp;
}
I2CDelay();
I2C_SCL=0;
}
return dat;
}
void SendAck(bit ack)
{
I2C_SDA=ack;
I2CDelay();
I2C_SCL=1;
I2CDelay();
I2C_SCL=0;
}
void I2CStop() //I2C结束信号函数
{
I2C_SCL=0; // SCL SDA都为低电平
I2C_SDA=0;
I2CDelay(); //延时4.7us
I2C_SCL=1; //拉高
I2CDelay(); //SCL保持4.7us高电平
I2C_SDA=1; //SDA拉高。产生停止信号
I2CDelay(); // 维持延时4.7us
}
|
|