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

📄 i2cint.c

📁 周立功的EASYARM2131的测试程序
💻 C
字号:
#include "config.h"

volatile uint8  I2C_sla  ;
volatile uint32 I2C_suba  ;
volatile uint8  I2C_suba_num  ;
volatile uint8  *I2C_buf  ;
volatile uint32 I2C_num  ;
volatile uint8  I2C_end  ;
volatile uint8  I2C_suba_en ;

uint8 ISendByte(uint8 sla , uint8 dat)
{
 I2C_sla = sla ;
 I2C_buf = &dat;
 I2C_num = 1;
 I2C_suba_en = 0;
 I2C_end = 0;
 I2CONCLR = 0x2C ;
 I2CONSET = 0x60 ; 
 while(I2C_end == 0) ;
 if(I2C_end == 1)
	return (1);
 else
	return (0);
	
}

uint8 IRecByte(uint8 sla , uint8 *dat)
{
	I2C_sla = sla + 1;
	I2C_buf = dat;
	I2C_num = 1;
	I2C_suba_en = 0;
	I2C_end = 0;
	I2CONCLR = 0x2C ;
	I2CONSET = 0x60 ;
	while(I2C_end == 0) ;
	if(I2C_end == 1)
		return (1);
	else
		return (0);
	
}

uint8 I2C_ReadNByte(uint8 sla , uint32 suba_type , uint32 suba , uint8 *s,uint32 num)
{
	if(num > 0)
	{
     	if(suba_type == 1)
     	{
     		I2C_sla = sla + 1;
     		I2C_suba = suba ; // uint32
     		I2C_suba_num = 1;
     	}
     	else if(suba_type == 2)
     	{
     		I2C_sla = sla + 1;
     		I2C_suba = suba ;
     		I2C_suba_num = 2;
     	}

     	I2C_buf = s ;
     	I2C_num = num ;
     	I2C_suba_en = 1 ;
     	I2C_end = 0 ;
     	
     	I2CONCLR = (1<<2) | (1<<3) | (1<<5) ;
     	I2CONSET = (1<<5) | (1<<6) ;
     	while(I2C_end == 0) ;
     	if(I2C_end == 1)
     		return TRUE ;
     	else
     		return FALSE ;
     		     	
 	}
 	
 	return FALSE ;

}

uint8 I2C_WriteNByte(uint8 sla , uint8 suba_type ,uint32 suba ,uint8 *s, uint32 num)
{
	if(num > 0)
	{
		if(suba_type == 1)
     	{
     		I2C_sla = sla ;
     		I2C_suba = suba ; // uint32
     		I2C_suba_num = 1;
     	}
     	else if(suba_type == 2)
     	{
     		I2C_sla = sla ;
     		I2C_suba = suba ;
     		I2C_suba_num = 2;
     	}
     	
     	I2C_buf = s ;
     	I2C_num = num ;
     	I2C_suba_en = 2 ;
     	I2C_end = 0;
     	
     	I2CONCLR = (1<<2) | (1<<3) | (1<<5) ;
     	I2CONSET = (1<<5) | (1<<6) ;
     	while(I2C_end == 0) ;
     	if(I2C_end == 1)
     		return (TRUE) ;
     	else
     		return (FALSE) ;
    	
	}
	
	return (FALSE) ;
}

void __irq IRQ_I2C(void)
{
	switch(I2STAT & 0xF8)
	{
		case 0x08 :
			if(I2C_suba_en == 1)
			{
				I2DAT = I2C_sla & 0xFE ;
			}
			else
			{
				I2DAT = I2C_sla ;
			}
			
			I2CONCLR = (1<<3) | (1<<5) ;
			break;
		case 0x10:
			I2DAT = I2C_sla;
			I2CONCLR = 0x28 ;
			break;
		case 0x18:
		case 0x28:
			if(I2C_suba_en == 0)
			{
				if(I2C_num >0)
				{
					I2DAT = *I2C_buf++;
					I2CONCLR = 0x28 ;
					I2C_num--;
				}
				else
				{
				 	I2CONSET = (1<<4);
				 	I2CONCLR = 0x28 ;
				 	I2C_end = 1;
				}
				
				
			}
			else if(I2C_suba_en == 1)
			{
				if(I2C_suba_num == 2)
				{
					I2DAT = ((I2C_suba >>8 ) & 0xFF) ;
					I2CONCLR = 0x28;
					I2C_suba_num--;
					break;
				}
				if(I2C_suba_num == 1)
				{
					I2DAT = (I2C_suba &0xFF);
					I2CONCLR = 0x28;
					I2C_suba_num--;
					break;
				}
				if(I2C_suba_num == 0)
				{
					I2CONSET = 0x20 ;
					I2CONCLR = 0x08;
					I2C_suba_en = 0;
					break;
				}
			}
			else if(I2C_suba_en == 2)
			{
				if(I2C_suba_num >0)
				{
					if(I2C_suba_num == 2)
				    {
					I2DAT = ((I2C_suba >>8 ) & 0xFF) ;
					I2CONCLR = 0x28;
					I2C_suba_num--;
					break;
				    }
				    if(I2C_suba_num == 1)
				    {
					I2DAT = (I2C_suba &0xFF);
					I2CONCLR = 0x28;
					I2C_suba_num--;
					I2C_suba_en = 0;
					break;
				    }
				}
			}
					break;
			case 0x40:
				if(I2C_num <= 1)
				{
					I2CONCLR = 1 << 2;
					
				}
				else
				{
					I2CONSET = 1 << 2;
				}
				I2CONCLR = 0x28;
       		      	break;
			case 0x20 :
			case 0x30:
			case 0x38:
			case 0x48:
			I2CONCLR = 0x28;
			I2C_end = 0xFF;
					break;
			
			case 0x50:
				*I2C_buf++ = I2DAT ;
				I2C_num--;
				if(I2C_num == 1)
					I2CONCLR = 0x2C ;
				else
				{
					I2CONSET = 0x04;
					I2CONCLR = 0x28;
				}
				break;
			case 0x58:
				*I2C_buf++ = I2DAT ;
				I2CONSET = 0x10;
				I2CONCLR = 0x28;
				I2C_end = 1;
				break;
			default :
				break;
			
	}
		VICVectAddr = 0x00;
}

/*
*********************************************************************************************************
** 函数名称 :I2cInit()
** 函数功能 :I2C初始化
** 入口参数 :Fi2c	I2C总线频率(最大400K)
** 出口参数 :无
*********************************************************************************************************
*/
void I2CInit(uint32 Fi2c)
{
	if(Fi2c > 400000)
		Fi2c = 400000;
	PINSEL0 = (PINSEL0 & 0xFFFFFF0F) | 0x50;
	I2SCLH = (Fpclk / Fi2c + 1)/2;
	I2SCLL = (Fpclk / Fi2c )/2;
	I2CONCLR = 0x2C ;
	I2CONSET = 0x40;
	
	VICIntSelect = 0x00000000;
	VICVectCntl9 = (0x20 | 0x09);
	VICVectAddr9 = (uint32)IRQ_I2C;
	VICIntEnable = (1<<9);
							/* 使能I2C中断 						*/
}


⌨️ 快捷键说明

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