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

📄 iic.c

📁 三星4510 BOOTLOADER全部源代码
💻 C
字号:
//***************************************************************************************************
//Chinese Academy of Sciences, Institute of Automation
//File Name:	iic.c
//Description: 	IIC.Read and Write. 
//Author:	Lee JuGuang
//Date:		2004-1-4
//***************************************************************************************************	

#include "s3c4510b_add.h"
#define PAGE_SIZE	8
#define IIC_DEV_0	0xa0    // IIC device's slave address
#define S_WRITE		0x00    // Write IIC data for slave
#define S_READ		0x01    // Read IIC data for slave

#define BF 		0x01	// Buffer flag
#define IEN		0x02    // Interrupt enable
#define LRB		0x04    // Last bit received/ACK not received
#define ACK		0x08    // Ack enable/Generate an ACK signal at 9th SCL
#define NOACK		0x00    
#define START		0x10
#define STOP		0x20
#define RESTART		0x30
#define BUSY		0x40
#define IICRESET	0x80  


/************************************************************************/
/*Function Name:	DrvIicRead(int addr, int size, int *pdata)	*/		
/*Function Description:	Read IIC Device					*/
/*Date:			2004-01-04					*/
/************************************************************************/
int DrvIicRead(int addr, int size, int *pdata)
{
	int error = 0, i;
	
   	/**** Reset IIC ****/
	DrvIicInit();

	/**** Wait for not busy ****/
	while(IICCON & BUSY);

	/**** Send Start: START | ACK ****/
	IICCON = START | ACK;

	/**** send control byte (write cmd): read block 0 ****/ 
	IICBUF = IIC_DEV_0 | S_WRITE ;
	while(!(IICCON & BF));

	/**** send msb address  ****/
//	IICBUF = (int)((addr>>8) & 0xFF);
//	while(!(IICCON & 0x01));

	/**** send lsb address  ****/
	IICBUF = (int)(addr & 0xFF);
	while(!(IICCON & BF));

	/**** send re-start and control byte (read cmd) ****/
	IICCON = RESTART;		
	IICCON = START | ACK;	
	IICBUF = IIC_DEV_0 | S_READ ; 
	while(!(IICCON & BF));

	/**** Generate ACK for multi read ****/
	IICCON = ACK;
	while(!(IICCON & BF));

	/**** Rx Data ****/
	for(i=0; i<size; i++)
		{
		*pdata++ = IICBUF;
		while(!(IICCON & BF));
		}

	/**** Send NO ACK ****/
	IICCON = NOACK; 
	while(!(IICCON & BF));

	/**** Send Stop ****/
	IICCON = STOP; 

	return error;
}
/************************************************************************/
/*Function Name:	DrvIicInit()					*/		
/*Function Description:	Init IIC Device					*/
/*Date:			2004-01-04					*/
/************************************************************************/
int DrvIicInit()
{
	int error = 0;

   	/**** reset the ICC ****/
	IICCON = IICRESET; 

	/**** clock setup, ICC CLK = SysClk/(16 x (prescaker + 1) + 3), 100KHz at 50MHz ****/
	IICPS = 0x0000001E;

	// Install Vector
//	SysSetInterrupt(nIIC_INT, IICisr);
	// Enable the INT, Enable_Int(nTIMER1_INT);  
//	Enable_Int(nIIC_INT); 

	return error;
}

/************************************************************************/
/*Function Name:	DrvEepromWrite(int addr, int size, int *pdata)	*/		
/*Function Description:	Write IIC Device				*/
/*Date:			2004-01-04					*/
/************************************************************************/
int DrvEepromWrite(int addr, int size, int *pdata)
{
	int PageBuf[PAGE_SIZE];
	int page, no_of_page, error=0, i, remain_byte;
	
	no_of_page = size/PAGE_SIZE;
	remain_byte = size % PAGE_SIZE;
	if (no_of_page)
	{
		for(page=0; page<no_of_page; page++)
		{
			for(i=0; i<PAGE_SIZE; i++)
				PageBuf[i] = *pdata++;
			DrvIicWrite(addr, PAGE_SIZE, PageBuf);
			addr += PAGE_SIZE;
		}
	}
	if (remain_byte)
	{
		for(i=0; i<remain_byte; i++)
			PageBuf[i] = *pdata++;
		DrvIicWrite(addr, remain_byte, PageBuf);
	}

	return error;
}

/************************************************************************/
/*Function Name:	DrvIicWrite(int address, int size, int *pdata)	*/		
/*Function Description:	Write Operation					*/
/*Date:			2004-01-04					*/
/************************************************************************/
int DrvIicWrite(int address, int size, int *pdata)
{
	int i;
	//int block;

   	/**** reset the ICC ****/
	DrvIicInit();

	/**** wait for not busy ****/
	while(IICCON & BUSY);

	/**** Send Start: START | ACK ****/
	IICCON = START | ACK;

	/**** send control byte (write cmd): read block 0 ****/
	IICBUF = IIC_DEV_0 | S_WRITE;
	while(!(IICCON & BF));

	// send msb address
//	IICBUF = (tU8)((address>>8) & 0xFF);
//	while(!(IICCON & 0x01));

	/**** send lsb address ****/
	IICBUF = (int)(address & 0xFF);
	while(!(IICCON & BF));

	/**** Write data ****/
	for(i=0; i<size; i++)
		{
		IICBUF = *pdata++;
		while(!(IICCON & BF));
		}

	/**** STOP IIC Controller ****/
	IICCON = STOP;

	/**** 5 ms write cycle ****/
	for(i=0;i<65535;i++);	
	return 0;
}

⌨️ 快捷键说明

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