<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>S12 / MagniV MicrocontrollersのトピックHow do I read and write to EEPROM using S12XD256?</title>
    <link>https://community.nxp.com/t5/S12-MagniV-Microcontrollers/How-do-I-read-and-write-to-EEPROM-using-S12XD256/m-p/126458#M542</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;DIV&gt;I want create a variable in EEPROM, assign a value to the variable in main() and then later on read the value from that variable.&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;I use MC9S12XD256 with a 8Mhz crystal and a busclock at 25MHz, CW5.1 and the SofTec debugger with indart-one.&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;Below is the code I'm trying to use.&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;1)&lt;/STRONG&gt; In my *.prm file I changed the EEPROM row...&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN class="msg_source_code"&gt;&lt;SPAN class="text_smallest"&gt;Code:&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;PRE&gt;/* non-paged EEPROM */
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EEPROM&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = NO_INIT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x0C00 TO&amp;nbsp;&amp;nbsp; 0x0FFB;&lt;/PRE&gt;&amp;nbsp;&lt;BR /&gt;...and added the row inside the PLACEMENT section just after PAGED_RAM:&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;SPAN class="msg_source_code"&gt;&lt;SPAN class="text_smallest"&gt;Code:&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;PRE&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EEPROM_DATA INTO EEPROM;&lt;/PRE&gt;&lt;DIV&gt;&lt;BR /&gt;&amp;nbsp;I left the following lines untouched:&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;SPAN class="msg_source_code"&gt;&lt;SPAN class="text_smallest"&gt;Code:&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;PRE&gt;/* paged EEPROM&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x0800 TO&amp;nbsp;&amp;nbsp; 0x0BFF; addressed through EPAGE */&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EEPROM_FC&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = READ_ONLY&amp;nbsp;&amp;nbsp; 0xFC0800 TO 0xFC0BFF;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EEPROM_FD&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = READ_ONLY&amp;nbsp;&amp;nbsp; 0xFD0800 TO 0xFD0BFF;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EEPROM_FE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = READ_ONLY&amp;nbsp;&amp;nbsp; 0xFE0800 TO 0xFE0BFF;/*&amp;nbsp;&amp;nbsp;&amp;nbsp; EEPROM_FF&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = READ_ONLY&amp;nbsp;&amp;nbsp; 0xFF0800 TO 0xFF0BFF; intentionally not defined: equivalent to EEPROM */&lt;/PRE&gt;&lt;DIV&gt;&lt;BR /&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;2)&lt;/STRONG&gt; In main.c I added the EEPROM variable...&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;SPAN class="msg_source_code"&gt;&lt;SPAN class="text_smallest"&gt;Code:&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;PRE&gt;#pragma CONST_SEG EEPROM_DATA&amp;nbsp; ushort var1;#pragma CONST_SEG DEFAULT&lt;/PRE&gt;&lt;DIV&gt;&lt;BR /&gt;...and added functions for&amp;nbsp;init eeprom, unprotect, erase, program&amp;nbsp;and protect:&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;SPAN class="msg_source_code"&gt;&lt;SPAN class="text_smallest"&gt;Code:&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;PRE&gt;if(eeprom_init(8, 25)==TRUE)&amp;nbsp; {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; eeprom_unprotect();&amp;nbsp;&amp;nbsp;&amp;nbsp; eeprom_erase_sector(&amp;amp;var1);&amp;nbsp;&amp;nbsp;&amp;nbsp; eeprom_program(&amp;amp;var1, 0x4321);&amp;nbsp;&amp;nbsp;&amp;nbsp; eeprom_protect();&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/PRE&gt;&lt;DIV&gt;&lt;BR /&gt;&amp;nbsp;EEPROM functions:&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;SPAN class="msg_source_code"&gt;&lt;SPAN class="text_smallest"&gt;Code:&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;PRE&gt;uchar eeprom_init(uchar oscclk, uchar busclk){&amp;nbsp; ECNFG = 0x00;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //no interrupts&amp;nbsp;&amp;nbsp;&amp;nbsp; if(oscclk==8 &amp;amp;&amp;amp; busclk==25)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&amp;nbsp;&amp;nbsp;&amp;nbsp; ECLKDIV = 0x00;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //reset&amp;nbsp;&amp;nbsp;&amp;nbsp; ECLKDIV |= (ECLKDIV_EDIVLD_MASK | 40);&amp;nbsp;&amp;nbsp;&amp;nbsp; //EDIVLD must be set after each reset&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //oscclk*(5+1/busclk)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return TRUE;&amp;nbsp; }&amp;nbsp; return NOCASE;}void eeprom_unprotect(void){&amp;nbsp; EPROT |= EPROT_EPOPEN_MASK;&amp;nbsp; }void eeprom_protect(void){&amp;nbsp; EPROT &amp;amp;=~ EPROT_EPOPEN_MASK;&amp;nbsp; }void eeprom_program(void* address, ushort data){&amp;nbsp; ushort addr = (ushort)address;&amp;nbsp;&amp;nbsp;&amp;nbsp; ESTAT |= (ESTAT_PVIOL_MASK | ESTAT_ACCERR_MASK);&amp;nbsp;&amp;nbsp;&amp;nbsp; while(!(ESTAT &amp;amp; ESTAT_CBEIF_MASK))&amp;nbsp;&amp;nbsp;&amp;nbsp; ;&amp;nbsp;&amp;nbsp;&amp;nbsp; ESTAT &amp;amp;=~ (ESTAT_PVIOL_MASK | ESTAT_ACCERR_MASK);&amp;nbsp;&amp;nbsp;&amp;nbsp; EADDRHI = (addr &amp;amp; 0xFF00) &amp;gt;&amp;gt; 8;&amp;nbsp; EADDRLO = addr &amp;amp; 0x00FF;&amp;nbsp;&amp;nbsp;&amp;nbsp; EDATAHI = (data &amp;amp; 0xFF00) &amp;gt;&amp;gt; 8;&amp;nbsp; EDATALO = data &amp;amp; 0x00FF;&amp;nbsp;&amp;nbsp;&amp;nbsp; ECMD = ECMD_PROGRAM;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //set command&amp;nbsp;&amp;nbsp;&amp;nbsp; ESTAT |= ESTAT_CBEIF_MASK;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //start command&amp;nbsp;&amp;nbsp;&amp;nbsp; while(!(ESTAT&amp;amp;ESTAT_CCIF_MASK)) //wait for command to end&amp;nbsp;&amp;nbsp;&amp;nbsp; ;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //erases both words in a sectorvoid eeprom_erase_sector(void* address){&amp;nbsp; ushort addr = (ushort)address;&amp;nbsp;&amp;nbsp;&amp;nbsp; while(!(ESTAT &amp;amp; ESTAT_CBEIF_MASK))&amp;nbsp;&amp;nbsp;&amp;nbsp; ;&amp;nbsp;&amp;nbsp;&amp;nbsp; ESTAT &amp;amp;=~ (ESTAT_PVIOL_MASK | ESTAT_ACCERR_MASK);&amp;nbsp;&amp;nbsp;&amp;nbsp; EADDRHI = (addr &amp;amp; 0xFF00) &amp;gt;&amp;gt; 8; //write sector address&amp;nbsp; EADDRLO = addr &amp;amp; 0x00FF;&amp;nbsp;&amp;nbsp;&amp;nbsp; EDATAHI = 0x00;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //write dummy data&amp;nbsp; EDATALO = 0x00;&amp;nbsp;&amp;nbsp;&amp;nbsp; ECMD = ECMD_SECTOR_ERASE;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //set command&amp;nbsp;&amp;nbsp;&amp;nbsp; ESTAT |= ESTAT_CBEIF_MASK;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //start command&amp;nbsp;&amp;nbsp;&amp;nbsp; while(!(ESTAT&amp;amp;ESTAT_CCIF_MASK)) //wait for command to end&amp;nbsp;&amp;nbsp;&amp;nbsp; ;&amp;nbsp; }&lt;/PRE&gt;&lt;DIV&gt;&lt;BR /&gt;&amp;nbsp;&lt;BR /&gt;&lt;STRONG&gt;3)&lt;/STRONG&gt; To read the variable I just use it as a ordinary variable:&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN class="msg_source_code"&gt;&lt;SPAN class="text_smallest"&gt;Code:&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;PRE&gt;ushort abc = var1;&lt;/PRE&gt;&lt;BR /&gt;&amp;nbsp;&lt;BR /&gt;&lt;BR /&gt;The program after the EEPROM init, unprotect,..... runs fine but the&amp;nbsp;abc variable never gets the value 0x4321. What's wrong?&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;MC9S12XD256 data sheet: &lt;A _jive_internal="true" href="https://community.nxp.com/external-link.jspa?url=http%3A%2F%2Fwww.freescale.com%2Ffiles%2Fmicrocontrollers%2Fdoc%2Fdata_sheet%2FMC9S12XDP512V2.pdf" rel="nofollow noopener noreferrer" target="_blank"&gt;http://www.freescale.com/files/microcontrollers/doc/data_sheet/MC9S12XDP512V2.pdf&lt;/A&gt;&lt;/DIV&gt;&lt;DIV&gt;EEPROM section starts at page 1073&lt;/DIV&gt;&lt;DIV&gt;&lt;BR /&gt;&lt;BR /&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Thu, 15 Mar 2007 16:55:05 GMT</pubDate>
    <dc:creator>Peder</dc:creator>
    <dc:date>2007-03-15T16:55:05Z</dc:date>
    <item>
      <title>How do I read and write to EEPROM using S12XD256?</title>
      <link>https://community.nxp.com/t5/S12-MagniV-Microcontrollers/How-do-I-read-and-write-to-EEPROM-using-S12XD256/m-p/126458#M542</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;DIV&gt;I want create a variable in EEPROM, assign a value to the variable in main() and then later on read the value from that variable.&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;I use MC9S12XD256 with a 8Mhz crystal and a busclock at 25MHz, CW5.1 and the SofTec debugger with indart-one.&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;Below is the code I'm trying to use.&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;1)&lt;/STRONG&gt; In my *.prm file I changed the EEPROM row...&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN class="msg_source_code"&gt;&lt;SPAN class="text_smallest"&gt;Code:&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;PRE&gt;/* non-paged EEPROM */
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EEPROM&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = NO_INIT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x0C00 TO&amp;nbsp;&amp;nbsp; 0x0FFB;&lt;/PRE&gt;&amp;nbsp;&lt;BR /&gt;...and added the row inside the PLACEMENT section just after PAGED_RAM:&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;SPAN class="msg_source_code"&gt;&lt;SPAN class="text_smallest"&gt;Code:&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;PRE&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EEPROM_DATA INTO EEPROM;&lt;/PRE&gt;&lt;DIV&gt;&lt;BR /&gt;&amp;nbsp;I left the following lines untouched:&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;SPAN class="msg_source_code"&gt;&lt;SPAN class="text_smallest"&gt;Code:&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;PRE&gt;/* paged EEPROM&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x0800 TO&amp;nbsp;&amp;nbsp; 0x0BFF; addressed through EPAGE */&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EEPROM_FC&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = READ_ONLY&amp;nbsp;&amp;nbsp; 0xFC0800 TO 0xFC0BFF;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EEPROM_FD&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = READ_ONLY&amp;nbsp;&amp;nbsp; 0xFD0800 TO 0xFD0BFF;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EEPROM_FE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = READ_ONLY&amp;nbsp;&amp;nbsp; 0xFE0800 TO 0xFE0BFF;/*&amp;nbsp;&amp;nbsp;&amp;nbsp; EEPROM_FF&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = READ_ONLY&amp;nbsp;&amp;nbsp; 0xFF0800 TO 0xFF0BFF; intentionally not defined: equivalent to EEPROM */&lt;/PRE&gt;&lt;DIV&gt;&lt;BR /&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;STRONG&gt;2)&lt;/STRONG&gt; In main.c I added the EEPROM variable...&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;SPAN class="msg_source_code"&gt;&lt;SPAN class="text_smallest"&gt;Code:&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;PRE&gt;#pragma CONST_SEG EEPROM_DATA&amp;nbsp; ushort var1;#pragma CONST_SEG DEFAULT&lt;/PRE&gt;&lt;DIV&gt;&lt;BR /&gt;...and added functions for&amp;nbsp;init eeprom, unprotect, erase, program&amp;nbsp;and protect:&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;SPAN class="msg_source_code"&gt;&lt;SPAN class="text_smallest"&gt;Code:&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;PRE&gt;if(eeprom_init(8, 25)==TRUE)&amp;nbsp; {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; eeprom_unprotect();&amp;nbsp;&amp;nbsp;&amp;nbsp; eeprom_erase_sector(&amp;amp;var1);&amp;nbsp;&amp;nbsp;&amp;nbsp; eeprom_program(&amp;amp;var1, 0x4321);&amp;nbsp;&amp;nbsp;&amp;nbsp; eeprom_protect();&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/PRE&gt;&lt;DIV&gt;&lt;BR /&gt;&amp;nbsp;EEPROM functions:&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;SPAN class="msg_source_code"&gt;&lt;SPAN class="text_smallest"&gt;Code:&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;PRE&gt;uchar eeprom_init(uchar oscclk, uchar busclk){&amp;nbsp; ECNFG = 0x00;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //no interrupts&amp;nbsp;&amp;nbsp;&amp;nbsp; if(oscclk==8 &amp;amp;&amp;amp; busclk==25)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&amp;nbsp;&amp;nbsp;&amp;nbsp; ECLKDIV = 0x00;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //reset&amp;nbsp;&amp;nbsp;&amp;nbsp; ECLKDIV |= (ECLKDIV_EDIVLD_MASK | 40);&amp;nbsp;&amp;nbsp;&amp;nbsp; //EDIVLD must be set after each reset&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //oscclk*(5+1/busclk)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return TRUE;&amp;nbsp; }&amp;nbsp; return NOCASE;}void eeprom_unprotect(void){&amp;nbsp; EPROT |= EPROT_EPOPEN_MASK;&amp;nbsp; }void eeprom_protect(void){&amp;nbsp; EPROT &amp;amp;=~ EPROT_EPOPEN_MASK;&amp;nbsp; }void eeprom_program(void* address, ushort data){&amp;nbsp; ushort addr = (ushort)address;&amp;nbsp;&amp;nbsp;&amp;nbsp; ESTAT |= (ESTAT_PVIOL_MASK | ESTAT_ACCERR_MASK);&amp;nbsp;&amp;nbsp;&amp;nbsp; while(!(ESTAT &amp;amp; ESTAT_CBEIF_MASK))&amp;nbsp;&amp;nbsp;&amp;nbsp; ;&amp;nbsp;&amp;nbsp;&amp;nbsp; ESTAT &amp;amp;=~ (ESTAT_PVIOL_MASK | ESTAT_ACCERR_MASK);&amp;nbsp;&amp;nbsp;&amp;nbsp; EADDRHI = (addr &amp;amp; 0xFF00) &amp;gt;&amp;gt; 8;&amp;nbsp; EADDRLO = addr &amp;amp; 0x00FF;&amp;nbsp;&amp;nbsp;&amp;nbsp; EDATAHI = (data &amp;amp; 0xFF00) &amp;gt;&amp;gt; 8;&amp;nbsp; EDATALO = data &amp;amp; 0x00FF;&amp;nbsp;&amp;nbsp;&amp;nbsp; ECMD = ECMD_PROGRAM;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //set command&amp;nbsp;&amp;nbsp;&amp;nbsp; ESTAT |= ESTAT_CBEIF_MASK;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //start command&amp;nbsp;&amp;nbsp;&amp;nbsp; while(!(ESTAT&amp;amp;ESTAT_CCIF_MASK)) //wait for command to end&amp;nbsp;&amp;nbsp;&amp;nbsp; ;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //erases both words in a sectorvoid eeprom_erase_sector(void* address){&amp;nbsp; ushort addr = (ushort)address;&amp;nbsp;&amp;nbsp;&amp;nbsp; while(!(ESTAT &amp;amp; ESTAT_CBEIF_MASK))&amp;nbsp;&amp;nbsp;&amp;nbsp; ;&amp;nbsp;&amp;nbsp;&amp;nbsp; ESTAT &amp;amp;=~ (ESTAT_PVIOL_MASK | ESTAT_ACCERR_MASK);&amp;nbsp;&amp;nbsp;&amp;nbsp; EADDRHI = (addr &amp;amp; 0xFF00) &amp;gt;&amp;gt; 8; //write sector address&amp;nbsp; EADDRLO = addr &amp;amp; 0x00FF;&amp;nbsp;&amp;nbsp;&amp;nbsp; EDATAHI = 0x00;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //write dummy data&amp;nbsp; EDATALO = 0x00;&amp;nbsp;&amp;nbsp;&amp;nbsp; ECMD = ECMD_SECTOR_ERASE;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //set command&amp;nbsp;&amp;nbsp;&amp;nbsp; ESTAT |= ESTAT_CBEIF_MASK;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //start command&amp;nbsp;&amp;nbsp;&amp;nbsp; while(!(ESTAT&amp;amp;ESTAT_CCIF_MASK)) //wait for command to end&amp;nbsp;&amp;nbsp;&amp;nbsp; ;&amp;nbsp; }&lt;/PRE&gt;&lt;DIV&gt;&lt;BR /&gt;&amp;nbsp;&lt;BR /&gt;&lt;STRONG&gt;3)&lt;/STRONG&gt; To read the variable I just use it as a ordinary variable:&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN class="msg_source_code"&gt;&lt;SPAN class="text_smallest"&gt;Code:&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;PRE&gt;ushort abc = var1;&lt;/PRE&gt;&lt;BR /&gt;&amp;nbsp;&lt;BR /&gt;&lt;BR /&gt;The program after the EEPROM init, unprotect,..... runs fine but the&amp;nbsp;abc variable never gets the value 0x4321. What's wrong?&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;MC9S12XD256 data sheet: &lt;A _jive_internal="true" href="https://community.nxp.com/external-link.jspa?url=http%3A%2F%2Fwww.freescale.com%2Ffiles%2Fmicrocontrollers%2Fdoc%2Fdata_sheet%2FMC9S12XDP512V2.pdf" rel="nofollow noopener noreferrer" target="_blank"&gt;http://www.freescale.com/files/microcontrollers/doc/data_sheet/MC9S12XDP512V2.pdf&lt;/A&gt;&lt;/DIV&gt;&lt;DIV&gt;EEPROM section starts at page 1073&lt;/DIV&gt;&lt;DIV&gt;&lt;BR /&gt;&lt;BR /&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 15 Mar 2007 16:55:05 GMT</pubDate>
      <guid>https://community.nxp.com/t5/S12-MagniV-Microcontrollers/How-do-I-read-and-write-to-EEPROM-using-S12XD256/m-p/126458#M542</guid>
      <dc:creator>Peder</dc:creator>
      <dc:date>2007-03-15T16:55:05Z</dc:date>
    </item>
    <item>
      <title>Re: How do I read and write to EEPROM using S12XD256?</title>
      <link>https://community.nxp.com/t5/S12-MagniV-Microcontrollers/How-do-I-read-and-write-to-EEPROM-using-S12XD256/m-p/126459#M543</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;DIV&gt;Small change to eeprom_init, but still no solution...&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN class="msg_source_code"&gt;&lt;SPAN class="text_smallest"&gt;Code:&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;PRE&gt;uchar eeprom_init(uchar oscclk, uchar busclk){  ECNFG = 0x00;                               //no interrupts    if(oscclk==8 &amp;amp;&amp;amp; busclk==25)          {    ECLKDIV = 40;                             //ECLKDIV must be written after each reset                                        //oscclk*(5+1/busclk), PRDIV8=0    return TRUE;  }  return FALSE;}&lt;/PRE&gt;&lt;BR /&gt;&amp;nbsp;&lt;BR /&gt;&lt;/DIV&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 21 Mar 2007 18:37:15 GMT</pubDate>
      <guid>https://community.nxp.com/t5/S12-MagniV-Microcontrollers/How-do-I-read-and-write-to-EEPROM-using-S12XD256/m-p/126459#M543</guid>
      <dc:creator>Peder</dc:creator>
      <dc:date>2007-03-21T18:37:15Z</dc:date>
    </item>
  </channel>
</rss>

