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

📄 main.c

📁 ARMlpc2300技术笔记上册例程I2C读写24C02
💻 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:			zhangmingjie
** Created date:		2007-3-26
** Version:				1.0
** Descriptions:		使用硬件I2C对E2PROM进行操作,利用中断方式操作。
**                      向CAT24C02中0x00地址写入10字节数据,并检验,如果检验成功则蜂鸣器响一下,否则不断报警
**                      注,SmartARM2300工控开发平台的核心板放置的非易失性芯片是I2C总线接口的存储器--铁电FM24CL04,
**                      芯片封装和普通的E2PROM一致,读写方式和E2PROM均采用I2C总线,因此读写CAT24C02的程序
**                      可以在铁电上直接运行,如果用户需要改成CAT24C02芯片,可以直接互换。  
**------------------------------------------------------------------------------------------------------
** Modified by:			yangshiping
** Modified date:		2007-09-03
** Version:				
** Descriptions:		对程序的风格以及注释略作调整,并检查代码。
**
** Rechecked by:		Litiantian
****************************************************************************/
#include  "config.h" 

#define   CAT24C02 0xA2            		// 定义器件地址 

#define	  BEEPCON	(1 << 27)			

 uint8    data_buf[30];

/****************************************************************************
** 函数名称:I2C_Init
** 函数功能:主模式I2C初始化,包括初始化其中断为向量IRQ中断。
** 入口参数:fi2c		初始化I2C总线速率,最大值为400K
** 出口参数:无
****************************************************************************/
void  I2C_Init(uint32 fi2c)
{  
	if (fi2c > 400000) 
	{    
	    fi2c = 400000;
	}
  	PINSEL1  = (PINSEL1 & ~(0xff << 22)) | (0x05 << 22); 	// 设置I2C控制口有效,P0.27、P0.28

   	I2SCLH 	 = (Fpclk / fi2c + 1) / 2;	// 设置I2C时钟为fi2c
   	I2SCLL 	 = (Fpclk / fi2c) / 2;
   	I2CONCLR = 0x2C;
   	I2CONSET = 0x40;					// 使能主I2C
   
   	/* 设置I2C中断允许 */
	VICIntSelect 	= 0x00;				// 所有中断通道设置为IRQ中断		
	VICVectPri9 	= 00;				// 设I2C中断最高优先级	
	VICVectAddr9 	= (uint32)IRQ_I2C;	// 设置中断服务程序地址					
	VICIntEnable 	= 1 << 0x09;		// 使能I2C中断
}

/****************************************************************************
** 函数名称:DelayNS
** 函数功能:长软件延时
** 入口参数:dly	延时参数,值越大,延时越久
** 出口参数:无
****************************************************************************/
void  DelayNS(uint32  dly)
{  
	uint32  i;
	
   	for(; dly > 0; dly--) 
      for (i = 0; i < 50000; i++);
}
	
/****************************************************************************
** 函数名称:WrEepromErr
** 函数功能:读写EEPRM出错蜂鸣报警。
** 入口参数:无
** 出口参数:无
****************************************************************************/	
void  WrE2promErr(void)	
{  
	while (1)
   	{  
   		IO1SET = BEEPCON;
      	DelayNS(3);
      	IO1CLR = BEEPCON;
      	DelayNS(3);
   	}
}
			
/****************************************************************************
** 函数名称:main
** 函数功能:向E2PROM写入10字节数据,然后读出判断是否正确写入。
** 函数说明:1、在CONFIG.H文件中包含I2CINT.H;
**		     2、在Flash中进行调试。
****************************************************************************/
int  main(void)
{  
	uint8  i;
  
   	PINSEL1 = 0x00000000;		
   	IO1DIR  = BEEPCON;
   	IO1SET  = BEEPCON;
   
   	I2C_Init(100000);                      	// I2C初始化
   	IRQEnable();
   
   	for (i = 0; i < 10; i++) 
   	{	
   		data_buf[i] = i + '0';
    }
    
	/* 往起始地址0x03f1开始写入10个数据	*/
	I2C_WriteNByte(CAT24C02, ONE_BYTE_SUBA, 0x00, data_buf, 10);
	DelayNS(10);
	
	/* 清零数据缓冲区,防止出错	*/
	for (i = 0; i < 10; i++)	
	{
		data_buf[i] = 0;
	}
	
	/* 从起始地址0x03f1读回刚才写入的数据 */
	I2C_ReadNByte(CAT24C02, ONE_BYTE_SUBA, 0x00, data_buf, 10);
  
    /* 校验读出的数据,若不正确则蜂鸣报警 */
   	for(i = 0; i < 10; i++)
   	{  
   		if (data_buf[i] != (i + '0')) 
   	   	{
   	   		WrE2promErr();
   		}
   }

   IO1CLR = BEEPCON;
   DelayNS(30);
   IO1SET = BEEPCON;
   
   while (1);
   return (0);					
}

⌨️ 快捷键说明

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