?? irda.c
字號:
#include "IrDA.h"
#define uchar unsigned char
void Delay(unsigned char t)
{
unsigned char i;
for(i=t;i>0;i--);
}
//--------------------------------------------------------------
//啟動總線函數:啟動I2C總線,即發送I2C起始條件
//--------------------------------------------------------------
void Start_I2c(void)
{
I2COut;SDA1;SCL1;Delay(2);SDA0;Delay(2);SCL0;Delay(2);
}
//---------------------------------------------------------------
//結束I2C總線,發送結束條件
//---------------------------------------------------------------
void Stop_I2c(void)
{
I2COut;SDA0;SCL1;Delay(2); SDA1;Delay(2);
}
//----------------------------------------------------------------
//應答函數:主控器進行應答信號,(可以是應答或非應答信號)
//----------------------------------------------------------------
void Ack_I2c(unsigned char a)
{
I2COut;//Delay(2); //SDA OUTPUT
if(a==0) /*在此發出應答信號*/
{SDA0;}
else /*在此發出非應答信號*/
{SDA1;}
Delay(2);SCL1;Delay(3);SCL0; /*時鐘低電平周期大于4us,清時鐘線,鉗住I2C總線以便繼續接收*/
SDA1;
}
//----------------------------------------------------------------
//字節數據傳送函數
//將數據C發送出去,可以時地址,也可以是數據,發完后等待應答,并對此狀態位
//進行操作(不應答或非應答都使ack=0假)。發送數據正常,ack=1;ack=0 表
//示被控器無應答或損壞。
//----------------------------------------------------------------
unsigned char SendByte(unsigned char c)
{
unsigned char BitCnt,ack=0;
SCL0;
I2COut;
for(BitCnt=0;BitCnt<8;BitCnt++)
{
if(c&0x80)
{SDA1;}
else
{SDA0;}
Delay(1);
SCL1;Delay(2);SCL0; /*sclk pulse*/
if(BitCnt==7)I2CIn;/*8位發送完后釋放數據線,準備接收應答位*/
c<<=1;
}
Delay(2);
SCL1;Delay(2);
//SDA1;Delay(2); /*8位發送完后釋放數據線,準備接收應答位*/
//SCL1;Delay(2);
//I2CIn;
if (SDAIN) ack=0;/*p52,NO ACK*/
else ack=1;
Delay(1);SCL0;
//I2COut; //direction=output
return(ack);
}
//----------------------------------------------------------------
//字節數據接收函數
//用來接收從器件傳來的數據,并判斷總線錯誤(不發應答信號),
//發完后請用應答函數
//----------------------------------------------------------------
unsigned char RcvByte(void)
{
unsigned char retc;
unsigned char BitCnt;
I2CIn;
retc=0;
for(BitCnt=0;BitCnt<8;BitCnt++)
{
SCL0;Delay(2); /*置時鐘線為低,準備接收數據位*/
SCL1;Delay(1); /*置時鐘線上為高使數據線上數據有效*/
retc <<=1;
if (SDAIN) retc=(retc|BIT0);
else retc=(retc&0xfe);
}
SCL0;//Delay(2);
return(retc);
}
//---------------------------------------------------------------
//向有子地址器件發送多字節數據函數
//從啟動總線到發送地址,子地址,數據,結束總線的全過程,從器件地址sla,
//子地址suba,發送內容是pdata指向的內容,發送num個字節。如果返回1表示操作
//成功,否則操作有誤。
//---------------------------------------------------------------
unsigned char ISendStr(unsigned char DeviceAddr,unsigned char WordAddr, unsigned char *pdata,unsigned char num)
{
unsigned char i,ack;
Start_I2c(); //啟動總線
ack=SendByte(DeviceAddr); //發送器件地址
if (ack==0) return(0);
ack=SendByte(WordAddr); //發送器件子地址
if (ack==0) return(0);
for(i=0;i<num;i++)
{
ack=SendByte(*pdata); //發送數據
if (ack==0) return(0);
pdata++;
}
Stop_I2c(); //結束總線
return(1);
}
//--------------------------------------------------------------
//向有子地址器件讀取多字節數據函數
//從啟動總線到發送地址,子地址,讀數據,結束總線的全過程,從器件地址sladdr,
//子地址suba,讀出的內容放入pdata指向的存儲區,讀num個字節。如果返回1 表示操作
//成功,否則操作有誤。
//---------------------------------------------------------------
unsigned char IRcvStr(unsigned char DeviceAddr,unsigned char WordAddr, unsigned char *pdata,unsigned char num)
{
unsigned char i,ack;
Start_I2c(); //啟動總線
ack=SendByte(DeviceAddr); //發送器件地址+write
if (ack==0) return(0);
ack=SendByte(WordAddr); //發送器件子地址
if (ack==0) return(0);
Start_I2c();
ack=SendByte(DeviceAddr+1); //發送器件地址+read
if (ack==0) return(0);
for(i=0;i<num-1;i++)
{
*pdata=RcvByte(); //接收數據
Ack_I2c(0); //發送就答位
pdata++;
}
*pdata=RcvByte();
Ack_I2c(1); //發送非應位
Stop_I2c(); //結束總線
return(1);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -