www.pudn.com > LPT_I2C_ADuC.rar > LPT_I2C_ADuC.c


#include  
#include  
#include  
#include 		 
#include  
#include "LPT_I2C_ADuC.h" 
#include "I2C_DEVICE.h" 
#include "I2C_PROTOCOL.h" 
#include "I2C_LPT.h"  
 
#define MAX_BYTENUMBER 62*1024 		//最多处理62k byte, Limited by ADuC70xxBCPZxxI 
#define MAX_ROWNUMBER MAX_BYTENUMBER/16  	//62k byte 除以 每行16byte 所得的最大行数=3968 
#define MAX_ONEPAGEDATANUMBER 248  	//每页包含的Byte个数 =248 
#define MAX_PAGENUMBER MAX_BYTENUMBER/MAX_ONEPAGEDATANUMBER //62k byte 除以 每页包含的Byte个数 所得的最大页数 =256 
 
 
 
static int panelHandle; 
																	  
unsigned char Value_Array[MAX_BYTENUMBER]; 	//原byte数组,用于文件有多少行就显示多少行在table里的模式 
unsigned char Data_Array[MAX_BYTENUMBER]; 	//byte数组 
unsigned int  Address_Array[MAX_ROWNUMBER];	//每行的首地址 
unsigned int  Addr_Array[MAX_ROWNUMBER];	//每行的首地址 
unsigned int  Page_Array[MAX_PAGENUMBER];	//有效页标志,如果该页包含有效数据,则等于1,否则=0; 
 
int main (int argc, char *argv[]) 
{ 
	if (InitCVIRTE (0, argv, 0) == 0) 
		return -1;	/* out of memory */ 
	if ((panelHandle = LoadPanel (0, "LPT_I2C_ADuC.uir", PANEL)) < 0) 
		return -1; 
	DisplayPanel (panelHandle); 
	RunUserInterface (); 
	DiscardPanel (panelHandle); 
	return 0; 
} 
 
 
int CVICALLBACK on_EXIT (int panel, int control, int event, 
		void *callbackData, int eventData1, int eventData2) 
{ 
	switch (event) 
		{ 
		case EVENT_COMMIT: 
			QuitUserInterface (0); 
			break; 
		} 
	return 0; 
} 
 
int CVICALLBACK on_FILLUPTABLE (int panel, int control, int event, 
		void *callbackData, int eventData1, int eventData2) 
{ 
 int i, ii; 
 
  
	switch (event) 
		{ 
		case EVENT_COMMIT: 
		 
		SetWaitCursor (1); 
			for (i=0; i<16*MAX_ROWNUMBER; i++)  Value_Array[i]=0xff; 
			for (i=0; i>8) + (AAAA & 0xff) + TT; 
					for (i=0; i0) && BeCompatibleWithADuCHEXFormat) 
			{	SetCtrlVal (panel, PANEL_LED_OK_I, 1); 
				strcpy (str, "Success!\n"); 
				SetCtrlVal (panel, PANEL_TEXTBOX, str);  
			} 
			else 
			{	SetCtrlVal (panel, PANEL_LED_OK_I, 0); 
				if (BeCompatibleWithADuCHEXFormat==0)  
				{	strcpy (str, "Error, Maybe the file format is not compatible with ADuC70xx .HEX format!\n"); 
					SetCtrlVal (panel, PANEL_TEXTBOX, str); 
				} 
				//注意如果(BeCompatibleWithADuCHEXFormat==0)那么就不会读文件和分析文件,也就不会出现checksum出错和行数超大的错误 
				else 
				{ 
				if (checksum_error>0)  
				  {	strcpy (str, "Error, found checksum error in file!\n"); 
					SetCtrlVal (panel, PANEL_TEXTBOX, str); 
				  } 
				if (EffectiveRowNumber>MAX_ROWNUMBER)  
				  {	strcpy (str, "Error, Maybe the data in file are more than 62K Bytes!\n"); 
					SetCtrlVal (panel, PANEL_TEXTBOX, str); 
				  } 
				if (EffectiveRowNumber==0)  
				  {	strcpy (str, "Error, Maybe the file contains no data!\n"); 
					SetCtrlVal (panel, PANEL_TEXTBOX, str); 
				  } 
				} //end of else 
				strcpy (str, "Failed!\n"); 
				SetCtrlVal (panel, PANEL_TEXTBOX, str);  
			} 
			 
			//初始化Addr_Array[],强制使之高16bit等于absolute_address高16bit,而低16bit则顺序增加; 
			for (i=0; i0) && (BeCompatibleWithADuCHEXFormat)) 
			{	InsertTableRows (panel, PANEL_TAB_FILE, -1, MAX_ROWNUMBER, VAL_USE_MASTER_CELL_TYPE);  
				SetTableCellRangeVals (panel, PANEL_TAB_FILE, MakeRect (1, 1, MAX_ROWNUMBER, 1), Addr_Array,  VAL_ROW_MAJOR); 
				SetTableCellRangeVals (panel, PANEL_TAB_FILE, MakeRect (1, 2, MAX_ROWNUMBER, 16), Data_Array,  VAL_ROW_MAJOR); 
			} 
			 
			SetWaitCursor (0); 
			break; 
		  } 
		} 
		return 0; 
} 
 
