|
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
}
|
-
-
archive.zip
2024-8-29 11:06 上傳
點擊文件名下載附件
58.16 KB, 下載次數: 0
-
-
PCF8591.zip
2024-8-29 11:10 上傳
點擊文件名下載附件
24.95 KB, 下載次數: 0
|