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

📄 extemp1.c

📁 飞利浦高性能单片机IIC总线通用通信协议
💻 C
字号:
/***************************************************************
* 用LPC932模拟24WC02
* 用其硬件I2C从工作方式模拟,从地址为0A0H,存储器地址00H--2FH(48字节)
* 可字节写/连续字节写操作
***************************************************************/
#include <Reg51.h>
#include "Hi2cSla_C51.H"
#define uchar unsigned char

/* 定义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;

/* 定义LPC932的部分特殊寄存器 */
sfr		TRIM   = 0x96;
sfr		DIVM   = 0x95;	  		/* CPU分频设置寄存器 	*/
sfr		P1M1   = 0x91;
sfr		P1M2   = 0x92;
sfr		IEN1   = 0xE8;
sbit    EI2C   = IEN1^0;


#define CSI24WC02   0xA0 	    /* 定义器件从地址										  */

uchar  EEPROM[48];				/* 定义EEPROM存储空间,对应存储地址为00H-2FH  			  */
uchar  eeprom_adr;				/* EEPROM的操作地址指针									  */
sbit   LEDCON = P1^6;			/* 工作状态指示灯										  */


/**************************************************************** 
*            I2C 中断服务函数
* 功能:用于监控总线上的信号,并对主机作出响应。
* 注: 要打开中断允许,最好把I2C中断优先级设置高一点。
*      接收到对本器件操作的寻址信号时,进入中断      
*      I2C中断入口地址为0033H,即interrupt 6
****************************************************************/
void I2c_Int(void) interrupt 6
{ uchar indata;

  switch(I2STAT)
  { case RDSLA:				/* 主机读EEPROM操作							*/
         while(1)
		 { if( SendByte(EEPROM[eeprom_adr])==0 ) break;
		   eeprom_adr++;
		   if( eeprom_adr>0x2f ) eeprom_adr = 0;
		 }
		 break;			
	case WRSLA:				/* 主机写EEPROM操作							*/
	     if( RcvByte(&indata)==0 ) break;	/* 读取存储地址				*/
         eeprom_adr = indata;
		 if( eeprom_adr>0x2f ) eeprom_adr = 0;

		 while(1)
		 { if( RcvByte(&indata)==0 ) break;	/* 若接收到总线结束则退出	*/
		   EEPROM[eeprom_adr] = indata;
		   eeprom_adr++;
		   if( eeprom_adr>0x2f ) eeprom_adr = 0;
         }

         break;
	default:
         break;
  }
  I2CON = 0x44;				/* 开放总线									*/
}
      

/**************************************************************** 
*            			主函数
* 功能:设置总线及从机地址,并设置I2C中断。
* 注: 要进行I2C接口的IO设置。
****************************************************************/
void main(void)
{ uchar i;
  DIVM = 2;
  for(i=0; i<255; i++);

  /* 由于上电复位时所用IO口设置为高阻态,所以要进行IO设置					*/
  P1M1 = 0x2C;
  P1M2 = 0x0C;
  LEDCON = 0;           
  
  eeprom_adr = 0;				/* 存储器地址指针,初化为00H 				*/
  EI2C = 1;						/* 开I2C中断								*/
  EA = 1;
 
  SetBus(CSI24WC02); 			/* 初始化总线,设置器件从地址 				*/
  while(1);						/* 等待I2C中断 								*/
}

⌨️ 快捷键说明

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