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

📄 testiic.c

📁 pxa270IIC有关驱动代码
💻 C
字号:
/***************************************优龙科技责任有限公司*********************************************
**--------------文件信息--------------------------------------------------------------------------------
**文   件   名: TestIic.c
**创   建   人: cgf
**最后修改日期: 2005-11-28
**描        述: IIC读写实验代码
**                
********************************************************************************************************/
#include <stdio.h>
#include "regsdef.h"
#include "XsClkMgr.h"
#include "utils.h"

/*************************************************************/
//#define	IIC_DEBUG
#ifdef	IIC_DEBUG
#define	iic_debug	printf
#else
#define	iic_debug(...)
#endif

/*************************************************************/
#define	ICR_FM		(1<<15)		//0=100k,1=400k
#define	ICR_UR		(1<<14)		//0=no reset, 1=reset
#define	ICR_SADIE	(1<<13)		//1=slave address detect interrupt enable
#define	ICR_ALDIE	(1<<12)
#define	ICR_SSDIE	(1<<11)		//1=slave stop detect interrupt enable
#define	ICR_BEIE	(1<<10)
#define	ICR_IRFIE	(1<<9)
#define	ICR_ITEIE	(1<<8)
#define	ICR_GCD		(1<<7)
#define	ICR_IUE		(1<<6)
#define	ICR_SCLE	(1<<5)
#define	ICR_MA		(1<<4)
#define	ICR_TB		(1<<3)
#define	ICR_ACKNAK	(1<<2)
#define	ICR_STOP	(1<<1)
#define	ICR_START	(1<<0)

#define	ISR_BED		(1<<10)
#define	ISR_SAD		(1<<9)
#define	ISR_GCAD	(1<<8)
#define	ISR_IRF		(1<<7)
#define	ISR_ITE		(1<<6)
#define	ISR_ALD		(1<<5)
#define	ISR_SSD		(1<<4)
#define	ISR_IBB		(1<<3)
#define	ISR_UB		(1<<2)
#define	ISR_ACKNAK	(1<<1)
#define	ISR_RWM		(1<<0)

#define	IIC_WR			0
#define	IIC_RD			1

/*****************************************************************************
** 函数名称: iic_set_addr
** 功能描述: 设置IIC器件地址
** 输 入:   无
** 输 出 :  无
** 全局变量: 无
** 调用模块: 无
*****************************************************************************/
static int iic_set_addr(UCHAR saddr, UCHAR *addr, UCHAR addrcnt)
{
	int isr;
	
	IICISR = 0x7ff;
	IDBR = saddr;
	ICR = ICR_IUE|ICR_SCLE|ICR_TB|ICR_START;
	while(ICR&ICR_TB);
	isr = IICISR;
	iic_debug("%x\n", isr);
	IICISR = isr&0x7ff;
	if(isr&(ISR_BED))
		return -1;
	
	while(addrcnt) {
		IDBR = *addr++;
		ICR = ICR_IUE|ICR_SCLE|ICR_TB;
		while(ICR&ICR_TB);
		isr = IICISR;
		iic_debug("%x\n", isr);
		IICISR = isr&0x7ff;
		addrcnt--;
		if(isr&(ISR_BED))
			return -1;
	}
	
	return 0;
}

/*****************************************************************************
** 函数名称: iic_set_wr
** 功能描述: 
** 输 入:   无
** 输 出 :  无
** 全局变量: 无
** 调用模块: 无
*****************************************************************************/
static __inline int iic_set_wr(UCHAR saddr, UCHAR *addr, UCHAR addrcnt)
{
	return iic_set_addr((saddr<<1)|IIC_WR, addr, addrcnt);
}


/*****************************************************************************
** 函数名称: iic_set_rd
** 功能描述: 
** 输 入:   无
** 输 出 :  无
** 全局变量: 无
** 调用模块: 无
*****************************************************************************/
static __inline int iic_set_rd(UCHAR saddr, UCHAR *addr, UCHAR addrcnt)
{
	if(iic_set_addr((saddr<<1)|IIC_WR, addr, addrcnt))
		return -1;
	return iic_set_addr((saddr<<1)|IIC_RD, NULL, 0);
}



/*****************************************************************************
** 函数名称: iic_wr_byte
** 功能描述: 向IIC写一个字节
** 输 入:   无
** 输 出 :  无
** 全局变量: 无
** 调用模块: 无
*****************************************************************************/
static __inline int iic_wr_byte(UCHAR data)
{
	int isr;
	
	IDBR = data;
	ICR = ICR_IUE|ICR_SCLE|ICR_TB|ICR_STOP;
	while(ICR&ICR_TB);
	isr = IICISR;
	iic_debug("%x\n", isr);
	IICISR = isr&0x7ff;
	ICR &= ~ICR_STOP;
	if(isr&(ISR_BED))
		return -1;
	
	return 0;
}



