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

📄 drv_eeprom.c

📁 S3C4510B的例程
💻 C
字号:
/***********************************************************************
 *  MODULE:        drv_eeprom.c     
 *  Description:   EEPRM Driver
 *  Runtime Env:   ANY
 *  Company:       
 *  Change History:
 *     03-28-02   Create (Yadong Wang)
 ***********************************************************************/
#include "common_types.h"
#include "samsung4510.h"
#include "main.h"

// Local #define#define PAGE_SIZE	16
#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    // No more received data is required from the slave
#define START		0x10
#define STOP		0x20
#define RESTART		0x30
#define BUSY		0x40
#define IICRESET	0x80    // Reset the IIC-BUS controller

// Local Routinesstatic tU16 DrvIicInit(void);
static tU16 DrvIicRead(tU16 addr, tU16 size, tU8 *pdata);
static tU16 DrvIicWrite(tU16 address, tU16 size, tU8 *pdata);

tU16 DrvEepromInit(){
	return 0;
}
tU16 DrvEepromRead(tU32 addr, tU16 size, tU8 *buf){	tU16 error;

	error = DrvIicRead(addr, size, buf);

	return error;}

tU16 DrvEepromWrite(tU32 addr, tU16 size, tU8 *pdata){
	tU8 PageBuf[PAGE_SIZE];	tU16 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;}static tU16 DrvIicInit()
{
	tU16 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;
}


static tU16 DrvIicRead(tU16 addr, tU16 size, tU8 *pdata)
{
	tU8 block;
	tU16 error = 0, i;
	
   	// 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 
	block = (tU8)((addr>>8) & 0xFF);
	block <<= 1;
	block &= 0x06;
	IICBUF = IIC_DEV_0 | S_WRITE | block;
	while(!(IICCON & BF));

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

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

	// send re-start and control byte (read cmd)
	IICCON = RESTART;		
	IICCON = START | ACK;	
	IICBUF = IIC_DEV_0 | S_READ | block; 
	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;
}


static tU16 DrvIicWrite(tU16 address, tU16 size, tU8 *pdata)
{
	tU16 i;
	tU8 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 
	block = (tU8)((address>>8) & 0xFF);
	block <<= 1;
	block &= 0x06;
	IICBUF = IIC_DEV_0 | S_WRITE | block;
	while(!(IICCON & BF));

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

	// send lsb address
	IICBUF = (tU8)(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
	Delay(5000);

	return 0;
}

⌨️ 快捷键说明

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