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

📄 iic_test.c

📁 ARM开发代码以及bootloader的初始化程序参考
💻 C
字号:
/*************************************************************************/
/*                                                                       */
/* FILE NAME                                      VERSION                */
/*                                                                       */
/*      iic.c                      KS32C5000, KS32C50100   : version 1.0 */
/*                                                                       */
/* COMPONENT                                                             */
/*                                                                       */
/*                                                                       */
/* DESCRIPTION                                                           */
/*                                                                       */
/* FUNCTIONS                                                             */
/*                                                                       */
/*                                                                       */
/* DEPENDENCIES                                                          */
/*                                                                       */
/*                                                                       */
/* HISTORY                                                               */
/*                                                                       */
/*         NAME            DATE                    REMARKS               */
/*                                                                       */
/*      jwCHOI/hbahn    09-15-1998      Created initial version 1.0      */
/*        in4maker      12-18-1998      Some functions added & updated   */
/*        in4maker      05-10-1999      Fully updated                    */
/*************************************************************************/
#include <stdarg.h>
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include "std.h"
//#include "apdialog.h"
//#include "snds.h"
#include "uart.h"
#include "isr.h"
//#include "pollio.h"
#include "iic.h"
//#include "memory.h"
#include "sysconf.h"
#include "s3c4510.h"

#define   MAX_LINE_BUF     250

void RTCSet(void);
void RTCGet(void);
/******************************************************************
 *                                                                *
 *           IIC Test using IIC 64Kbit Serial EEPROM              *
 *                                                                *
 ******************************************************************/
void IICTest(void) 
{
	char TestItemSel ;

	IicSetup() ;// Initialize IIC control block
	Enable_Int(nGLOBAL_INT); //enable global interrupt mask

	do {
	     Print("\r\n") ;
	     Print("        IIC Test Items \r\n") ;
	     Print("+-----------------------------------+\r\n") ;
	     Print("1. IIC Page Write Test(INT)      - [W]\r\n") ;
	     Print("2. IIC Sequential Read Test(INT) - [R]\r\n") ;
	     Print("3. IIC Read/Write Test(INT.)     - [L]\r\n") ;
	     Print("4. IIC Loopback test(INT)        - [B]\r\n") ;
	     Print("5. IIC configuration view        - [C]\r\n") ;
	     Print("6. Quit IIC Test                 - [Q]\r\n") ;
	     Print("7. RTC Set Time                  - [S]\r\n") ;
	     Print("8. RTC Get Time                  - [G]\r\n") ;
	     Print("+-----------------------------------+\r\n") ;
	     
	     Print("\r\nSelect Test Item : ") ;
	     TestItemSel = get_byte() ;
	     printf("\r\nYou Select Item --- %c  \r\n", TestItemSel ) ;

	     switch(TestItemSel)
	     {
		case 'W' : case 'w' : IICWriteTest() ; break ;
		case 'R' : case 'r' : IICReadTest() ; break ;
		case 'L' : case 'l' : IICAutoTest() ; break ;
		case 'B' : case 'b' : IICLoopBackTest() ; break ;
		case 'C' : case 'c' : config_iic() ; break ;
		case 'Q' : case 'q' : break ;
		case 'S' : case 's' : RTCSet(); break;
		case 'G' : case 'g' : RTCGet(); break;
		default : break ;
	     }
	//     Print("\r\n Press Any Key to Continue IIC Test") ; 
	//     get_byte() ;

	} while  ( (TestItemSel != 'Q') && (TestItemSel != 'q') ) ;
}



/******************************************************************
 *                                                                *
 *              IIC EEPROM READ & WRITE TEST MODULE               *
 *                                                                *
 ******************************************************************/

/* IIC Write Test Program */
void IICWriteTest(void)
{
	U8 TestData[StorageSize] ;
	U32 i, GetDataSize=0 ;
	U32 ByteAddr;

        Print("\r\nEnter Byte write address of IIC EEPROM.");
        Print("\r\n=>[0x%x]: ",(int)StorageSize);
        ByteAddr = gethex2dec(4); get_byte();

	Print("\r\nInput Write Character.");
	Print("\r\n=>(upto %dbytes): ",(int)StorageSize) ;
	while ((TestData[GetDataSize] = get_byte()) != CR ) GetDataSize++ ;

	Print("%d bytes received : ", GetDataSize);
	for (i=0;i<GetDataSize;i++) put_byte(TestData[i]) ;

	IICWriteInt((U8)IIC_DEV_0,(U32)ByteAddr,TestData,GetDataSize);
	Print("\r\nIIC Serial EEPROM write done.\r\n");
}