/*****************************************************************************
** 函数名称: iic_rd_byte
** 功能描述: 从IIC器件读一个字节
** 输 入:   无
** 输 出 :  无
** 全局变量: 无
** 调用模块: 无
*****************************************************************************/
static __inline int iic_rd_byte(UCHAR *data)
{
	int isr;

	ICR = ICR_IUE|ICR_SCLE|ICR_TB|ICR_ACKNAK|ICR_STOP;
	while(!(IICISR&ISR_IRF));
	isr = IICISR;
	iic_debug("%x\n", isr);
	IICISR = isr&0x7ff;
	*data = IDBR;
	ICR &= ~(ICR_ACKNAK|ICR_STOP);
	
	return 0;
}

/*****************************************************************************
** 函数名称: InitIicCtrl
** 功能描述: IIC初始化
** 输 入:   无
** 输 出 :  无
** 全局变量: 无
** 调用模块: 无
*****************************************************************************/
VOID InitIicCtrl(VOID)
{
	xsCMEnableClock(I2C_CE);
	
	ICR = ICR_UR;		//reset iic unit
	DM_WaitMs(10);
	ICR = ICR_IUE|ICR_SCLE;
	ISAR = 0x12;	//in slave mode, slave address
}

/*************************************************************/


/*****************************************************************************
** 函数名称: iic_rom_test
** 功能描述: IIC读写测试
** 输 入:   无
** 输 出 :  无
** 全局变量: 无
** 调用模块: 无
*****************************************************************************/
#define	IIC_ROM_ADDR		0x50

//at24c02/04/08使用8位地址索引,04/08使用a0-a2做page索引

static void iic_rom_test(void)
{
	UCHAR iaddr, data;
	
	InitIicCtrl();
	/*xsCMEnableClock(I2C_CE);
	
	ICR = ICR_UR;		//reset iic unit
	DM_WaitMs(10);
	ICR = ICR_IUE|ICR_SCLE;
	ISAR = 0x12;	//in slave mode, slave address
	*/
	printf("IIC ROM wrtite\r\n");
	for(iaddr=0; iaddr<0x80; iaddr++) {
		if(iic_set_wr(IIC_ROM_ADDR, &iaddr, 1)) {
			printf("fail to set IIC ROM address for write\n");
			return;
		} else {
			if(iic_wr_byte(0x80-iaddr-1))
			//if(iic_wr_byte(iaddr))
				printf("fail to write byte to IIC ROM\n");
			else {
				if(!(iaddr%16))
				printf("0x%02x : ", iaddr);
				printf("%4x", (0x80-iaddr-1));
				//printf("%4x", (iaddr));
				if(!((iaddr+1)%16))
					printf("\r\n");
			}
		}
		DM_WaitMs(10);	//delay for write
	}
	
	printf("IIC ROM read\r\n");
	for(iaddr=0; iaddr<0x80; iaddr++) {
		if(iic_set_rd(IIC_ROM_ADDR, &iaddr, 1)) {
			printf("fail to set IIC ROM address for read\r\n");
			return;
		} else {
			if(iic_rd_byte(&data))
				printf("fail to read byte from IIC ROM\r\n");
			else {
				if(!(iaddr%16))
					printf("0x%02x : ", iaddr);
				printf("%4x", data);
				if(!((iaddr+1)%16))
					printf("\r\n");
			}
		}
	}
	xsCMDisableClock(I2C_CE);
	printf("IIC ROM test complete\r\n");
}

/*****************************************************************************
** 函数名称: DeinIicCtrl
** 功能描述: 禁止IIC的时钟
** 输 入:   无
** 输 出 :  无
** 全局变量: 无
** 调用模块: 无
*****************************************************************************/
VOID DeintIicCtrl(VOID)
{
	xsCMDisableClock(I2C_CE);
}

/*****************************************************************************
** 函数名称: WriteIicDev
** 功能描述: 向IIC写数据
** 输 入:   无
** 输 出 :  无
** 全局变量: 无
** 调用模块: 无
*****************************************************************************/
INT WriteIicDev(UCHAR saddr, UCHAR iaddr, UCHAR data)
{
	if(iic_set_wr(saddr, &iaddr, 1))
		return -1;
	if(iic_wr_byte(data))
		return -1;
	return 0;
}

/*****************************************************************************
** 函数名称: ReadIicDev
** 功能描述: IIC读数据
** 输 入:   无
** 输 出 :  无
** 全局变量: 无
** 调用模块: 无
*****************************************************************************/
INT ReadIicDev(UCHAR saddr, UCHAR iaddr, PUCHAR data)
{
	if(iic_set_rd(saddr, &iaddr, 1))
		return -1;
	if(iic_rd_byte(data))
		return -1;
	return 0;
}

/*****************************************************************************
** 函数名称: TestIic
** 功能描述: IIC测试程序
** 输 入:   无
** 输 出 :  无
** 全局变量: 无
** 调用模块: 无
*****************************************************************************/
void TestIic(void)
{
	iic_rom_test();		//IIC测试函数
}

/********************End of File*********************************************/

⌨️ 快捷键说明

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