int CVICALLBACK on_CLEAR_TABLE_FILE (int panel, int control, int event, 
		void *callbackData, int eventData1, int eventData2) 
{ 
	switch (event) 
		{ 
		case EVENT_COMMIT: 
			DisableBreakOnLibraryErrors ();  
			DeleteTableRows (panel, PANEL_TAB_FILE, 1, -1); //清table 
			EnableBreakOnLibraryErrors (); 
 
			break; 
		} 
	return 0; 
} 
 
int CVICALLBACK on_NOTEPAD (int panel, int control, int event, 
		void *callbackData, int eventData1, int eventData2) 
{  int error; 
   static int g_exeHandle;   
   char exeFile[MAX_PATHNAME_LEN]; 
   char str[255]="NotePad.exe"; 
   char hexFile[MAX_PATHNAME_LEN], Driver_name[MAX_PATHNAME_LEN], Directory_name[MAX_PATHNAME_LEN], File_name[MAX_PATHNAME_LEN]; 
   int  stat, Driver_number; 
    
	switch (event) 
		{ 
		case EVENT_COMMIT: 
		stat = FileSelectPopup ("", "*.hex", "*.hex", "Select and read the *.hex diskfile", 
								VAL_SELECT_BUTTON, 0, 1, 1, 1, hexFile); 
        if (stat == VAL_EXISTING_FILE_SELECTED) 
		  { 
		    SplitPath (hexFile, Driver_name, Directory_name, File_name); 
        	SetCtrlVal (panel, PANEL_FILE_HEX, hexFile/*File_name*/); 
			 
			strcat (str, " "); 
			strcat (str, hexFile); 
			 
			if (!LaunchExecutableEx (str, LE_SHOWNORMAL, &g_exeHandle)) 
        		; 
       		else 
            	MessagePopup ("ERROR", "Failed to launch executable!"); 
 
			break; 
		  } 
		} 
		return 0; 
} 
 
int CVICALLBACK on_CLEAR_TEXBOX (int panel, int control, int event, 
		void *callbackData, int eventData1, int eventData2) 
{ 
	switch (event) 
		{ 
		case EVENT_COMMIT: 
			ResetTextBox (panel, PANEL_TEXTBOX, ""); 
			SetCtrlVal (panel, PANEL_LED_OK_I, 0); 
			SetCtrlVal (panel, PANEL_LED_OK_II, 0); 
			SetCtrlVal (panel, PANEL_LED_OK_III, 0); 
			SetCtrlVal (panel, PANEL_LED_OK_1, 0); 
			SetCtrlVal (panel, PANEL_LED_OK_2, 0); 
			SetCtrlVal (panel, PANEL_LED_OK_3, 0); 
			SetCtrlVal (panel, PANEL_LED_OK_4, 0); 
			SetCtrlVal (panel, PANEL_LED_OK_5, 0); 
			break; 
		} 
	return 0; 
} 
 
 
//############################################################################################### 
 
