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

📄 i2c_isr.c

📁 Wince4.2 BSP for SH4 engineering development board
💻 C
字号:

//
//      Copyright (c) Renesas Technology Corp. 2002-2003  All Rights Reserved.
//
//      OEM Adaptation Layer
//
//----------------------------------------------------------------------------
//
//	File		:	I2C_ISR.C
//	Created		:	2002.01.31
//  MODIFIED    :   2003.08.06
//  AUTHOR      :   Renesas Technology Corp.
//  HARDWARE    :   RENESAS HS7751RSTC01H (S1-E, ITS-DS5)
//  TARGET OS   :   Microsoft(R) Windows(R) CE .NET 4.2
//	Notes   	:	
//	History		:
//					2002.9.27
//					- Released for HS7751RSTC01H (S1-E, ITS-DS5)


	
#include <windows.h>
#include <s1e.h>
#include <hd64404.h>
#include <oalintr.h>
#include <drv_glob.h>

typedef struct _I2C_TABLE {
	unsigned long volatile	dwType;
	unsigned long volatile	dwCount;
	unsigned long volatile	dwPoint;
	unsigned char volatile	bData[0x800-12];
} *PI2C_TABLE;


#define SCR		0x00
#define MCR		0x04
#define SSR		0x08
#define MSR		0x0C
#define SIER	0x10
#define MIER	0x14
#define TXD		0x24
#define RXD		0x24

#define Read(reg)		(*(volatile unsigned long * const)(reg))
#define Write(reg, val)	(*(volatile unsigned long * const)(reg)) = (val)

#define CLRBIT(reg, val) Write((reg), (Read(reg) & (~val)))
#define SETBIT(reg, val) Write((reg), (Read(reg) | val))

int	I2C_CH0_ISR(void);
int	I2C_CH1_ISR(void);
int	I2C_MasterTransmit(PVBYTE, PI2C_TABLE);
int	I2C_MasterReceive(PVBYTE, PI2C_TABLE);
int	I2C_SlaveTransmit(PVBYTE, PI2C_TABLE);
int	I2C_SlaveReceive(PVBYTE, PI2C_TABLE);

// I2C channel0 ISR
int	I2C_CH0_ISR(
	void
	)
{
DWORD	dwStatus;
volatile PI2C_TABLE	pi2c;

	pi2c = (PI2C_TABLE)(I2C_BUFFER_BASE);				// The share table address between ISR and i2c driver
	if ( pi2c -> dwType & 0x00000010 ){					// Master transmit mode
		dwStatus = Read(I2C0_BASE+MSR);
		if ( dwStatus & 0x00000001 ){
			CLRBIT((I2C0_BASE+MCR), 0x00000001);
			if ( pi2c -> dwCount == pi2c -> dwPoint ){
				SETBIT(I2C0_BASE+MCR, 0x00000002);
			}
			CLRBIT(I2C0_BASE+MSR, 0x00000001);
		}
		if ( dwStatus & 0x00000008 ){
			if ( pi2c -> dwPoint < pi2c -> dwCount ){
				Write(I2C0_BASE+TXD, (DWORD)pi2c -> bData[pi2c -> dwPoint++]);
			}else{
				SETBIT(I2C0_BASE+MCR, 0x00000002);
			}
			CLRBIT(I2C0_BASE+MSR, 0x00000008);
			return SYSINTR_NOP;
		}
		if ( dwStatus & 0x00000070 ){
			CLRBIT(I2C0_BASE+MSR, 0x00000070);
			pi2c -> dwType |= 0x00000001;
			return SYSINTR_I2C;
		}
	}else if ( pi2c -> dwType & 0x00000020 ){				// Master receive mode
		dwStatus = Read(I2C0_BASE+MSR);
		if ( dwStatus & 0x00000001 ){
			CLRBIT(I2C0_BASE+MCR, 0x00000001);
			if ( pi2c -> dwCount == pi2c -> dwPoint ){
				SETBIT(I2C0_BASE+MCR, 0x00000002);
			}
			CLRBIT(I2C0_BASE+MSR, 0x00000001);
		}
		if ( dwStatus & 0x00000002 ){
			if ( pi2c -> dwPoint < pi2c -> dwCount ){
				pi2c -> bData[pi2c -> dwPoint++] = (BYTE)Read(I2C0_BASE+RXD);
				if ( pi2c -> dwPoint == pi2c -> dwCount ){
					SETBIT(I2C0_BASE+MCR, 0x00000002);
				}
			}else{
				SETBIT(I2C0_BASE+MCR, 0x00000002);
			}
			CLRBIT(I2C0_BASE+MSR, 0x00000002);
			return SYSINTR_NOP;
		}
		if ( dwStatus & 0x00000070 ){
			CLRBIT(I2C0_BASE+MSR, 0x00000070);
			pi2c -> dwType |= 0x00000001;
			return SYSINTR_I2C;
		}
	}else if ( pi2c -> dwType & 0x00000040 ){				// Slave transmit mode
		dwStatus = Read(I2C0_BASE+SSR);
		if ( dwStatus & 0x00000001 ){
			CLRBIT(I2C0_BASE+SSR, 0x00000001);
		}
		if ( dwStatus & 0x00000008 ){
			if ( pi2c -> dwPoint < pi2c -> dwCount ){
				Write(I2C0_BASE+TXD, (DWORD)pi2c -> bData[pi2c -> dwPoint++]);
			}
			CLRBIT(I2C0_BASE+SSR, 0x00000008);
			return SYSINTR_NOP;
		}
		if ( dwStatus & 0x00000010 ){
			CLRBIT(I2C0_BASE+SSR, 0x00000010);
			pi2c -> dwType |= 0x00000001;
			return SYSINTR_I2C;
		}
	}else if ( pi2c -> dwType & 0x00000080 ){				// Slave receive mode
		dwStatus = Read(I2C0_BASE+SSR);
		if ( dwStatus & 0x00000001 ){
			CLRBIT(I2C0_BASE+SSR, 0x00000001);
		}
		if ( dwStatus & 0x00000002 ){
			if ( pi2c -> dwPoint < pi2c -> dwCount ){
				pi2c -> bData[pi2c -> dwPoint++] = (BYTE)Read(I2C0_BASE+RXD);
			}else{
				SETBIT(I2C0_BASE+SCR, 0x00000001);
				Read(I2C0_BASE+RXD);
			}
			CLRBIT(I2C0_BASE+SSR, 0x00000002);
			return SYSINTR_NOP;
		}
		if ( dwStatus & 0x00000010 ){
			CLRBIT(I2C0_BASE+SSR, 0x00000010);
			pi2c -> dwType |= 0x00000001;
			return SYSINTR_I2C;
		}
	}
	return SYSINTR_NOP;
}