/* IIC Read Test Program */
void IICReadTest(void)
{
	U8 *DataBuff;
	U32 ReadDataSize ;
	int i,p;
	U32 ByteAddr;

        Print("\r\nEnter Byte write address of IIC EEPROM.");
        Print("\r\n=>[0x%x]: ",(int)StorageSize);
        ByteAddr = gethex2dec(4); get_byte();

	Print("\r\n >>> Input Read Data Size : ") ;
	ReadDataSize = get_digit() ;

	Print("\r\n\r\n  <<< READ DATA FROM IIC SERIAL EEPROM >>>\r\n\r\n") ;
        DataBuff=(U8 *)IICReadInt((U8)IIC_DEV_0,(U32)ByteAddr,ReadDataSize);

	for (i=0,p=0;i<ReadDataSize;i++) 
	{
	        if(!(i%SizeOfPage)) Print("\r\n[%d]0x%x: ",p++,ByteAddr);
	        put_byte(*DataBuff++); 
	        ByteAddr++;
        } 
}



/* IIC Read/Write Test Program by interrupt method */
void IICAutoTest(void)
{

	U8 *DataBuff;
	U8 TestData[] = "IIC Read/Write Test Pattern. ";
	U8 TempData ;
	U32 i, TestSize, TestLoop ;

	TestLoop = TestSize = sizeof(TestData) ;
	Print("IIC Test =>IICAutoTest");

	while(TestLoop--) {

	     Print("\r\n $$ ") ;

	     /* Write IIC test pattern to Serial EEPROM */
	     IICWriteInt((U8)IIC_DEV_0,(U32)IICTestAddr,TestData,TestSize);
	     for (i=0;i<(int)Write_Cycle_ms(5);i++); /* 5ms write cycle */
        
	     /* Read IIC test pattern to Serial EEPROM */
             DataBuff=(U8 *)IICReadInt((U8)IIC_DEV_0,(U32)IICTestAddr,TestSize);
	     for (i=0;i<(int)Write_Cycle_ms(5);i++); /* 5ms write cycle */
	     for (i=0;i<TestSize;i++) put_byte(*DataBuff++) ;

	     /* Next Test Pattern Generation */
	     TempData = TestData[TestSize] ;
	     TestData[TestSize] = TestData[0] ;
	     for (i=0;i<TestSize;i++) TestData[i] = TestData[i+1] ;

	} // End of while loop
}


/* IIC Loopback Test  */
int IICLoopBackTest(void)
{
	U8 *DataBuff;
	U8 *TestData, *TempData;
	int i;
	int TestFlag = 1;


	Print("\r\n\r\n$IIC R&W Test with IIC EEPROM(%dKByte).\r\n",IICTestSize/1024);

        /* Memory allocation for IIC test pattern */
//        if((TestData = (U8 *)malloc((unsigned)IICTestSize)) == (U8 *)(NULL))
//             Print("\r\nMemory allocation error occurred!!!\r\n");
	TestData = (U8 *) 0x4000;
	
        /* To generate IIC test pattern */
	//Print("\r\n=> Generating R,W pattern data(%dBytes).",IICTestSize);
        TempData = TestData; /* copy test pattern data memory */
//        for(i=0; i < IICTestSize; i++) *TempData++ = (U8)PatternGen(i);
        for(i=0; i < IICTestSize; i++) *TempData++ = (U8)(i);
        
	/* Write IIC test pattern to Serial EEPROM */
	Print("\r\n=> Writing data.....");
	IICWriteInt((U8)IIC_DEV_0,(U32)IICTestAddr,TestData,IICTestSize);
	for (i=0;i<(int)Write_Cycle_ms(5);i++); /* 5ms write cycle */

	/* Read IIC test pattern from Serial EEPROM */
	Print("\r\n=> Reading data....");
        DataBuff=(U8 *)IICReadInt((U8)IIC_DEV_0,(U32)IICTestAddr,IICTestSize);
	for (i=0;i<(int)Write_Cycle_ms(5);i++); /* 5ms write cycle */

	/* Compare the read/write test pattern */ 

        TempData = TestData; /* copy test pattern data memory */
	Print("\r\n=> Comparing data....");
	for (i=0;i<IICTestSize-1;i++) 
	{
             if (*TempData++ != *DataBuff++) {
		 Print("\r\n[ERROR] 0x%x : W=%d:R=%d\r\n",i,*TempData-1,*DataBuff-1); 
		 TestFlag = 0; /* Indicate error occurred */
             }
             PrtIICStatus(i);
             
	} // End of while loop
        Print("Ok\r\n");
//        free(TestData);     /* Return allocated memory to user memory */
	return(TestFlag);
}


void PrtIICStatus(int byte)
{
//     char buff[MAX_LINE_BUF];
//     int  i;
    
     //sprintf(buff,"=> R&W pattern compare : %dbyte",byte); 
     //put_string(buff); /* to console */
     //for(i=0;i < sizeof(buff);i++)  put_byte('\b'); 
     IOPDATA = ~(1<<(byte%4));  /* to LED */
}



