📄 maindemo.c
字号:
#endif
#if defined(MPFS_USE_EEPROM)
// Enable ADC interrupt //TODO for MASTERS
PIR1bits.ADIF = 0;
PIE1bits.ADIE = 1;
#endif
#endif
#if defined(DSPICDEM11)
// Deselect the LCD controller (PIC18F252 onboard) to ensure there is no SPI2 contention
LCDCTRL_CS_TRIS = 0;
LCDCTRL_CS_IO = 1;
// Hold the codec in reset to ensure there is no SPI2 contention
CODEC_RST_TRIS = 0;
CODEC_RST_IO = 0;
#endif
}
/*********************************************************************
* Function: void InitAppConfig(void)
*
* PreCondition: MPFSInit() is already called.
*
* Input: None
*
* Output: Write/Read non-volatile config variables.
*
* Side Effects: None
*
* Overview: None
*
* Note: None
********************************************************************/
static void InitAppConfig(void)
{
#if defined(MPFS_USE_EEPROM)
BYTE c;
BYTE *p;
#endif
#if defined(STACK_USE_DHCP) || defined(STACK_USE_IP_GLEANING)
AppConfig.Flags.bIsDHCPEnabled = TRUE;
#else
AppConfig.Flags.bIsDHCPEnabled = FALSE;
#endif
#if defined(MPFS_USE_EEPROM)
p = (BYTE*)&AppConfig;
XEEBeginRead(EEPROM_CONTROL, 0x00);
c = XEERead();
XEEEndRead();
/*
* When a record is saved, first byte is written as 0x55 to indicate
* that a valid record was saved.
*/
if ( c == 0x55 )
{
XEEBeginRead(EEPROM_CONTROL, 0x01);
for ( c = 0; c < sizeof(AppConfig); c++ )
*p++ = XEERead();
XEEEndRead();
}
else
SaveAppConfig();
#endif
}
#if defined(MPFS_USE_EEPROM)
static void SaveAppConfig(void)
{
BYTE c;
BYTE *p;
p = (BYTE*)&AppConfig;
XEEBeginWrite(EEPROM_CONTROL, 0x00);
XEEWrite(0x55);
for ( c = 0; c < sizeof(AppConfig); c++ )
{
XEEWrite(*p++);
}
XEEEndWrite();
}
#endif
ROM char menu[] =
"\r\n\r\n\rMicrochip TCP/IP Config Application ("VERSION", " __DATE__ ")\r\n\r\n"
"\t1: Change Board serial number.\r\n"
"\t2: Change default IP address.\r\n"
"\t3: Change default gateway address.\r\n"
"\t4: Change default subnet mask.\r\n"
"\t5: Enable DHCP & IP Gleaning.\r\n"
"\t6: Disable DHCP & IP Gleaning.\r\n"
"\t7: Download MPFS image.\r\n"
"\t8: Save & Quit.\r\n"
"\r\n"
"Enter a menu choice (1-8): ";
typedef enum _MENU_CMD
{
MENU_CMD_SERIAL_NUMBER = '1',
MENU_CMD_IP_ADDRESS,
MENU_CMD_GATEWAY_ADDRESS,
MENU_CMD_SUBNET_MASK,
MENU_CMD_ENABLE_AUTO_CONFIG,
MENU_CMD_DISABLE_AUTO_CONFIG,
MENU_CMD_DOWNLOAD_MPFS,
MENU_CMD_QUIT,
MENU_CMD_INVALID
} MENU_CMD;
ROM char * const menuCommandPrompt[] =
{
"\r\nSerial Number (",
"\r\nDefault IP Address (",
"\r\nDefault Gateway Address (",
"\r\nDefault Subnet Mask (",
"\r\nDHCP & IP Gleaning enabled.\r\n",
"\r\nDHCP & IP Gleaning disabled.\r\n",
"\r\nReady to download MPFS image - Use Xmodem protocol.\r\n",
"\r\nNow running application...\r\n"
};
ROM char InvalidInputMsg[] = "\r\nInvalid input received - Input ignored.\r\n"
"Press any key to continue...\r\n";
BOOL StringToIPAddress(char *str, IP_ADDR *buffer)
{
BYTE v;
char *temp;
BYTE byteIndex;
temp = str;
byteIndex = 0;
while( v = *str )
{
if ( v == '.' )
{
*str++ = '\0';
buffer->v[byteIndex++] = atoi(temp);
temp = str;
}
else if ( v < '0' || v > '9' )
return FALSE;
str++;
}
buffer->v[byteIndex] = atoi(temp);
return (byteIndex == 3);
}
MENU_CMD GetMenuChoice(void)
{
BYTE c;
while(!DataRdyUART());
c = ReadUART();
if ( c >= '1' && c < MENU_CMD_INVALID )
return c;
else
return MENU_CMD_INVALID;
}
#define MAX_USER_RESPONSE_LEN (20)
void ExecuteMenuChoice(MENU_CMD choice)
{
char response[MAX_USER_RESPONSE_LEN];
IP_ADDR tempIPValue;
IP_ADDR *destIPValue;
putrsUART(CRLF);
putrsUART(menuCommandPrompt[choice-'0'-1]);
switch(choice)
{
case MENU_CMD_SERIAL_NUMBER:
itoa(AppConfig.SerialNumber.Val, response);
putsUART(response);
while(BusyUART());
WriteUART((')'));
while(BusyUART());
WriteUART(':');
while(BusyUART());
WriteUART(' ');
if(ReadStringUART(response, sizeof(response)))
{
AppConfig.SerialNumber.Val = atoi(response);
AppConfig.MyMACAddr.v[4] = AppConfig.SerialNumber.v[1];
AppConfig.MyMACAddr.v[5] = AppConfig.SerialNumber.v[0];
}
break;
case MENU_CMD_IP_ADDRESS:
destIPValue = &AppConfig.MyIPAddr;
goto ReadIPConfig;
case MENU_CMD_GATEWAY_ADDRESS:
destIPValue = &AppConfig.MyGateway;
goto ReadIPConfig;
case MENU_CMD_SUBNET_MASK:
destIPValue = &AppConfig.MyMask;
ReadIPConfig:
DisplayIPValue(destIPValue);
while(BusyUART());
WriteUART((')'));
while(BusyUART());
WriteUART(':');
while(BusyUART());
WriteUART(' ');
ReadStringUART(response, sizeof(response));
if ( !StringToIPAddress(response, &tempIPValue) )
{
putrsUART(InvalidInputMsg);
while(!DataRdyUART());
ReadUART();
}
else
{
destIPValue->Val = tempIPValue.Val;
}
break;
case MENU_CMD_ENABLE_AUTO_CONFIG:
AppConfig.Flags.bIsDHCPEnabled = TRUE;
break;
case MENU_CMD_DISABLE_AUTO_CONFIG:
AppConfig.Flags.bIsDHCPEnabled = FALSE;
break;
case MENU_CMD_DOWNLOAD_MPFS:
#if defined(MPFS_USE_EEPROM)
DownloadMPFS();
#endif
break;
case MENU_CMD_QUIT:
#if defined(MPFS_USE_EEPROM)
SaveAppConfig();
#endif
break;
}
}
static void SetConfig(void)
{
MENU_CMD choice;
do
{
putrsUART(menu);
choice = GetMenuChoice();
if ( choice != MENU_CMD_INVALID )
ExecuteMenuChoice(choice);
} while(choice != MENU_CMD_QUIT);
}
#if defined(MPFS_USE_EEPROM)
/*********************************************************************
* Function: BOOL DownloadMPFS(void)
*
* PreCondition: MPFSInit() is already called.
*
* Input: None
*
* Output: TRUE if successful
* FALSE otherwise
*
* Side Effects: This function uses 128 bytes of Bank 4 using
* indirect pointer. This requires that no part of
* code is using this block during or before calling
* this function. Once this function is done,
* that block of memory is available for general use.
*
* Overview: This function implements XMODEM protocol to
* be able to receive a binary file from PC
* applications such as HyperTerminal.
*
* Note: In current version, this function does not
* implement user interface to set IP address and
* other informations. User should create their
* own interface to allow user to modify IP
* information.
* Also, this version implements simple user
* action to start file transfer. User may
* evaulate its own requirement and implement
* appropriate start action.
*
********************************************************************/
#define XMODEM_SOH 0x01
#define XMODEM_EOT 0x04
#define XMODEM_ACK 0x06
#define XMODEM_NAK 0x15
#define XMODEM_CAN 0x18
#define XMODEM_BLOCK_LEN 128
static BOOL DownloadMPFS(void)
{
enum SM_MPFS
{
SM_MPFS_SOH,
SM_MPFS_BLOCK,
SM_MPFS_BLOCK_CMP,
SM_MPFS_DATA,
} state;
BYTE c;
MPFS handle;
BOOL lbDone;
BYTE blockLen;
BYTE lResult;
BYTE tempData[XMODEM_BLOCK_LEN];
TICK lastTick;
TICK currentTick;
state = SM_MPFS_SOH;
lbDone = FALSE;
handle = MPFSFormat();
// Notify the host that we are ready to receive...
lastTick = TickGet();
do
{
currentTick = TickGet();
if ( TickGetDiff(currentTick, lastTick) >= (TICK_SECOND/2) )
{
lastTick = TickGet();
while(BusyUART());
WriteUART(XMODEM_NAK);
/*
* Blink LED to indicate that we are waiting for
* host to send the file.
*/
LED7_IO ^= 1;
}
} while(!DataRdyUART());
while(!lbDone)
{
if(DataRdyUART())
{
// Toggle LED as we receive the data from host.
LED7_IO ^= 1;
c = ReadUART();
}
else
{
// Real application should put some timeout to make sure
// that we do not wait forever.
continue;
}
switch(state)
{
default:
if ( c == XMODEM_SOH )
{
state = SM_MPFS_BLOCK;
}
else if ( c == XMODEM_EOT )
{
// Turn off LED when we are done.
LED7_IO = 1;
MPFSClose();
while(BusyUART());
WriteUART(XMODEM_ACK);
lbDone = TRUE;
}
else
{
while(BusyUART());
WriteUART(XMODEM_NAK);
}
break;
case SM_MPFS_BLOCK:
// We do not use block information.
lResult = XMODEM_ACK;
blockLen = 0;
state = SM_MPFS_BLOCK_CMP;
break;
case SM_MPFS_BLOCK_CMP:
// We do not use 1's comp. block value.
state = SM_MPFS_DATA;
break;
case SM_MPFS_DATA:
// Buffer block data until it is over.
tempData[blockLen++] = c;
if ( blockLen > XMODEM_BLOCK_LEN )
{
// We have one block data. Write it to EEPROM.
MPFSPutBegin(handle);
lResult = XMODEM_ACK;
for ( c = 0; c < XMODEM_BLOCK_LEN; c++ )
MPFSPut(tempData[c]);
handle = MPFSPutEnd();
while(BusyUART());
WriteUART(lResult);
state = SM_MPFS_SOH;
}
break;
}
}
// This small wait is required if SLIP is in use.
// If this is not used, PC might misinterpret SLIP
// module communication and never close file transfer
// dialog box.
#if defined(STACK_USE_SLIP)
{
BYTE i = 255;
while(i--);
}
#endif
return TRUE;
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -