?? iic.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 + -