void config_iic(void)
{
       Print("\r\n<< IIC BUS Special Registers. >>\r\n\r\n");
       Print("IICCON   = 0x%x \r\n", IICCON);
       Print("IICBUF   = 0x%x \r\n", IICBUF);
       Print("IICPS    = 0x%x \r\n", IICPS);
       Print("IICCOUNT = 0x%x \r\n", IICCOUNT);
}

char lcd_str[40];
U32  previous_sec = 0;	// any value that != sec will ok!

// data = sec, min, hour, day, week, month, year }
U8  data[16]={ 7, 7, 7, 7, 7, 7, 7, 7 };

U8 year=0x05, month=0x01, day=0x10, hour=0x08, min=0x30, sec=0x30, con_reg=0x20;

void RTCSet(void)
{
	char TestItemSel ;	
		
	RTCGet();
	
	do {
	     Print("\r\n") ;
	     Print("        RTC Config Items \r\n") ;
	     Print("+-----------------------------------+\r\n") ;
	     Print("1. add/sub year            -- press Y/y \r\n") ;
	     Print("2. add/sub month           -- press M/m \r\n") ;
	     Print("3. add/sub day             -- press D/d \r\n") ;
	     Print("4. add/sub hour            -- press H/h \r\n") ;
	     Print("5. add/sub minute          -- press I/i \r\n") ;
	     Print("6. add/sub second (N/A)    -- press S/s \r\n") ;
	     Print("7. quit configuration      -- press Q/q \r\n") ;
	     Print("+-----------------------------------+\r\n") ;
		
	     Print("\r\nSelect Test Item : ") ;
	     TestItemSel = get_byte() ;
	     printf("\r\nYou Select Item --- %c  \r\n", TestItemSel ) ;

	     switch(TestItemSel)
	     {
		case 'Y' : year++;    break;		
		case 'y' : year--;    break;	
		case 'M' : month++;   break;	
		case 'm' : month--;   break;	
		case 'D' : day++;     break;	
		case 'd' : day--;     break;	
		case 'H' : hour++;    break;	
		case 'h' : hour--;    break;	
		case 'I' : min++;  break;	
		case 'i' : min--;  break;	
		case 'S' : sec++;  break;	
		case 's' : sec--;  break;				
		default : break ;
	     }
	     	sprintf( lcd_str, "%02x-%01x-%02x %02x:%02x:%02x", year, month, day, hour, min, sec );     
      		printf( "\r\nYou have set current RTC : %s \r\n", lcd_str );
      		
	//	con_reg = 0xff;	
	//	IICWriteInt((U8)0xa2,(U32)0x01, &con_reg, 1);
	//	IICWriteInt((U8)0xa2,(U32)0x02, &sec, 1);
		IICWriteInt((U8)0xa2,(U32)0x03, &min, 1);
		IICWriteInt((U8)0xa2,(U32)0x04, &hour, 1);
		IICWriteInt((U8)0xa2,(U32)0x05, &day, 1);
		IICWriteInt((U8)0xa2,(U32)0x07, &month, 1);
		IICWriteInt((U8)0xa2,(U32)0x08, &year, 1);	
	//	con_reg = 0x0;				
	//	IICWriteInt((U8)0xa2,(U32)0x01, &con_reg, 1);
		
	} while  ( (TestItemSel != 'Q') && (TestItemSel != 'q') ) ;
	
}

void RTCGet(void)
{
	U8 *DataBuff;
	U32 ReadDataSize ;
	U32 ByteAddr;
	U32 year, month, day, hour, min, sec;
	
	ByteAddr = 0x01;
	ReadDataSize = 16;
	
//	Print("\r\nIICWriteInt. (U8)0xa2,(U32)0x02, \r\n");
	IICWriteInt((U8)0xa2,(U32)ByteAddr, NULL,0);
	
//	Print("\r\n\r\n  <<< Read from RTC >>>\r\n\r\n") ;
	DataBuff=(U8 *)IICReadInt((U8)0xa3,(U32)ByteAddr,ReadDataSize);
	
	sec = *(DataBuff) & 0x7f;
	min = *(DataBuff+1) & 0x7f;
	hour = *(DataBuff+2) & 0x3f;
	day = *(DataBuff+3) & 0x3f;
	month = *(DataBuff+5) & 0x0f;
	year = *(DataBuff+6) & 0xff;
	
      	sprintf( lcd_str, "%02x-%02x-%02x %02x:%02x:%02x", year, month, day, hour, min, sec );

        printf( "\r\nGet current RTC time : %s \r\n", lcd_str );
      
        return;
}

⌨️ 快捷键说明

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