// I2C channel1 ISR
int	I2C_CH1_ISR(
	void
	)
{
DWORD	dwStatus;
volatile PI2C_TABLE	pi2c;

	pi2c = (PI2C_TABLE)(I2C_BUFFER_BASE+I2C_CH2BUF_OFFSET);	// The share table address between ISR and i2c driver
	if ( pi2c -> dwType & 0x00000010 ){						// Master transmit mode
		dwStatus = Read(I2C1_BASE+MSR);
		if ( dwStatus & 0x00000001 ){
			CLRBIT((I2C1_BASE+MCR), 0x00000001);
			if ( pi2c -> dwCount == pi2c -> dwPoint ){
				SETBIT(I2C1_BASE+MCR, 0x00000002);
			}
			CLRBIT(I2C1_BASE+MSR, 0x00000001);
		}
		if ( dwStatus & 0x00000008 ){
			if ( pi2c -> dwPoint < pi2c -> dwCount ){
				Write(I2C1_BASE+TXD, (DWORD)pi2c -> bData[pi2c -> dwPoint++]);
			}else{
				SETBIT(I2C1_BASE+MCR, 0x00000002);
			}
			CLRBIT(I2C1_BASE+MSR, 0x00000008);
			return SYSINTR_NOP;
		}
		if ( dwStatus & 0x00000070 ){
			CLRBIT(I2C1_BASE+MSR, 0x00000070);
			pi2c -> dwType |= 0x00000001;
			return SYSINTR_I2C;
		}
	}else if ( pi2c -> dwType & 0x00000020 ){				// Master receive mode
		dwStatus = Read(I2C1_BASE+MSR);
		if ( dwStatus & 0x00000001 ){
			CLRBIT(I2C1_BASE+MCR, 0x00000001);
			if ( pi2c -> dwCount == pi2c -> dwPoint ){
				SETBIT(I2C1_BASE+MCR, 0x00000002);
			}
			CLRBIT(I2C1_BASE+MSR, 0x00000001);
		}
		if ( dwStatus & 0x00000002 ){
			if ( pi2c -> dwPoint < pi2c -> dwCount ){
				pi2c -> bData[pi2c -> dwPoint++] = (BYTE)Read(I2C1_BASE+RXD);
				if ( pi2c -> dwPoint == pi2c -> dwCount ){
					SETBIT(I2C1_BASE+MCR, 0x00000002);
				}
			}else{
				SETBIT(I2C1_BASE+MCR, 0x00000002);
			}
			CLRBIT(I2C1_BASE+MSR, 0x00000002);
			return SYSINTR_NOP;
		}
		if ( dwStatus & 0x00000070 ){
			CLRBIT(I2C1_BASE+MSR, 0x00000070);
			pi2c -> dwType |= 0x00000001;
			return SYSINTR_I2C;
		}
	}else if ( pi2c -> dwType & 0x00000040 ){				// Slave transmit mode
		dwStatus = Read(I2C1_BASE+SSR);
		if ( dwStatus & 0x00000001 ){
			CLRBIT(I2C1_BASE+SSR, 0x00000001);
		}
		if ( dwStatus & 0x00000008 ){
			if ( pi2c -> dwPoint < pi2c -> dwCount ){
				Write(I2C1_BASE+TXD, (DWORD)pi2c -> bData[pi2c -> dwPoint++]);
			}
			CLRBIT(I2C1_BASE+SSR, 0x00000008);
			return SYSINTR_NOP;
		}
		if ( dwStatus & 0x00000010 ){
			CLRBIT(I2C1_BASE+SSR, 0x00000010);
			pi2c -> dwType |= 0x00000001;
			return SYSINTR_I2C;
		}
	}else if ( pi2c -> dwType & 0x00000080 ){				// Slave receive mode
		dwStatus = Read(I2C1_BASE+SSR);
		if ( dwStatus & 0x00000001 ){
			CLRBIT(I2C1_BASE+SSR, 0x00000001);
		}
		if ( dwStatus & 0x00000002 ){
			if ( pi2c -> dwPoint < pi2c -> dwCount ){
				pi2c -> bData[pi2c -> dwPoint++] = (BYTE)Read(I2C1_BASE+RXD);
			}else{
				SETBIT(I2C1_BASE+SCR, 0x00000001);
				Read(I2C1_BASE+RXD);
			}
			CLRBIT(I2C1_BASE+SSR, 0x00000002);
			return SYSINTR_NOP;
		}
		if ( dwStatus & 0x00000010 ){
			CLRBIT(I2C1_BASE+SSR, 0x00000010);
			pi2c -> dwType |= 0x00000001;
			return SYSINTR_I2C;
		}
	}
	return SYSINTR_NOP;
}

⌨️ 快捷键说明

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