FLASH.H
#ifndef _FLASH_H #define _FLASH_H //#include "../rs232/rs_232.h" #define largoMAC 6 //byte #define largoID 19 //words #define largoIP 4 //byte #define largoMasc 4 //byte #define largoE 4 //byte #define largoTot 37 // = largoMAC + largoID +largoIP + largoMasc + largoE // Function prototypes int actualizarFlash(unsigned char tipo); void write_SegA(unsigned char *mac, unsigned char *id, unsigned char *ip, unsigned char *masc, unsigned char *enlace); void read_SegA(char offset, unsigned short largoCampo, unsigned char *campo); //void leerCOM1(unsigned char *campo, unsigned short cuenta, unsigned short offset); unsigned char leerIP(unsigned short octeto); #endif /* _FLASH_H */
FLASHWRITE02.C
/** OJO CON EL RELOJ, ESTE PROGRAMA FUNCIONA CON MCLK ENTRE 550KHz Y 900KHz.
* SUPUESTAMENTE DCO POR DEFECTO ESTA FUNCIONANDO con un reloj en este rango de frecuencia.
*/
#include <msp430x16x.h>
#include <stdio.h>
#include "flash.h"
char *Flash_ptr; // Puntero Flash
/**
* \brief Función que actualiza un campo guardado (quemado) en la Flash.
* \param tipo Inidica el tipo de campo a modificar.
* \return Retorna 0 si actualiza. De lo contrario, otro valor.
*/
/*int actualizarFlash(unsigned char tipo)*/
void main (void)
{
unsigned char MAC[largoMAC] = {0x01,0xbd,0x3b,0x33,0x05,0x71};//0};
unsigned char ID[largoID] = {"PME010709VCMEMH0001"};//0};
unsigned char IP[largoIP] = {0xAC,0x10,0x10,0x50}; //0}; //172.16.16.80
unsigned char MASCARA[largoMasc] = {0xFF,0xFF,0xFF,0x80};//0}; //255.255.255.128
unsigned char ENLACE[largoE] = {0xAC,0x10,0x10,0x01};//0};
unsigned char buffer_test[largoTot]={0};
//int errorFlash = 0;
WDTCTL = WDTPW + WDTHOLD; // Parar watchdog timer
FCTL2 = FWKEY + FSSEL0 + FN0; // MCLK/2 for Flash Timing Generator
write_SegA(ID,MAC,IP,MASCARA,ENLACE);
/*switch(tipo)
{
case 'm': leerCOM1(MAC, 6, 1);
read_SegA(0, 19, ID);
read_SegA(25, 4, IP);
read_SegA(29, 4, MASCARA);
read_SegA(33, 4, ENLACE);
write_SegA(ID,MAC,IP,MASCARA,ENLACE);
break;
case 'd': leerCOM1(ID, 19, 1);
read_SegA(19, 6, MAC);
read_SegA(25, 4, IP);
read_SegA(29, 4, MASCARA);
read_SegA(33, 4, ENLACE);
write_SegA(ID,MAC,IP,MASCARA,ENLACE);
break;
case 'p': leerCOM1(IP, 4, 1);
read_SegA(0, 19, ID);
read_SegA(19, 6, MAC);
read_SegA(29, 4, MASCARA);
read_SegA(33, 4, ENLACE);
write_SegA(ID,MAC,IP,MASCARA,ENLACE);
break;
case 's': leerCOM1(MASCARA, 4, 1);
read_SegA(0, 19, ID);
read_SegA(19, 6, MAC);
read_SegA(25, 4, IP);
read_SegA(33, 4, ENLACE);
write_SegA(ID,MAC,IP,MASCARA,ENLACE);
break;
case 'e': leerCOM1(ENLACE, 4, 1);
read_SegA(0, 19, ID);
read_SegA(19, 6, MAC);
read_SegA(25, 4, IP);
read_SegA(29, 4, MASCARA);
write_SegA(ID,MAC,IP,MASCARA,ENLACE);
break;
default: errorFlash = 30;
}*/
read_SegA(0,37,buffer_test);
//return errorFlash;
}
/**
* \brief Función que escribe en Segmento A de la memoria de Información Flash
*
* Escribe en el siguiente orden: ID, MAC, IP, Máscara de Subred.
* \param *id Identificación de la MSP430.
* \param *mac MAC Media Access Control address, Direccion de Control de Acceso al Medio.
* \param *ip Protocolo de Internet.
* \param *masc Máscara de Red.
* \param *enlace Puerta de Enlace de la Subred.
*/
void write_SegA(unsigned char *id, unsigned char *mac, unsigned char *ip, unsigned char *masc, unsigned char *enlace)
{
unsigned short i;
Flash_ptr = (char *) 0x1080; // Inicialización Puntero Flash
FCTL1 = FWKEY + ERASE; // Set Erase bit
FCTL3 = FWKEY; // Clear Lock bit
*Flash_ptr = 0; // Dummy write to erase Flash segment
FCTL1 = FWKEY + WRT; // Set WRT bit for write operation
for(i=0; i < largoTot; i++)
{
if(i < largoID) // Escribe cada campo en el segmento A de la flash
*Flash_ptr++ = id[i]; //ID
else if (i < largoMAC + largoID && i >= largoID)
*Flash_ptr++ = mac[i-largoID]; //MAC
else if (i < largoTot - largoMasc - largoE && i >= largoMAC + largoID)
*Flash_ptr++ = ip[i-(largoMAC + largoID)]; //IP
else if (i < largoTot - largoE && i >= largoTot - largoMasc - largoE)
*Flash_ptr++ = masc[i-(largoTot - largoMasc - largoE)]; //MASCARA
else if (i < largoTot && i >= largoTot - largoE)
*Flash_ptr++ = enlace[i-(largoTot - largoE)]; //ENLACE
_NOP(); // SET BREAKPOINT HERE
}
FCTL1 = FWKEY; // Clear WRT bit
FCTL3 = FWKEY + LOCK; // Set LOCK bit
}
/**
* \brief Función que lee los campos guardados en segmento A de la memoria Flash.
* \param offset Cantidad de byte que debe avanzar antes de leer desde el puntero de memoria Flash.
* \param largoCampo Largo del campo leído.
* \param *campo Arreglo de caracteres donde se almacenará lo leído.
*/
void read_SegA(char offset, unsigned short largoCampo, unsigned char *campo)
{
unsigned short i=0;
Flash_ptr = (char *) 0x1080; // Re-Inicialización Puntero Flash
Flash_ptr = Flash_ptr + offset; // offset
/*while(offset-- > 0)
Flash_ptr++;*/
// _NOP();
while(i < largoCampo) // LECTURA DE LA FLASH
{
campo[i] = *Flash_ptr++;
printf("%c", campo[i]);
i++;
}
printf("\n");
}
/**
* \brief Función que lee el buffer de COM1
* \param *campo Arreglo de caracteres donde se almacenará lo leído desde el COM1.
* \param cuenta Largo del campo leído.
* \param offset Cantidad de byte que se debe avanzar antes de leer desde el buffer de COM1.
void leerCOM1(unsigned char *campo, unsigned short cuenta, unsigned short offset)
{
unsigned short i;
for(i = 0; i < cuenta; i++)
{
campo[i] = getRXBuffer_0(offset + i);
//printf("%c",campo[i]);
}
_NOP();
}*/