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

📄 iic.c

📁 基于S3C4510的家庭网关的通讯进程程序源码
💻 C
字号:
/****************************************************************文件名:iic.c *功能:实现在samsung4510B上的i2c读写程序*本程序中还包含有i2c的测试程序IICReadTest*完成日期:2004.7.18**************************************************************/#include <stdio.h>#include "iic.h"IIC_DATA_TX_FORMAT  iic_txmit;IIC_DATA_RX_FORMAT  iic_recv;int  SetPreScaler(int sclk) {       return((int)(((fMCLK/sclk)-3.0)/16.0)-0.5);  //add 0.5 for }void IicSetup(void){	IICCON = IICRESET ;	IICPS = SetPreScaler((int)fSCL);  //support upto 100KHz}void IICWriteInt(U8 SlaveAddr,U16 WriteAddr,U8 *data,U32 SizeOfData){    int page,j;    int no_of_page;      /* Number of page */    int remain_byte;          U16 PageAccessAddr;     PageAccessAddr = WriteAddr;    iic_txmit.SLAVE_ADDR = SlaveAddr;    no_of_page = (int)(SizeOfData/(U32)SizeOfPage);    remain_byte = (int)(SizeOfData%(U32)SizeOfPage);	    for(page=0; page <= no_of_page;page++)    {        if(SizeOfData < SizeOfPage) 	  {              for(j=0; j < SizeOfData; j++)                 iic_txmit.PAGE_BUFFER[j] = *data++;             iic_txmit.WriteDataSize = SizeOfData;           }        else	   {               if(page == no_of_page) 	  	 {                   	for(j=0; j < remain_byte; j++)                       		iic_txmit.PAGE_BUFFER[j] = *data++;                   	iic_txmit.WriteDataSize = remain_byte;           	  }         	else 		  {                   	 for(j=0; j < SizeOfPage; j++)                        	iic_txmit.PAGE_BUFFER[j] = *data++;                    	 iic_txmit.WriteDataSize = SizeOfPage;               	   }       	    }        IicSetup();                         iic_txmit.FLAG = 0x0;        iic_txmit.BuffByteCnt = 0x0;        iic_txmit.BYTE_ADDR_MSB = (U8)((PageAccessAddr>>8) & 0xff);        iic_txmit.BYTE_ADDR_LSB = (U8)(PageAccessAddr & 0xff);        /* Step 1: Setup IICON register for transmit start */        while(IICCON & BUSY);   /* Wait! the iic bus is busy */        IICCON = START|ACK; /* Now, Start to transmit */        /* Send Slave Address and Write command */        IICBUF = iic_txmit.SLAVE_ADDR|S_WRITE;        while(!(iic_txmit.FLAG & iic_page_tx_done))		{			while(!(IICCON & BF));						if(!(iic_txmit.FLAG & (U32)iic_byte_addr_msb)) 				{ 	          		/* Send byte address: MSB */			          IICBUF = iic_txmit.BYTE_ADDR_MSB;			          iic_txmit.FLAG |= (U32)iic_byte_addr_msb;      				}		      else if(!(iic_txmit.FLAG & (U32)iic_byte_addr_lsb)) 			 	{			          /* Send byte address: LSB */			          IICBUF = iic_txmit.BYTE_ADDR_LSB;			          iic_txmit.FLAG |= (U32)iic_byte_addr_lsb; 				}					     else if(iic_txmit.BuffByteCnt < iic_txmit.WriteDataSize) 			 	{			         IICBUF = iic_txmit.PAGE_BUFFER[iic_txmit.BuffByteCnt++]; 				printf("IICBuff[%d]=%x\n",iic_txmit.BuffByteCnt,(U8)IICBUF);	     				}		     else {             			/* STOP IIC Controller */		            IICCON = STOP;		            /* byte data or page data transmit done */		            iic_txmit.FLAG |= (U32)iic_page_tx_done;			     }		      		}	      PageAccessAddr += SizeOfPage;	      for(j=0; j< (int)Write_Cycle_ms(5); j++);  /* for 5ms write cycle */	}}void *IICReadInt(U8 SlaveAddr,U16 ReadAddr,U32 SizeOfData){    U8 *ReadPtr;  /* data read pointer */    IicSetup();    /*Memory alloc for receive data */    if((ReadPtr = (U8 *)malloc((unsigned)SizeOfData)) ==0)         printf("\rMemory allocation error occurred!!!\n");    iic_recv.RCV_BUFFER = ReadPtr;    iic_recv.FLAG = 0x0;    iic_recv.ByteReadCnt = 0x0;    iic_recv.ReadDataSize = SizeOfData;    iic_recv.SLAVE_ADDR = SlaveAddr;    iic_recv.BYTE_ADDR_MSB = (U8)((ReadAddr>>8) & 0xff);    iic_recv.BYTE_ADDR_LSB = (U8)(ReadAddr & 0xff);    /* Step 1: Setup IICON register for receive start */    while(IICCON & BUSY);   /* Wait! the iic bus is busy */    IICCON = START|ACK;    /* Send Slave Address and Write command */    IICBUF = iic_recv.SLAVE_ADDR|S_WRITE;    while(!(iic_recv.FLAG & iic_byte_rx_done))    {      while(!(IICCON&BF));		if(!(iic_recv.FLAG & (U32)iic_byte_addr_msb)) 		{        	/* Send byte address: MSB */          	IICBUF = iic_recv.BYTE_ADDR_MSB;	          	iic_recv.FLAG |= (U32)iic_byte_addr_msb; /* send msb byte addr */     		}     		else if(!(iic_recv.FLAG & (U32)iic_byte_addr_lsb)) 		{          	/* Send byte address: LSB */          	IICBUF = iic_recv.BYTE_ADDR_LSB;          	iic_recv.FLAG |= (U32)iic_byte_addr_lsb; /* send lsb byte addr */     		}	else if(!(iic_recv.FLAG & (U32)iic_repeat_start)) 		{          	/* Repeat Start */          	IICCON = RESTART;           	IICCON = START|ACK;          	IICBUF = iic_recv.SLAVE_ADDR|S_READ;          	iic_recv.FLAG |= (U32)iic_repeat_start;     		}     	else if(!(iic_recv.FLAG & (U32)iic_multi_recv)) 		{          	/* Receive multiple data */          	IICCON = ACK;          	iic_recv.FLAG |= (U32)iic_multi_recv;     		}     	else if(iic_recv.ByteReadCnt < iic_recv.ReadDataSize) 		{          	*(iic_recv.RCV_BUFFER)++ = IICBUF;          	iic_recv.ByteReadCnt++;     		}	else if(!(iic_recv.FLAG & (U32)iic_no_more_recv)) 		{             	/* Now,no more received data is required from slave */            	IICCON = NOACK;            	iic_recv.FLAG |= (U32)iic_no_more_recv;     		}     	else		{ /* Receive last data and STOP */            	*(iic_recv.RCV_BUFFER)++ = IICBUF;            	/* STOP IIC Controller */            	IICCON = STOP;            	/* byte data receive done */            	iic_recv.FLAG |= (U32)iic_byte_rx_done;     		}	    	    	}    	return(ReadPtr);         /* return receive data pointer */}void IICReadTest(void){	U8 *DataBuff;	U32 ReadDataSize=6 ;	int i,p;	U32 ByteAddr=0x0;        DataBuff=(U8 *)IICReadInt((U8)IIC_DEV_0,(U16)ByteAddr,ReadDataSize);	sleep(1);	for (i=0;i<ReadDataSize;i++) 	{/*	        if(!(i%SizeOfPage)) 			printf("\r[%d]0x%x: \n",p++,ByteAddr);    */	        printf("DataBuff[%d]=%x\n",i,*DataBuff++); /*	        ByteAddr++; */       } }

⌨️ 快捷键说明

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