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

📄 hi2csla_c51.c

📁 飞利浦高性能单片机IIC总线通用通信协议
💻 C
字号:
/***************************************************************** 
*		从方式的LPC932硬件I2C
* 1  使用I2C总线软件包时P1.2,P1.3切勿写为0,并要设置为开漏输出。
* 2  总线定义为P1.2=SCL,P1.3=SDA,需外接上拉电阻2-10k。
* 3  相应寄存器:
*    地址寄存器  I2ADR   用于存放自身从地址(从方式时才有用)
*    数据寄存器  I2DAT   接收/发送数据用
*    控制寄存器  I2CON   用于硬件I2C的设置、使能、启动、结束,
*                        应答控制,中断标志等。
*    状态寄存器  I2STAT  指示I2C总线的操作状态码,高5位有效,
*                        若I2C中断志置位,可查询此寄存器判断
*                        总线情况。
*    SCL占空比寄存器  I2SCLH、I2SCLL  设置SCL的频率发生。
*                     设置最好与主机的SCL频率基本一至。  
* 使用:使用前要先开中断:总中断EA和I2C中断允许EI2C,其中断入口地址为33H;
*       在中断里进行接收或发送数据操作,调用操作如下:
*       若是从接收,则循环调用RcvByte接收字节数据,直至总线结束/重启;
*       若是从发送,则循环调用SendByte发送数据,直至接收到非应答信号;
* 为了防止从器件因总线出错而死机,可用定时器实现超时处理。
*****************************************************************/

#define uchar 	unsigned char
#define GENERATE_STOP        0x54     /* 置位 STO, 复位 STA 、 SI          */
#define RELEASE_BUS_ACK      0x44     /* 复位 STO,STA,SI 并置位  AA (ack)  */
#define RELEASE_BUS_NOACK    0x40     /* 复位 STO,STA,SI 并置位 AA (noack) */
#define RELEASE_BUS_STA      0x64     /* 起动总线/重新起动总线, 置位 STA   */

/* 定义LPC932的I2C相关寄存器的定义 */
sfr		I2ADR  = 0xDB;
sfr  	I2DAT  = 0xDA;
sfr		I2CON  = 0xD8;
sfr		I2STAT = 0xD9;
sfr		I2SCLH = 0xDD;
sfr		I2SCLL = 0xDC;
sbit	STA	   = I2CON^5;
sbit	SI	   = I2CON^3;


/***************************************************************
*							接收字节函数
* 功能:读取总线传来的字节数据并发送应答位,正常接收返回1。
* 入口参数:c		此时读入的数据变量的地址
* 出口参数:接收到总线结束信号或重新启动总线信号时返回0
***************************************************************/
bit RcvByte(uchar *c)
{ I2CON = RELEASE_BUS_ACK;     		/* 清除标志位				*/
  while( SI==0 );   				/* 放开总线,等待接收		*/
  if( I2STAT==0xA0 )				/* 接收到停止位或重新启动位 */
  { I2CON = RELEASE_BUS_ACK;		/* 先放开总线,再返回0		*/
    return(0);
  }
  *c = I2DAT;       				/* 取数据					*/
  return(1);
}


/***************************************************************
*							发送数据
* 功能:向总线发送数据
* 入口参数:c		所要发送的数据
* 出口参数:当接收到非应答位时返回0,否则返回1
***************************************************************/
bit SendByte(uchar c)
{ if( I2STAT==0xC0 )                /* 上次发送数据后,接收到非应答位 */
  { I2CON = RELEASE_BUS_ACK;
    return(0);
  }
  I2DAT = c;       					/* 发送数据					*/
  I2CON = RELEASE_BUS_ACK;  		/* 释放总线					*/
  while( SI==0 ); 					/* 等待字节数据发送完成		*/
  return(1);
}



/****************************************************************
* 						设置总线函数(设置为从机)
* 功能:用于设置I2C控制寄存器,包括总线时钟选择及从地址.不接受广播地址。
* 入口参数:addr      从地址 
****************************************************************/
void SetBus(uchar addr)
{ I2ADR = addr&0xfe;    	/* 设置从地址不接收广播地址			*/
  I2CON =  RELEASE_BUS_ACK; /* 启动硬件I2C						*/
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -