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; i 0) && 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; i 0) && (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; i 60000) 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