int CVICALLBACK on_CHECK_I2CHOST (int panel, int control, int event, 
		void *callbackData, int eventData1, int eventData2) 
{int my_I2C_position; 
 char str[256]; 
  
	switch (event) 
		{ 
		case EVENT_COMMIT: 
			 
			SetCtrlVal (panel, PANEL_LED_OK_II, 0);  
			strcpy (str, "\nII) Check I2C host;\n"); 
			SetCtrlVal (panel, PANEL_TEXTBOX, str);  
 
			on_I2C_CHECK(panel, control, event, callbackData, eventData1, eventData2); 
			my_I2C_position = I2C_position; 
			 
			if (my_I2C_position==-1) 
			{	strcpy (str, "No I2C Host found! please check the system!\n"); 
			 	SetCtrlVal (panel, PANEL_TEXTBOX, str);  
			  	sprintf (str, "Failed!\n"); 
			  	SetCtrlVal (panel, PANEL_TEXTBOX, str);  
				SetCtrlVal (panel, PANEL_LED_OK_II, 0);  
			} 
			if (my_I2C_position==0) 
			{	strcpy (str, "I2C Host found! SDA:!D1/!S5, SCL:!D0;\n"); 
			  	SetCtrlVal (panel, PANEL_TEXTBOX, str);  
			  	sprintf (str, "Success!\n"); 
				SetCtrlVal (panel, PANEL_TEXTBOX, str);  
				SetCtrlVal (panel, PANEL_LED_OK_II, 1);  
			} 
			if (my_I2C_position==1) 
			{	strcpy (str, "I2C Host found! SDA:!D1/S5, SCL:!D0;\n"); 
				SetCtrlVal (panel, PANEL_TEXTBOX, str);  
			  	sprintf (str, "Success!\n"); 
				SetCtrlVal (panel, PANEL_TEXTBOX, str);  
				SetCtrlVal (panel, PANEL_LED_OK_II, 1);  
			} 
			break; 
		} 
	return 0; 
} 
 
 
int CVICALLBACK on_PREERASE (int panel, int control, int event, 
		void *callbackData, int eventData1, int eventData2) 
{int error; 
 char str[256]; 
 unsigned char Firmware_version; 
 
	switch (event) 
		{ 
		case EVENT_COMMIT: 
			SetCtrlVal (panel, PANEL_LED_OK_III, 0);  
			 
			strcpy (str, "\nIII) Pre-erase, B2[95]=1;\n"); 
			SetCtrlVal (panel, PANEL_TEXTBOX, str);  
			 
			error = I2C_FourBYTE_WRITE(0xA0, 124, 0, 1, 2, 3); 
			if (error<0)  
			{	strcpy (str, "NACK error when attempt to write password to A0h[]!\n"); 
			 	SetCtrlVal (panel, PANEL_TEXTBOX, str);  
			  	sprintf (str, "Failed!\n"); 
			  	SetCtrlVal (panel, PANEL_TEXTBOX, str);  
			  	//return -1; 
			} 
			error = I2C_FourBYTE_WRITE(0xA2, 123, 0, 1, 2, 3); 
			if (error<0)  
			{	strcpy (str, "NACK error when attempt to write password to A2h[]!\n"); 
			 	SetCtrlVal (panel, PANEL_TEXTBOX, str);  
			  	sprintf (str, "Failed!\n"); 
			  	SetCtrlVal (panel, PANEL_TEXTBOX, str);  
			  	//return -1; 
			} 
			error=I2C_BYTE_WRITE(0xB2, 95, 1);//set flag to tell MCU to erase page0 
			if (error<0)  
			{	strcpy (str, "NACK error when attempt to write erase-command to B2h[]!\n"); 
			 	SetCtrlVal (panel, PANEL_TEXTBOX, str);  
			  	sprintf (str, "Failed!\n"); 
			  	SetCtrlVal (panel, PANEL_TEXTBOX, str);  
			  	return -1; 
			} 
			 
			sprintf (str, "Success!\n"); 
			SetCtrlVal (panel, PANEL_TEXTBOX, str);  
			strcpy (str, "Please reset the ADuC70xxBCPZxxI before I2C downloading!\n"); 
			SetCtrlVal (panel, PANEL_TEXTBOX, str);  
			SetCtrlVal (panel, PANEL_LED_OK_III, 1);  
			MessagePopup ("Alarm", "Please reset the ADuC70xxBCPZxxI before I2C downloading!"); 
			 
			break; 
		} 
	return 0; 
} 
 
 
int CVICALLBACK on_START (int panel, int control, int event, 
		void *callbackData, int eventData1, int eventData2) 
{unsigned char device_addr, rom_StartAddress=0x04, rom_Length; 
 char rom_value_arr[256], str[256]=""; 
 int error, rom_addr, i; 
  
	switch (event) 
		{ 
		case EVENT_COMMIT: 
			SetCtrlVal (panel, PANEL_LED_OK_1, 0);  
			strcpy (str, "\n1) Start, get ID packet;\n"); 
			SetCtrlVal (panel, PANEL_TEXTBOX, str);  
 
			device_addr=0x04; 
			rom_StartAddress=0x08; 
			rom_Length=24; 
			error = I2C_BYTEs_READ  (device_addr, rom_StartAddress, rom_Length, rom_value_arr);  
			if (error<0) 
			{	strcpy (str, "NACK error when attempt to read ID from 04h[]!\n"); 
				SetCtrlVal (panel, PANEL_TEXTBOX, str);  
				sprintf (str, "Failed!\n"); 
			  	SetCtrlVal (panel, PANEL_TEXTBOX, str);  
				return -1; 
			} 
			 
			for (i=0; i60000) return -9; 
			 
				I2C_START();// START 
 
				I2C_WRITE_DEVICE_ADDR(device_addr,1); //Write device address for reading 
				if (I2C_GET_ACK())//get acknowledge 
					I2C_STOP();//no ACK 
				else 
				{	ACK_702x=I2C_READ_WORD_VALUE(); //get Data Byte of 7020's ACK byte 
					I2C_SET_NONE_ACK(); //set none acknowledge 
					I2C_STOP();//STOP 
					return 0; 
				} 
			} 
			 
			 
			return 0;  
} 
 
