📄 iic_test.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 + -