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

📄 main.c

📁 II2C 嵌入式arm
💻 C
字号:
//***************************************************************************************************
//Chinese Academy of Sciences, Institute of Automation
//File Name:	main.c
//Description: 	IIC test 
//Author:	JuGuang,Lee
//***************************************************************************************************	

#define IICCON		(*(volatile unsigned *)0x03FFF000) //IIC bus control status register
#define IICBUF		(*(volatile unsigned *)0x03FFF004) //IIC bus shift buffer register
#define IICPS		(*(volatile unsigned *)0x03FFF008) //IIC bus prescaler register

#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  

void Delay(int CNT)
{
	int i;
	for(i=0;i<CNT;i++);
} 
 
int DrvEepromRead(int addr, int size, int *buf)
{
	int error;
	error = DrvIicRead(addr, size, buf);
	return error;
}


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;
}

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;
	
	return error;
}


int DrvIicRead(int addr, int size, int *pdata)
{
	int error = 0, i;
	
   	// reset the 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 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;
}

int DrvIicWrite(int address, int size, int *pdata)
{
	int 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 
	IICBUF = IIC_DEV_0 | S_WRITE;
	while(!(IICCON & BF));

	// 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
	Delay(5000);

	return 0;
}

void C_Entry(void)
{
	int i;
	int a[4],b[4];
	DrvIicInit();

	i=DrvIicRead(0x0,4,a);
	a[0]=6;
	a[1]=7;
	a[2]=8;
	a[3]=9;
	i=DrvEepromWrite(0x0,4,a);
	i=DrvIicRead(0x0,4,b);
	while(1);
}

⌨️ 快捷键说明

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