int CVICALLBACK on_ERASE (int panel, int control, int event, 
		void *callbackData, int eventData1, int eventData2) 
{ char str[256]=""; 
  int i, ACK_702x; 
  double t; 
   
	switch (event) 
		{ 
		case EVENT_COMMIT: 
			SetWaitCursor (1); 
			SetCtrlVal (panel, PANEL_LED_OK_2, 0);  
			strcpy (str, "\n2) Erase, mass erase;\n"); 
			SetCtrlVal (panel, PANEL_TEXTBOX, str);  
			strcpy (str, "Please wait for several senconds...\n"); 
			SetCtrlVal (panel, PANEL_TEXTBOX, str);  
		   
				 
  			t = Timer (); 
			ACK_702x = my_ERASE(); 
			t = Timer () - t; 
			if (ACK_702x == 0)//702x acknowledged, erase done 
			  {	sprintf (str, "Time expended %0.1f second.\n", t);  
				SetCtrlVal (panel, PANEL_TEXTBOX, str);  
 				sprintf (str, "Success!\n");  
				SetCtrlVal (panel, PANEL_TEXTBOX, str);  
				SetCtrlVal (panel, PANEL_LED_OK_2, 1);  
			  } 
			else //702x not acknowledged, erase failed 
			  {	sprintf (str, "I2C NACK, error code=%d.\n", ACK_702x); 
			  	SetCtrlVal (panel, PANEL_TEXTBOX, str);  
			  	sprintf (str, "Failed!\n"); 
			  	SetCtrlVal (panel, PANEL_TEXTBOX, str);  
				SetCtrlVal (panel, PANEL_LED_OK_2, 0);  
			  } 
 
			SetWaitCursor (0); 
 
			break; 
		} 
	return 0; 
} 
 
