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

📄 main.c

📁 ARMlpc2300技术笔记上册例程I2C读写24C256
💻 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进行操作,利用中断方式操作。
**         				向CAT24WC256中0x03f1地址(高位是0x03,低位是0xf1)处写入10个数据,然后
**         				读回校验,正确的话蜂鸣器鸣叫1声,否则连续鸣叫。
** 说  		明:		本实验是介绍如何利用zlg的I2C软件包进行对有双子地址的E2PROM器件的读写操作,
**        				带双子地址的E2PROM有CAT24WC32/64/128/256等,而CAT24WC01/02是单子地址的, 
**          			同时一些I2C器件是无子地址或者是3+x类型的,用户在使用时一定要注意API函数的选择和使用。
**------------------------------------------------------------------------------------------------------
** Modified by:			yangshiping
** Modified date:		2007-09-03
** Version:				
** Descriptions:		对程序的风格以及注释略作调整,并检查代码。
**
** Rechecked by:		Litiantian		
************************************************************************************************************/
#include  "config.h" 

#define   CAT24WC256 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(CAT24WC256, TWO_BYTE_SUBA, 0x03f1, data_buf, 10);
	DelayNS(10);
	
	/* 清零数据缓冲区,防止出错	*/
	for (i = 0; i < 10; i++) 
	{
		data_buf[i] = 0;
	}
	
	/* 从起始地址0x03f1读回刚才写入的数据 */
	I2C_ReadNByte(CAT24WC256, TWO_BYTE_SUBA, 0x03f1, 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 + -