📄 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 + -