SCCB_SDA=0;
delay_us(50);
SCCB_SCL=0; //數據線恢復低電平,單操作函數必要
}
//SCCB停止信號
//當時鐘為高的時候,數據線的低到高,為SCCB停止信號
//空閑狀況下,SDA,SCL均為高電平
void SCCB_Stop(void)
{
SCCB_SDA=0;
delay_us(50);
SCCB_SCL=1;
delay_us(50);
SCCB_SDA=1;
delay_us(50);
}
//產生NA信號
void SCCB_No_Ack(void)
{
delay_us(50);
SCCB_SDA=1;
SCCB_SCL=1;
delay_us(50);
SCCB_SCL=0;
delay_us(50);
SCCB_SDA=0;
delay_us(50);
}
//SCCB,寫入一個字節
//返回值:0,成功;1,失敗.
u8 SCCB_WR_Byte(u8 dat)
{
u8 j,res;
for(j=0;j<8;j++) //循環8次發送數據
{
if(dat&0x80)SCCB_SDA=1;
else SCCB_SDA=0;
dat<<=1;
delay_us(50);
SCCB_SCL=1;
delay_us(50);
SCCB_SCL=0;
}
SCCB_SDA_IN(); //設置SDA為輸入
delay_us(50);
SCCB_SCL=1; //接收第九位,以判斷是否發送成功
delay_us(50);
if(SCCB_READ_SDA)res=1; //SDA=1發送失敗,返回1
else res=0; //SDA=0發送成功,返回0
SCCB_SCL=0;
SCCB_SDA_OUT(); //設置SDA為輸出
return res;
}
//SCCB 讀取一個字節
//在SCL的上升沿,數據鎖存
//返回值:讀到的數據
u8 SCCB_RD_Byte(void)
{
u8 temp=0,j;
SCCB_SDA_IN(); //設置SDA為輸入
for(j=8;j>0;j--) //循環8次接收數據
{
delay_us(50);
SCCB_SCL=1;
temp=temp<<1;
if(SCCB_READ_SDA)temp++;
delay_us(50);
SCCB_SCL=0;
}
SCCB_SDA_OUT(); //設置SDA為輸出
return temp;
}
//寫寄存器
//返回值:0,成功;1,失敗.
u8 SCCB_WR_Reg(u8 reg,u8 data)
{
u8 res=0;
SCCB_Start(); //啟動SCCB傳輸
if(SCCB_WR_Byte(SCCB_ID))res=1; //寫器件ID
delay_us(100);
if(SCCB_WR_Byte(reg))res=1; //寫寄存器地址
delay_us(100);
if(SCCB_WR_Byte(data))res=1; //寫數據
SCCB_Stop();
return res;
}
//讀寄存器
//返回值:讀到的寄存器值
u8 SCCB_RD_Reg(u8 reg)
{
u8 val=0;
SCCB_Start(); //啟動SCCB傳輸
SCCB_WR_Byte(SCCB_ID); //寫器件ID
delay_us(100);
SCCB_WR_Byte(reg); //寫寄存器地址
delay_us(100);
SCCB_Stop();
delay_us(100);
//設置寄存器地址后,才是讀
SCCB_Start();
SCCB_WR_Byte(SCCB_ID|0X01); //發送讀命令
delay_us(100);
val=SCCB_RD_Byte(); //讀取數據
SCCB_No_Ack();
SCCB_Stop();
return val;
}
|