⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 irda.c

📁 msp430f14x系列单片机控制红外无线器件通讯
💻 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 + -