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

📄 main.c

📁 菲利普公司生产的ARM芯片LPC213X系列的所有驱动程序
💻 C
字号:
/****************************************Copyright (c)**************************************************
**                               Guangzou ZLG-MCU Development Co.,LTD.
**                                      graduate school
**                                 http://www.zlgmcu.com
**
**--------------File Info-------------------------------------------------------------------------------
** File name:			main.c
** Last modified Date:  2004-09-16
** Last Version:		1.0
** Descriptions:		The main() function example template
**
**------------------------------------------------------------------------------------------------------
** Created by:			Chenmingji
** Created date:		2004-09-16
** Version:				1.0
** Descriptions:		The original version
**
**------------------------------------------------------------------------------------------------------
** Modified by:			Chenxibing
** Modified date:  		2005-02-04
** Version:				V1.0
** Descriptions:		I2C从机实验从机程序
**
********************************************************************************************************/

/********************************************************************************************************
** 文件名:main().C
** 功能:使用LPC2131模拟EEPROM器,设从机地址为LPC2131_SLV。LPC2131具有硬件I2C接口,使用其从方式进行
**       I2C器件模拟,本例使用了256字节的RAM作为存储单元。
** 说明:P0.2、P0.3直接通过杜邦线挂到主机I2C总线上。
********************************************************************************************************/
#include  "config.h" 

#define  LPC2131_SLV     0xb0           /* 定义从机地址 */

#define LED1  1 << 18;					/* P1.18 LED1控制口 */

uint8   eeprom[256];                    /* 定义EEPROM存储单元,256字节 */
uint8   adrpoint;                       /* 定义EEPROM读写操作指针 */
uint8   slarv;                          /* 定义子地址接收标志,为1时表示己接收从机地址 */

/********* 该函数用于测试 ********/
void delay (uint32 dly)
{	uint32 i;
	
	for ( ; dly>0; dly--)
		for (i=0; i<50000; i++);
}
/********************************************************************************************************
** 函数名称:IRQ_I2C()
** 函数功能:I2C中断服务函数,实规从机操作。
** 入口参数:无
** 出口参数:无
********************************************************************************************************/
void   __irq IRQ_I2C(void)
{  uint8  sta;
   
   sta = I2STAT;                    // 取得I2C状态字
   sta &= 0xF8;
   switch(sta)
   {  case  0x60:                   // 接收到自身SLA+W
      case  0x68:   
            slarv = 0;
            I2CONSET = 0x04;
            break;
            
      case  0xA8:                   // 接收到SLA+R,或已发送数据并接收到ACK位。
      case  0xB0:
      case  0xB8:
            I2DAT = eeprom[adrpoint];
            adrpoint++;
            I2CONSET = 0x04;
            break;
            
      case  0x80:                   // 接收到数据
            if(0==slarv)
            {  adrpoint = I2DAT;
               slarv = 1;
            }
            else
            {  eeprom[adrpoint] = I2DAT;
               adrpoint++;
            }
            I2CONSET = 0x04;
            break;
            
      case  0xA0:                   // 已发送数据,并接收到非ACK
      case  0xC0:                   // 总线结束,或总线重新启动
      default:                      // 其它状态
            I2CONSET = 0x04;
            break;
   }
   
   I2CONCLR = 0x38;                 // 清除标I2C标志位,STA、STO、SI
   
   VICVectAddr = 0x00;   
}

/*********************************************************************************************************
** 函数名称:I2C_SlaveInit()
** 函数功能:从模式I2C初始化,包括初始化其中断为向量IRQ中断。
** 入口参数:adr		本从机地址
** 出口参数:无
********************************************************************************************************/
void  I2C_SlavInit(uint8 adr)
{ 
	PINSEL0 = (PINSEL0&0xFFFFFF0F) | 0x50; // 设置I2C控制口有效

   	I2ADR = adr&0xFE;               	// 设置从机地址
   	I2CONCLR = 0x28;
   	I2CONSET = 0x44;                 // I2C配置为从机模式
   
   /* 设置I2C中断允许 */
   VICIntSelect = 0x00000000;		// 设置所有通道为IRQ中断
   VICVectCntl0 = 0x29;				// I2C通道分配到IRQ slot 0,即优先级最高
   VICVectAddr0 = (int)IRQ_I2C;	    // 设置I2C中断向量地址	
   VICIntEnable = 0x0200;           // 使能I2C中断 
}

/********************************************************************************************************
** 函数名称:main()
** 函数功能:初始化I2C口连接,并初始化向量中断控制器。 
** 函数说明:
********************************************************************************************************/
int  main(void)
{  
	adrpoint = 0;
   	slarv = 0;
   	IO1DIR = LED1;
   	
   	IRQEnable();					// 使能IRQ中断
   	I2C_SlavInit(LPC2131_SLV);
      
   	while(1)						// 等待中断
   	{	/* 让LED1闪烁,让用户感觉程序在运行 */
   		IO1SET = LED1;
   		delay(20);
   		IO1CLR = LED1;
   		delay(20);
   	}
   	return(0);
}
/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/

⌨️ 快捷键说明

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