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

📄 iic.c

📁 Embest EudKit-II教学系统配Samsung S3C44B0处理器的部分测试程序。
💻 C
字号:
/*********************************************************************************************
* File:	iic.c
* Author:	embest
* Desc:	iic source code
* History:	
*********************************************************************************************/
#include "44b.h"
#include "44blib.h"
#include "def.h"
#include "iic.h"

/*------------------------------------------------------------------------------------------*/
/*	 								global variables					 				    */
/*------------------------------------------------------------------------------------------*/
int f_nGetACK;

/*------------------------------------------------------------------------------------------*/
/*	 								function declare					 				    */
/*------------------------------------------------------------------------------------------*/
void iic_int(void);// __attribute__ ((interrupt ("IRQ")));
void iic_test(void);
void write_24c040(UINT32T unSlaveAddr, UINT32T unAddr, UINT8T ucData);
void read_24c040(UINT32T unSlaveAddr, UINT32T unAddr, UINT8T *pData);

/*********************************************************************************************
* name:		iic_test
* func:		test iic
* para:		none
* ret:		none
* modify:
* comment:		
********************************************************************************************/
void iic_test(void)
{
    UINT8T 			szData[16];
    unsigned int 	i, j;

    uart_printf("IIC Test using AT24C04...\n");
    uart_printf("Write char 0-f into AT24C04\n");

	f_nGetACK = 0;

    // Enable interrupt
	rINTMOD = 0x0;
	rINTCON = 0x1;
	rINTMSK &= ~(BIT_GLOBAL|BIT_IIC);
    pISR_IIC = (unsigned)iic_int;

	// Initialize iic
	rIICADD = 0x10;						// S3C44B0X slave address 
    rIICCON = 0xaf;						// Enable ACK, interrupt, IICCLK=MCLK/16, Enable ACK//64Mhz/16/(15+1) = 257Khz
    rIICSTAT = 0x10;					// Enable TX/RX 

	// Write 0 - 16 to 24C04
    for(i=0; i<16; i++)
		write_24c040(0xa0, i, i);
	
	// Clear array
    for(i=0; i<16; i++)
		szData[i]=0;
    
    // Read 16 byte from 24C04
    for(i=0; i<16; i++)
		read_24c040(0xa0, i, &(szData[i])); 

	// Printf read data
    uart_printf("Read 16 bytes from AT24C04\n");
    for(i=0; i<16; i++)
    {
	    uart_printf("%2x ", szData[i]);
    }
    uart_printf("\n");
}

/*********************************************************************************************
* name:		write_24c040
* func:		write data to 24C040
* para:		unSlaveAddr --- input, chip slave address
*			unAddr		--- input, data address
*			ucData    	--- input, data value
* ret:		none
* modify:
* comment:		
********************************************************************************************/
void write_24c040(UINT32T unSlaveAddr,UINT32T unAddr,UINT8T ucData)
{
	f_nGetACK = 0;
    
    /* Send control byte */
    rIICDS = unSlaveAddr;			// 0xa0
    rIICSTAT = 0xf0; 				// Master Tx,Start

    while(f_nGetACK == 0);			// Wait ACK
    f_nGetACK = 0;
    
    /* Send address */
    rIICDS = unAddr;
    rIICCON = 0xaf;   				// Resumes IIC operation.
    
    while(f_nGetACK == 0);			// Wait ACK
    f_nGetACK = 0;
    
    /* Send data */
    rIICDS = ucData;
    rIICCON = 0xaf;   				// Resumes IIC operation.
    
    while(f_nGetACK == 0);			// Wait ACK
    f_nGetACK = 0;
    
    /* End send */
    rIICSTAT = 0xd0;				// Stop Master Tx condition
    rIICCON = 0xaf;					// Resumes IIC operation.
    delay(5);						// Wait until stop condtion is in effect.
}
	
/*********************************************************************************************
* name:		read_24c040
* func:		read data from 24C040
* para:		unSlaveAddr --- input, chip slave address
*			unAddr		--- input, data address
*			pData    	--- output, data pointer
* ret:		none
* modify:
* comment:		
********************************************************************************************/
void read_24c040(UINT32T unSlaveAddr,UINT32T unAddr,UINT8T *pData)
{
	char cRecvByte;
	
	f_nGetACK = 0;

    /* Send control byte */
    rIICDS = unSlaveAddr;			// 0xa0
    rIICSTAT = 0xf0; 				// Master Tx,Start

    while(f_nGetACK == 0);			// Wait ACK
    f_nGetACK = 0;

    /* Send address */
    rIICDS = unAddr;
    rIICCON = 0xaf;   				// Resumes IIC operation.
    
    while(f_nGetACK == 0);			// Wait ACK
    f_nGetACK = 0;

    /* Send control byte */
    rIICDS = unSlaveAddr;			// 0xa0
    rIICSTAT = 0xb0; 				// Master Rx,Start
	rIICCON = 0xaf;  				// Resumes IIC operation.   
	
    while(f_nGetACK == 0);			// Wait ACK
    f_nGetACK = 0;
    
    /* Get data */
    cRecvByte = rIICDS;
    rIICCON = 0x2f;
    delay(1);
    
    /* Get data */
    cRecvByte = rIICDS;
    
    /* End receive */
    rIICSTAT = 0x90;  				// Stop Master Rx condition 
	rIICCON = 0xaf;   				// Resumes IIC operation.
	delay(5);						// Wait until stop condtion is in effect.
	
    *pData = cRecvByte;
}

/*********************************************************************************************
* name:		iic_int
* func:		IIC interrupt handler
* para:		none
* ret:		none
* modify:
* comment:		
********************************************************************************************/
void iic_int(void)
{
    rI_ISPC=BIT_IIC;
	f_nGetACK = 1;
}

⌨️ 快捷键说明

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