int my_RUN() 
{unsigned char device_addr, rom_StartAddress, rom_Length; 
 unsigned char rom_value_arr[256]; 
 unsigned char ACK_702x; 
 int error, rom_addr, i; 
 unsigned char Start_ID[2], NoOfDataBytes, Data[256], Checksum; 
 int ackerror=0;//equal to 0 means i2c operation normally 
 double T_wait=0.1; //Twr=100ms  
 
 			for (i=0; i<256; i++) Data[i]=0; 
 
			device_addr = 0x04; 
			Start_ID[0] = 0x07; 
			Start_ID[1] = 0x0E; 
			NoOfDataBytes = 0x05; 
			Data[1] = 'R';  //CMD: "E" 
			Data[2] = 0x00; //Address: h 
			Data[3] = 0x08; //Address: u 
			Data[4] = 0x00; //Address: m 
			Data[5] = 0x01; //Address: l  
			//a RUN from address 0x80001 will run code after performing a software reset,  
			//setting back all register to their default value. 
			Checksum = NoOfDataBytes; 
			for (i=1; i<=NoOfDataBytes; i++) Checksum+=Data[i]; 
			Checksum = 0x00 - Checksum; 
			 
			 
			I2C_START();// START 
 
			I2C_WRITE_DEVICE_ADDR(device_addr,0); //Write device address for writing 
			if (I2C_GET_ACK()) { I2C_STOP(); return -1; }//get acknowledge  
 
			I2C_WRITE_WORD_VALUE(Start_ID[0]);//write the first Start_ID 
			if (I2C_GET_ACK()) { I2C_STOP(); return -2; }//get acknowledge  
 
			I2C_WRITE_WORD_VALUE(Start_ID[1]);//write the sencond Start_ID 
			if (I2C_GET_ACK()) { I2C_STOP(); return -3; }//get acknowledge  
 
			I2C_WRITE_WORD_VALUE(NoOfDataBytes);//write the No. of Data Bytes 
			if (I2C_GET_ACK()) { I2C_STOP(); return -4; }//get acknowledge  
 
			for (i=1; i<=NoOfDataBytes; i++) 
			{ 
			I2C_WRITE_WORD_VALUE(Data[i]);//write the Data x 
			if (I2C_GET_ACK()) { I2C_STOP(); return -5; }//get acknowledge  
			} 
 
			I2C_WRITE_WORD_VALUE(Checksum);//write the checksum 
			if (I2C_GET_ACK()) { I2C_STOP(); return -6; }//get acknowledge  
		   
			I2C_STOP(); //STOP  
 
			Delay(T_wait); // waiting for EEPROM(ADuC7020) internal data written. 
			 
 
			I2C_START();// START 
 
			I2C_WRITE_DEVICE_ADDR(device_addr,1); //Write device address for reading 
			//the experiment has proved, after excuting the upper command,  
			//the user code runs, so it's no need to get ACK any longer 
			if (I2C_GET_ACK()) { I2C_STOP(); return -7; }//get acknowledge  
			I2C_STOP();//no ACK 
			 
			 
			return 0;  
} 
 
int CVICALLBACK on_RUN (int panel, int control, int event, 
		void *callbackData, int eventData1, int eventData2) 
{char str[256]="";  
 int i, ACK_702x; 
 
	switch (event) 
		{ 
		case EVENT_COMMIT: 
			SetCtrlVal (panel, PANEL_LED_OK_5, 0);  
			strcpy (str, "\n5)  Run, jump to user code;\n"); 
			SetCtrlVal (panel, PANEL_TEXTBOX, str);  
 
			ACK_702x = my_RUN(); 
 
			if (ACK_702x == 0)//702x acknowledged, erase done 
			  {	sprintf (str, "Success!\n");  
				SetCtrlVal (panel, PANEL_TEXTBOX, str);  
				SetCtrlVal (panel, PANEL_LED_OK_5, 1);  
			  } 
			else //702x not acknowledged, erase failed 
			  {	sprintf (str, "Failed!\n"); 
			  	SetCtrlVal (panel, PANEL_TEXTBOX, str);  
 				SetCtrlVal (panel, PANEL_LED_OK_5, 0);  
			  } 
			 
			break; 
		} 
	return 0; 
} 
 
int my_OnePage_WRITEorVERIFY(unsigned char WRITEorVERIFY, int CurrentPageNumner) //WRITEorVERIFY=1时表示当前按下的键是“Verify Flash”键  
{unsigned char device_addr; 
 unsigned char Start_ID[2], NoOfDataBytes, Data[256]={0}, Checksum; 
 int error, rom_addr, i; 
 int CurrentDataNumber;  
 double T_wait=0.0; //无需等待 
 unsigned char ACK_702x; 
  
if (Page_Array[CurrentPageNumner]==1) //当该页的有效标志为1才写 
		  {  
		    device_addr = 0x04; 
			Start_ID[0] = 0x07; 
			Start_ID[1] = 0x0E; 
			NoOfDataBytes = MAX_ONEPAGEDATANUMBER + 5;//每页248个数据,加上CMD和地址有5个byte 
			 
				if (WRITEorVERIFY==0)//当前按下的键是“Write Flash”键; 
					Data[1] = 'W';  //CMD: "W" 
				else				 //当前按下的键是“Verify Flash”键;数据8bit分高3低5bit倒序 
					Data[1] = 'V';  //CMD: "V" 
			Data[2] = 0x00; //Address: h 
			Data[3] = 0x00; //Address: u 
			Data[4] = (CurrentPageNumner * MAX_ONEPAGEDATANUMBER) / 256; //Address: m 
			Data[5] = (CurrentPageNumner * MAX_ONEPAGEDATANUMBER) % 256; //Address: l 
			for (i=0; i> 5); 
			} 
			Checksum = NoOfDataBytes; 
			for (i=1; i<=NoOfDataBytes; i++) Checksum+=Data[i]; 
			Checksum = 0x00 - Checksum; 
  
 
			I2C_START();// START 
 
			I2C_WRITE_DEVICE_ADDR(device_addr,0); //Write device address for writing 
			if (I2C_GET_ACK()) { I2C_STOP(); return -1; }//get acknowledge  
 
			I2C_WRITE_WORD_VALUE(Start_ID[0]);//write the first Start_ID 
			if (I2C_GET_ACK()) { I2C_STOP(); return -2; }//get acknowledge  
 
			I2C_WRITE_WORD_VALUE(Start_ID[1]);//write the sencond Start_ID 
			if (I2C_GET_ACK()) { I2C_STOP(); return -3; }//get acknowledge  
 
			I2C_WRITE_WORD_VALUE(NoOfDataBytes);//write the No. of Data Bytes 
			if (I2C_GET_ACK()) { I2C_STOP(); return -4; }//get acknowledge  
 
			for (i=1; i<=NoOfDataBytes; i++) 
			{   I2C_WRITE_WORD_VALUE(Data[i]);//write the Data x 
				if (I2C_GET_ACK()) { I2C_STOP(); return -5; }//get acknowledge  
			} 
 
			I2C_WRITE_WORD_VALUE(Checksum);//write the checksum 
			if (I2C_GET_ACK()) { I2C_STOP(); return -6; }//get acknowledge  
		   
			I2C_STOP(); //STOP  
 
			Delay(T_wait); // waiting for EEPROM(ADuC7020) internal data written. 
  
  
        //对702x返回的0x06的响应必需读回,不然下一次写不进。 
			I2C_START();// START 
 
			I2C_WRITE_DEVICE_ADDR(device_addr,1); //Write device address for reading 
			if (I2C_GET_ACK()) { I2C_STOP(); return -7; }//get acknowledge 
			 
			ACK_702x=I2C_READ_WORD_VALUE(); //get Data Byte of 7020's ACK byte 
			if (ACK_702x != 0x06) { I2C_STOP(); return -8; }//get acknowledge 
			I2C_SET_NONE_ACK(); //set none acknowledge 
			 
			I2C_STOP();//STOP 
		  }//end of "if (Page_Array[CurrentPageNumner]==1)"	 
	  return 0; 
} 
 
 
int my_WRITEorVERIFY(unsigned char WRITEorVERIFY) //WRITEorVERIFY=1时表示当前按下的键是“Verify Flash”键 
{int CurrentPageNumner, CurrentDataNumber; 
 unsigned char device_addr, rom_StartAddress, rom_Length; 
 unsigned char rom_value_arr[256]; 
 unsigned char ACK_702x; 
 int error, rom_addr, i; 
 unsigned char Start_ID[2], NoOfDataBytes, Data[256], Checksum; 
 int ackerror=0;//equal to 0 means i2c operation normally 
 double T_wait=0.0; //无需等待  
 char str[256]="";  
  
		//分析有效页标志,如果该页包含有效数据,则等于1,否则=0; 注意一页有248个数据 
		for (i=0; i