{"id":14356,"date":"2022-04-22T19:40:19","date_gmt":"2022-04-22T19:40:19","guid":{"rendered":"https:\/\/wolles-elektronikkiste.de\/eeprom-part-2-external-i2c-eeproms"},"modified":"2026-05-03T12:40:46","modified_gmt":"2026-05-03T12:40:46","slug":"eeprom-part-2-external-i2c-eeproms","status":"publish","type":"post","link":"https:\/\/wolles-elektronikkiste.de\/en\/eeprom-part-2-external-i2c-eeproms","title":{"rendered":"EEPROM Part 2 &#8211; external I2C EEPROMs"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">About this Post<\/h2>\n\n<p>In my last post, I discussed the internal EEPROM of AVR microcontrollers and AVR-based Arduino boards. In this post, I will now focus on external, I\u00b2C-controlled EEPROMs.  With suitable libraries, such as the one from Sparkfun, you can write and read the EEPROMs very conveniently. For a better understanding, however, it is also worthwhile to learn how this works without a library. And that is exactly what this post is about.<\/p>\n<p>The article is structured as follows:<\/p>\n<ul>\n<li><a href=\"#Einfuehrung\">Introduction<\/a><\/li>\n<li><a href=\"#Pinout-und-Anschluss\">Pinout and connection to the microcontroller<\/a><\/li>\n<li><a href=\"#address_scheme\">Addressing scheme<\/a><\/li>\n<li><a href=\"#EEPROM_beschreiben_und_lesen\">Writing to and reading from the EEPROM<\/a><\/li>\n<li><a href=\"#Groessere_Datenmengen\">Writing larger data sets<\/a><\/li>\n<li><a href=\"#page_write\">Page Write<\/a><\/li>\n<li><a href=\"#sparkfun_bibliothek\">Sparkfun Library<\/a><\/li>\n<\/ul>\n<p>I will cover external SPI-based EEPROMs in a <a href=\"https:\/\/wolles-elektronikkiste.de\/en\/eeprom-part-3-external-spi-eeproms\" target=\"_blank\" rel=\"noopener\">separate post<\/a>. They differ from I\u00b2C-based EEPROMs in such a way that I couldn&#8217;t cover both in a single article. <\/p>\n\n<h2 class=\"wp-block-heading\" id=\"Einfuehrung\">Introduction<\/h2>\n\n<h3 class=\"wp-block-heading\">What is an EEPROM?<\/h3>\n\n<p>The abbreviation EEPROM stands for &#8220;Electrically Erasable Programmable Read Only Memory&#8221;. This somewhat contradictory name has evolved historically. I discussed this in my last post. In short, an EEPROM serves as a memory for data that should not be lost even after the power supply has been switched off.<\/p>\n\n<h3 class=\"wp-block-heading\">What are the characteristics of EEPROMs?<\/h3>\n\n<p>One of the advantages of EEPROMs is their compact design. In addition, the data on an EEPROM is stored securely for a comparatively long time. In some cases, manufacturers guarantee data retention of more than 200 years. I will check this in 200 years and complain if necessary ;-).<\/p>\n<p>A disadvantage, however, is the comparatively slow write speed of the EEPROMs. It is in the range of milliseconds for a single byte. Through &#8220;Page Writing&#8221;, the models discussed here increase their effective write speed considerably compared to the internal EEPROMs. However, they are still much slower than flash memory.<\/p>\n<p>An EEPROM has a limited lifetime in terms of the number of write cycles. However, this disadvantage is of limited relevance, as the specified limit set is usually higher than one million. If the same memory cell were overwritten every second, its lifetime would be reached after ~11.5 days. If you overwrite it every 5 minutes, the lifetime would be exceeded after almost 20 years.<\/p>\n\n<h3 class=\"wp-block-heading\">The EEPROMs I will discuss<\/h3>\n\n<p>In this article, I will focus on EEPROMs of the 24 series. These EEPROMs are labeled according to the scheme &#8220;24xxyy&#8221;.<\/p>\n<p>The &#8220;xx&#8221; part encodes different voltage ranges and transmission speeds. Often you will find &#8220;LC&#8221;, &#8220;C&#8221; and &#8220;A&#8221; types. The &#8220;yy&#8221; usually indicates the storage capacity in kilobits. For example, at the bottom left you can see a &#8220;<a href=\"https:\/\/ww1.microchip.com\/downloads\/en\/DeviceDoc\/21189T.pdf\" target=\"_blank\" rel=\"noopener\">24LC64<\/a>,&#8221; which has a capacity of 64 kbit = 8 kilobytes (abbreviated as kB or kByte). An exception is the <a href=\"https:\/\/ww1.microchip.com\/downloads\/en\/DeviceDoc\/21941E.pdf\" target=\"_blank\" rel=\"noopener\">24LC1025<\/a>, which has a storage capacity of 1024 kbit.  <\/p>\n<p>You control the 24-series via I\u00b2C. There are also other series. The 25 series, for example, is controlled by SPI, the 11, 21 and 28 series communicate via one-wire techniques.<\/p>\n<p>Further abbreviations define design types (PDIP, SIOC, etc), temperature ranges and others.<\/p>\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/wolles-elektronikkiste.de\/wp-content\/uploads\/2022\/03\/24LC64.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"475\" height=\"396\" src=\"https:\/\/wolles-elektronikkiste.de\/wp-content\/uploads\/2022\/03\/24LC64.jpg\" alt=\"EEPROM 24LC64\" class=\"wp-image-13926\" srcset=\"https:\/\/wolles-elektronikkiste.de\/wp-content\/uploads\/2022\/03\/24LC64.jpg 475w, https:\/\/wolles-elektronikkiste.de\/wp-content\/uploads\/2022\/03\/24LC64-300x250.jpg 300w\" sizes=\"auto, (max-width: 475px) 100vw, 475px\" \/><\/a><figcaption class=\"wp-element-caption\">24LC64 EEPROM<\/figcaption><\/figure>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/wolles-elektronikkiste.de\/wp-content\/uploads\/2022\/03\/Modul_2.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"761\" height=\"660\" src=\"https:\/\/wolles-elektronikkiste.de\/wp-content\/uploads\/2022\/03\/Modul_2.jpg\" alt=\"EEPROM 24C256&#10;\" class=\"wp-image-13930\" srcset=\"https:\/\/wolles-elektronikkiste.de\/wp-content\/uploads\/2022\/03\/Modul_2.jpg 761w, https:\/\/wolles-elektronikkiste.de\/wp-content\/uploads\/2022\/03\/Modul_2-300x260.jpg 300w\" sizes=\"auto, (max-width: 761px) 100vw, 761px\" \/><\/a><figcaption class=\"wp-element-caption\">24C256 EEPROM Module<\/figcaption><\/figure>\n<\/div>\n<\/div>\n\n<h4 class=\"wp-block-heading\">Power<\/h4>\n\n<p>The EEPROMs are quite undemanding as far as their power requirements are concerned. While writing, they usually consume 0.1 -1.0 milliamps. When reading, the value is even lower. In standby, the maximum current is a few microamps.<\/p>\n\n<h2 class=\"wp-block-heading\" id=\"Pinout-und-Anschluss\">Pinout and connection to the microcontroller<\/h2>\n\n<h4 class=\"wp-block-heading\">Pinout of the 24 EEPROM series<\/h4>\n\n<p>The pinout of the EEPROMs of the 24 series usually looks like this:<\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><a href=\"https:\/\/wolles-elektronikkiste.de\/wp-content\/uploads\/2022\/03\/eeprom_24Cxxx_pinout.png\"><img loading=\"lazy\" decoding=\"async\" width=\"865\" height=\"589\" src=\"https:\/\/wolles-elektronikkiste.de\/wp-content\/uploads\/2022\/03\/eeprom_24Cxxx_pinout.png\" alt=\"EEPROM Pinout\" class=\"wp-image-13900\" style=\"width:433px;height:295px\" srcset=\"https:\/\/wolles-elektronikkiste.de\/wp-content\/uploads\/2022\/03\/eeprom_24Cxxx_pinout.png 865w, https:\/\/wolles-elektronikkiste.de\/wp-content\/uploads\/2022\/03\/eeprom_24Cxxx_pinout-300x204.png 300w, https:\/\/wolles-elektronikkiste.de\/wp-content\/uploads\/2022\/03\/eeprom_24Cxxx_pinout-768x523.png 768w\" sizes=\"auto, (max-width: 865px) 100vw, 865px\" \/><\/a><figcaption class=\"wp-element-caption\">EEPROM Pinout (24 series)<\/figcaption><\/figure>\n<\/div>\n<ul>\n<li><strong>A0 \/ A1 \/ (A2)<\/strong>: Address pins, 4 to 8 addresses can usually be set.<\/li>\n<li><strong>VCC \/ GND<\/strong>: Power supply, for example 2.5 &#8211; 5.5 Volt for the 24LCxx series (check the data sheet!).<\/li>\n<li><strong>WP<\/strong>: Write Protection;\n<ul>\n<li>Inactive when connected to GND.<\/li>\n<li>Active when connected to VCC.<\/li>\n<\/ul>\n<\/li>\n<li><strong>SDA \/ SCL<\/strong>: I\u00b2C connections, max. 400 kHz for the 24LCxx series (check the data sheet!).<\/li>\n<\/ul>\n\n<h3 class=\"wp-block-heading\">Connection to an Arduino Nano<\/h3>\n\n<p>Example circuit of a 24LC256 on an Arduino Nano:<\/p>\n\n<figure class=\"wp-block-image size-large is-resized\"><a href=\"https:\/\/wolles-elektronikkiste.de\/wp-content\/uploads\/2022\/03\/eeprom_wiring-1024x455.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"455\" src=\"https:\/\/wolles-elektronikkiste.de\/wp-content\/uploads\/2022\/03\/eeprom_wiring-1024x455.png\" alt=\"EEPROM circuit with an Arduino Nano\" class=\"wp-image-13902\" style=\"width:840px;height:373px\" srcset=\"https:\/\/wolles-elektronikkiste.de\/wp-content\/uploads\/2022\/03\/eeprom_wiring-1024x455.png 1024w, https:\/\/wolles-elektronikkiste.de\/wp-content\/uploads\/2022\/03\/eeprom_wiring-300x133.png 300w, https:\/\/wolles-elektronikkiste.de\/wp-content\/uploads\/2022\/03\/eeprom_wiring-768x341.png 768w, https:\/\/wolles-elektronikkiste.de\/wp-content\/uploads\/2022\/03\/eeprom_wiring.png 1306w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption class=\"wp-element-caption\">EEPROM circuit with an Arduino Nano<\/figcaption><\/figure>\n\n<p>Often you can do without the pull-up resistors. Just try it.<\/p>\n\n<h2 class=\"wp-block-heading\" id=\"address_scheme\">Addressing scheme<\/h2>\n<p>The addressing of LC24xx EEPROMs follows different rules depending on their size. However, the base address 0x50 (=0b1010000) is the same for all of them.<\/p>\n<p>For EEPROMs ranging in size from 32 to 512 kbit, a total of eight different I\u00b2C addresses can be set using the lower three bits, i.e., 0x50 to 0x57. The memory addresses are coded by 2 bytes.  <\/p>\n\n<figure class=\"wp-block-image size-full\"><a href=\"&lt;!--[CDATA[https:\/\/wolles-elektronikkiste.de\/wp-content\/uploads\/2022\/04\/24LC32_512_addr.png]]--&gt;\"><img loading=\"lazy\" decoding=\"async\" width=\"828\" height=\"88\" src=\"https:\/\/wolles-elektronikkiste.de\/wp-content\/uploads\/2022\/04\/24LC32_512_addr.png\" alt=\"\" class=\"wp-image-26019\" srcset=\"https:\/\/wolles-elektronikkiste.de\/wp-content\/uploads\/2022\/04\/24LC32_512_addr.png 828w, https:\/\/wolles-elektronikkiste.de\/wp-content\/uploads\/2022\/04\/24LC32_512_addr-300x32.png 300w, https:\/\/wolles-elektronikkiste.de\/wp-content\/uploads\/2022\/04\/24LC32_512_addr-768x82.png 768w\" sizes=\"auto, (max-width: 828px) 100vw, 828px\" \/><\/a><figcaption class=\"wp-element-caption\">Address scheme of 24LC32 to 24LC512<\/figcaption><\/figure>\n<p>The small EEPROMs ranging in size from 1 to 16 kB are organized in memory blocks. The 24L01 has a block size of 128 bytes. The 24LC02 has a block size of 256 bytes. The lower 3 bits of the I\u00b2C address have no significance for these devices, meaning you can only use one of these EEPROMs per I\u00b2C interface. The memory addresses &#8220;fit&#8221; into a single byte.    <\/p>\n<p>The 24LC04 has two memory blocks, each with a capacity of 256 bytes. The blocks are addressed using different I\u00b2C addresses. This is controlled by bit B0 (see below). As a result, the memory address within the block can still be written to using a single byte.   <\/p>\n<p>The 24LC08 works the same way, except that it has 4 blocks addressed via B0 and B1. The 24LC16 has 8 blocks addressed via B0, B1, and B2. <\/p>\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/wolles-elektronikkiste.de\/wp-content\/uploads\/2022\/04\/24LC01_16.png\"><img loading=\"lazy\" decoding=\"async\" width=\"826\" height=\"87\" src=\"https:\/\/wolles-elektronikkiste.de\/wp-content\/uploads\/2022\/04\/24LC01_16.png\" alt=\"\" class=\"wp-image-26024\" srcset=\"https:\/\/wolles-elektronikkiste.de\/wp-content\/uploads\/2022\/04\/24LC01_16.png 826w, https:\/\/wolles-elektronikkiste.de\/wp-content\/uploads\/2022\/04\/24LC01_16-300x32.png 300w, https:\/\/wolles-elektronikkiste.de\/wp-content\/uploads\/2022\/04\/24LC01_16-768x81.png 768w\" sizes=\"auto, (max-width: 826px) 100vw, 826px\" \/><\/a><figcaption class=\"wp-element-caption\">Address scheme 24LC01 to 24LC16<\/figcaption><\/figure>\n<p>With the 24LC1025, the addresses no longer fit into 2 bytes. This EEPROM therefore has two blocks, each with a capacity of 64 kB. As with smaller EEPROMs, the block is selected via the I\u00b2C address. However, this is done here using bit 3. Using the lower two bits, you can address four different I\u00b2C addresses.    <\/p>\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/wolles-elektronikkiste.de\/wp-content\/uploads\/2022\/04\/24LC1025_addr-1.png\"><img loading=\"lazy\" decoding=\"async\" width=\"831\" height=\"88\" src=\"https:\/\/wolles-elektronikkiste.de\/wp-content\/uploads\/2022\/04\/24LC1025_addr-1.png\" alt=\"\" class=\"wp-image-26021\" srcset=\"https:\/\/wolles-elektronikkiste.de\/wp-content\/uploads\/2022\/04\/24LC1025_addr-1.png 831w, https:\/\/wolles-elektronikkiste.de\/wp-content\/uploads\/2022\/04\/24LC1025_addr-1-300x32.png 300w, https:\/\/wolles-elektronikkiste.de\/wp-content\/uploads\/2022\/04\/24LC1025_addr-1-768x81.png 768w\" sizes=\"auto, (max-width: 831px) 100vw, 831px\" \/><\/a><figcaption class=\"wp-element-caption\">Address scheme 24LC1025<\/figcaption><\/figure>\n<p>Finally, there are 2-Mbit EEPROMs such as the AT24CM02. Memory addressing requires 18 bits (bits 0\u201317). The most significant memory address bits are part of the lower two bits of the I\u00b2C address. Bit 3 of the I\u00b2C address allows you to address two of these EEPROMs. The AT24CM<strong>01<\/strong> essentially follows the same scheme, except that it only uses the MSB address bit A16 and has 2 I\u00b2C address bits.     <\/p>\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/wolles-elektronikkiste.de\/wp-content\/uploads\/2022\/04\/AT24CM02_addr.png\"><img loading=\"lazy\" decoding=\"async\" width=\"831\" height=\"88\" src=\"https:\/\/wolles-elektronikkiste.de\/wp-content\/uploads\/2022\/04\/AT24CM02_addr.png\" alt=\"\" class=\"wp-image-26022\" srcset=\"https:\/\/wolles-elektronikkiste.de\/wp-content\/uploads\/2022\/04\/AT24CM02_addr.png 831w, https:\/\/wolles-elektronikkiste.de\/wp-content\/uploads\/2022\/04\/AT24CM02_addr-300x32.png 300w, https:\/\/wolles-elektronikkiste.de\/wp-content\/uploads\/2022\/04\/AT24CM02_addr-768x81.png 768w\" sizes=\"auto, (max-width: 831px) 100vw, 831px\" \/><\/a><figcaption class=\"wp-element-caption\">AT24CM02 Addressing Scheme<\/figcaption><\/figure>\n\n<h2 class=\"wp-block-heading\" id=\"EEPROM_beschreiben_und_lesen\">Writing to and reading from the EEPROM<\/h2>\n\n<h3 class=\"wp-block-heading\">Medium-sized EEPROMs &#8211; 24LC32 to 24LC512<\/h3>\n<p>In this first, simple example, we write four byte values to the EEPROM and then read them back. You initiate the writing process with <code>Wire.beginTransmission()<\/code>.<\/p>\n<p>In the next step, you use <code>Wire.write()<\/code> to pass the memory address at which you want to store the value. For memory capacities between 32 and 512 kbit (equivalent to 4 to 64 kbyte), memory addresses are encoded using two bytes. To do this, divide the address into its MSB (Most Significant Byte) and LSB (Least Significant Byte) and transmit them sequentially. <\/p>\n<p>You complete the write operation with <code>Wire.endTransmission()<\/code>. However, the EEPROM still needs some time to finish the write cycle. You cannot write any more data to the EEPROM until this process is completed. The &#8220;write cycle time&#8221; is listed in your EEPROM&#8217;s datasheet. It is typically 5 milliseconds.    <\/p>\n\n<p>When writing to the EEPROM, you need to keep track of the memory address. There is no function that would warn you that a memory location has already been written to. Strictly speaking, there is no distinction between written and unwritten memory cells. In any case, there is a value stored there. A cleared memory address is written with ones. If you read it as a byte, you get 0b11111111 = 0xFF = 255.<\/p>\n\n<p>For reading, you use the <code>Wire.requestFrom()<\/code> function. You don&#8217;t have to add any waiting time between the read operations.<\/p>\n<\/p>\n<div class=\"scroll-paragraph\">\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-group=\"ext_eeprom_byte_write_read_midsize.ino\" data-enlighter-title=\"ext_eeprom_byte_write_read_midsize.ino\">#include &lt;Wire.h&gt;\n#define I2C_ADDRESS 0x50\n\nvoid setup(){\n  Wire.begin();\n  Serial.begin(115200);\n  \n  uint16_t address = 0;\n  uint8_t byteVal_1 = 42;\n  uint8_t byteVal_2 = 123;\n  uint8_t byteVal_3 = 99;\n  uint8_t byteVal_4 = 222;\n  \n  eepromByteWrite(address,byteVal_1);\n  address++;\n  eepromByteWrite(address,byteVal_2);\n  address++;\n  eepromByteWrite(address,byteVal_3);\n  address++;\n  eepromByteWrite(address,byteVal_4);\n  \n  for(address=0; address&lt;4; address++){\n    Serial.print(\"Byte at address \");\n    Serial.print(address);\n    Serial.print(\": \");\n    Serial.println(eepromByteRead(address));\n  }\n}\n\nvoid loop(){}\n\nvoid eepromByteWrite(uint16_t addr, uint8_t byteToWrite){\n  Wire.beginTransmission(I2C_ADDRESS);\n  Wire.write((uint8_t)(addr &gt;&gt; 8));\n  Wire.write((uint8_t)(addr &amp; 0xFF));\n  Wire.write(byteToWrite);\n  Wire.endTransmission();\n  delay(5); \/\/ important!\n}\n\nuint8_t eepromByteRead(uint16_t addr){\n  uint8_t byteToRead;\n  \n  Wire.beginTransmission(I2C_ADDRESS);\n  Wire.write((uint8_t)(addr &gt;&gt; 8));\n  Wire.write((uint8_t)(addr &amp; 0xFF));\n  Wire.endTransmission();\n  Wire.requestFrom(I2C_ADDRESS, 1);\n  byteToRead = Wire.read();\n \n  return byteToRead;\n}<\/pre>\n<p>\u00a0<\/p>\n<\/div>\n<p>\n\n<p>Here&#8217;s what the output looks like:<\/p>\n\n<figure class=\"wp-block-image size-full\"><a href=\"&lt;!--[CDATA[https:\/\/wolles-elektronikkiste.de\/wp-content\/uploads\/2022\/04\/output_ext_eeprom_byte_write_read_midsize.png]]--&gt;\"><img loading=\"lazy\" decoding=\"async\" width=\"559\" height=\"78\" src=\"https:\/\/wolles-elektronikkiste.de\/wp-content\/uploads\/2022\/04\/output_ext_eeprom_byte_write_read_midsize.png\" alt=\"\" class=\"wp-image-26006\" srcset=\"https:\/\/wolles-elektronikkiste.de\/wp-content\/uploads\/2022\/04\/output_ext_eeprom_byte_write_read_midsize.png 559w, https:\/\/wolles-elektronikkiste.de\/wp-content\/uploads\/2022\/04\/output_ext_eeprom_byte_write_read_midsize-300x42.png 300w\" sizes=\"auto, (max-width: 559px) 100vw, 559px\" \/><\/a><figcaption class=\"wp-element-caption\">Output of ext_eeprom_byte_write_read.ino<\/figcaption><\/figure>\n\n<h3 class=\"wp-block-heading\">Kleine EEPROMs &#8211; 24LC01 bis 24LC16<\/h3>\n<p>As explained above, memory addresses in small EEPROMs are represented by a single byte. As this is no longer sufficient from the 24LC04 (512 memory addresses) onwards, the memory is divided into blocks of 256 bytes each, which can be accessed via different I\u00b2C addresses. In the following sketch, the functions `eepromByteWrite()` and `eepromByteRead()` handle the splitting into I\u00b2C addresses and block addresses.  <\/p>\n<p>To demonstrate that block allocation works, the sketch writes the four bytes to memory addresses 254 to 257.<\/p>\n<\/p>\n<div class=\"scroll-paragraph\">\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-group=\"ext_eeprom_byte_write_read_smallsize.ino\" data-enlighter-title=\"ext_eeprom_byte_write_read_smallsize.ino\">#include &lt;Wire.h&gt;\n#define I2C_ADDRESS 0x50\n\nvoid setup(){\n  Wire.begin();\n  Serial.begin(115200);\n  \n  \/* choose smaller start address for 24lc02 or 24lc01 *\/\n  const uint16_t startAddress = 254; \n  uint16_t address = startAddress;\n  uint8_t byteVal_1 = 42;\n  uint8_t byteVal_2 = 123;\n  uint8_t byteVal_3 = 99;\n  uint8_t byteVal_4 = 222;\n  \n  eepromByteWrite(address,byteVal_1);\n  address++;\n  eepromByteWrite(address,byteVal_2);\n  address++;\n  eepromByteWrite(address,byteVal_3);\n  address++;\n  eepromByteWrite(address,byteVal_4);\n  \n  for(address=startAddress; address&lt;(startAddress+4); address++){\n    Serial.print(\"Byte at address \");\n    Serial.print(address);\n    Serial.print(\": \");\n    Serial.println(eepromByteRead(address));\n  }\n}\n\nvoid loop(){}\n\nvoid eepromByteWrite(uint16_t addr, uint8_t byteToWrite){\n  uint8_t i2cAddr = I2C_ADDRESS + addr\/256;\n  uint8_t blockAddr = addr%256;\n  \n  Wire.beginTransmission(i2cAddr);\n  Wire.write(blockAddr);\n  Wire.write(byteToWrite);\n  Wire.endTransmission();\n  delay(5); \/\/ important!\n}\n\nuint8_t eepromByteRead(uint16_t addr){\n  uint8_t byteToRead;\n  uint8_t i2cAddr = I2C_ADDRESS + addr\/256; \n  uint8_t blockAddr = addr%256;\n  \n  Wire.beginTransmission(i2cAddr);\n  Wire.write(blockAddr);\n  Wire.endTransmission();\n  Wire.requestFrom(I2C_ADDRESS, 1);\n  byteToRead = Wire.read();\n \n  return byteToRead;\n}<\/pre>\n<p>\u00a0<\/p>\n<\/div>\n<p>\n<p>This is the output:<\/p>\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"615\" height=\"77\" src=\"https:\/\/wolles-elektronikkiste.de\/wp-content\/uploads\/2022\/04\/output_ext_eeprom_byte_write_read_smallsize.png\" alt=\"\" class=\"wp-image-26031\" srcset=\"https:\/\/wolles-elektronikkiste.de\/wp-content\/uploads\/2022\/04\/output_ext_eeprom_byte_write_read_smallsize.png 615w, https:\/\/wolles-elektronikkiste.de\/wp-content\/uploads\/2022\/04\/output_ext_eeprom_byte_write_read_smallsize-300x38.png 300w\" sizes=\"auto, (max-width: 615px) 100vw, 615px\" \/><figcaption class=\"wp-element-caption\">Ausgabe von ext_eeprom_byte_write_read_smallsize.ino<\/figcaption><\/figure>\n<p>Surprisingly, the sketch also works on a 24LC01 with the same output. The solution to the puzzle: The EEPROM uses only the lower 7 bits of the memory address. Accordingly, byteVal_1 and byteVal_2 are written to addresses 126 and 127, while byteVal_3 and byteVal_4 end up at addresses 0 and 1. And why does this work for byteVal_3 and byteVal_4, even though the I\u00b2C address changes to 0x51? Even though the lower 3 bits of the I\u00b2C address don\u2019t matter for this EEPROM, you\u2019ll still get eight I\u00b2C addresses (0x50 to 0x57) with an I\u00b2C scanner. It \u201clistens\u201d to all these addresses but always writes to the same memory block. You can verify this by reading addresses 0 through 127.      <\/p>\n\n<h3 class=\"wp-block-heading\">Large EEPROMs &#8211; 24LC1025 (and AT24CM01\/02)<\/h3>\n<p>With the 24LC1025, the two bytes of memory addresses are not sufficient. For this reason, it operates with two blocks that have different I\u00b2C addresses. Based on the addressing scheme, these are 0x50 and 0x54. The following sketch writes two bytes to addresses 0xFFFE and 0xFFFF (65534 and 65535), which are the last two addresses of the first memory block. The other bytes are written to addresses 0x10000 and 0x10001, which are addresses 0 and 1 of the second block.     <\/p>\n<\/p>\n<div class=\"scroll-paragraph\">\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-group=\"ext_eeprom_byte_write_read_largesize.ino\" data-enlighter-title=\"ext_eeprom_byte_write_read_largesize.ino\">#include &lt;Wire.h&gt;\n#define I2C_ADDRESS_1 0x50\n#define I2C_ADDRESS_2 0x54\n\nvoid setup(){\n  Wire.begin();\n  Serial.begin(115200);\n  \n  uint32_t address = 0xFFFE;\n  uint8_t byteVal_1 = 42;\n  uint8_t byteVal_2 = 123;\n  uint8_t byteVal_3 = 99;\n  uint8_t byteVal_4 = 222;\n  \n  eepromByteWrite(address,byteVal_1);\n  address++;\n  eepromByteWrite(address,byteVal_2);\n  address++;\n  eepromByteWrite(address,byteVal_3);\n  address++;\n  eepromByteWrite(address,byteVal_4);\n  \n  for(address = 0xFFFE; address &lt; 0x10002; address++){\n    Serial.print(\"Byte at address 0x\");\n    Serial.print(address, HEX);\n    Serial.print(\": \");\n    Serial.println(eepromByteRead(address));\n  }\n}\n\nvoid loop(){}\n\nvoid eepromByteWrite(uint32_t addr, uint8_t byteToWrite){\n  uint8_t i2cAddr = I2C_ADDRESS_1;\n  \n  if (addr &gt; 0xFFFF){\n    i2cAddr = I2C_ADDRESS_2;\n  }\n\n  Wire.beginTransmission(i2cAddr);\n  Wire.write((uint8_t)(addr &gt;&gt; 8));\n  Wire.write((uint8_t)(addr &amp; 0xFF));\n  Wire.write(byteToWrite);\n  Wire.endTransmission();\n  delay(5); \/\/ important!\n}\n\nuint8_t eepromByteRead(uint32_t addr){\n  uint8_t byteToRead;\n  uint8_t i2cAddr = I2C_ADDRESS_1;\n  \n  if (addr &gt; 0xFFFF){\n    i2cAddr = I2C_ADDRESS_2;\n  }\n\n  Wire.beginTransmission(i2cAddr);\n  Wire.write((uint8_t)(addr &gt;&gt; 8));\n  Wire.write((uint8_t)(addr &amp; 0xFF));\n  Wire.endTransmission();\n  Wire.requestFrom(i2cAddr, 1);\n  byteToRead = Wire.read();\n  \n  return byteToRead;\n}<\/pre>\n<p>\u00a0<\/p>\n<\/div>\n<p>\n<p>The output is:<\/p>\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"598\" height=\"76\" src=\"https:\/\/wolles-elektronikkiste.de\/wp-content\/uploads\/2022\/04\/output_ext_eeprom_byte_write_read_largesize.png\" alt=\"\" class=\"wp-image-26032\" srcset=\"https:\/\/wolles-elektronikkiste.de\/wp-content\/uploads\/2022\/04\/output_ext_eeprom_byte_write_read_largesize.png 598w, https:\/\/wolles-elektronikkiste.de\/wp-content\/uploads\/2022\/04\/output_ext_eeprom_byte_write_read_largesize-300x38.png 300w\" sizes=\"auto, (max-width: 598px) 100vw, 598px\" \/><figcaption class=\"wp-element-caption\">Ausgabe ext_eeprom_byte_write_read_largesize.ino<\/figcaption><\/figure>\n<p>For the AT24CM01 and AT24CM02, you need to modify the sketch. I didn&#8217;t feel like doing it anymore. <\/p>\n\n<h2 class=\"wp-block-heading\" id=\"Groessere_Datenmengen\">Writing larger data sets to the EEPROM<\/h2>\n\n<p>In the next example, we first create an array of one hundred integers. The value of the i-th element of the array is 10 \u00b7 i (arbitrarily chosen). We write the array to the EEPROM, read it from there, and display it on the serial monitor.<\/p>\n<p>Please note that I am writing this and the following examples exclusively for medium-sized EEPROMs. However, you should have no trouble modifying them if necessary. <\/p>\n<p>Here is the sketch:<\/p>\n<\/p>\n<div class=\"scroll-paragraph\">\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-group=\"ext_eeprom_int_array_write_read.ino\" data-enlighter-title=\"ext_eeprom_int_array_write_read.ino\">#include &lt;Wire.h&gt;\n#define I2C_ADDRESS 0x50\n\nvoid setup(){\n  Wire.begin();\n  \/\/Wire.setClock(400000);\n  Serial.begin(115200);\n  uint16_t address = 0;\n  uint32_t writeStart = 0;\n  uint32_t writeDuration = 0;\n  \n  uint16_t arraySize = 100;\n  int16_t intArray[arraySize];\n  \n  for(uint16_t i=0; i&lt;arraySize; i++){\n    intArray[i] = i*10;\n  }\n  writeStart = millis();\n  writeIntArrayToEEPROM(address, intArray, arraySize);\n  writeDuration = millis() - writeStart; \n\n  address = 0;\n  for(uint16_t i=0; i&lt;arraySize; i++){\n    Serial.print(\"intArray[\");\n    Serial.print(i);\n    Serial.print(\"]: \");\n    Serial.println(readIntFromEEPROM(address + 2*i)); \n  }\n  Serial.print(\"Time needed for writing [ms]: \");\n  Serial.println(writeDuration);\n}\n\nvoid loop(){}\n\nvoid writeIntArrayToEEPROM(uint16_t addr, int16_t *iArr, uint16_t arrSize){  \n  for(uint16_t i = 0; i&lt;arrSize; i++){\n    Wire.beginTransmission(I2C_ADDRESS);\n    Wire.write((uint8_t)((2*i + addr) &gt;&gt; 8));\n    Wire.write((uint8_t)((2*i + addr) &amp; 0xFF));\n    Wire.write((uint8_t)(iArr[i] &gt;&gt; 8));\n    Wire.write((uint8_t)(iArr[i]) &amp; 0xFF);\n    Wire.endTransmission();\n    delay(5);\n\/\/    while(isBusy()){   \/\/ alternativ to delay(5).\n\/\/      delayMicroseconds(50);\n\/\/    }\n  }\n}\n  \nint16_t readIntFromEEPROM(uint16_t addr){\n  int16_t intToRead;\n  uint8_t msByte;\n  uint8_t lsByte;\n  Wire.beginTransmission(I2C_ADDRESS);\n  Wire.write((uint8_t)(addr &gt;&gt; 8));\n  Wire.write((uint8_t)(addr &amp; 0xFF));\n  Wire.endTransmission();\n  Wire.requestFrom(I2C_ADDRESS, 2);\n  msByte = Wire.read();\n  lsByte = Wire.read();\n  intToRead = msByte &lt;&lt; 8 | lsByte;\n  return intToRead;\n}\n\nbool isBusy(){\n  Wire.beginTransmission(I2C_ADDRESS);\n  return Wire.endTransmission();\n}<\/pre>\n<p>\u00a0<\/p>\n<\/div>\n<p>\n\n<p>Just a few explanations:<\/p>\n<ul>\n<li>The array is passed to the write function <code>writeIntArrayToEEPROM()<\/code> as a pointer. I discussed this in my last post.<\/li>\n<li>An integer is two bytes (at least on an Arduino). Therefore, not only the address, but also the value to be written must be split into MSB and LSB.<\/li>\n<\/ul>\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/wolles-elektronikkiste.de\/wp-content\/uploads\/2022\/04\/output_ext_eeprom_int_array_page_write_read.png\"><img loading=\"lazy\" decoding=\"async\" width=\"675\" height=\"240\" src=\"https:\/\/wolles-elektronikkiste.de\/wp-content\/uploads\/2022\/04\/output_ext_eeprom_int_array_page_write_read.png\" alt=\"\" class=\"wp-image-26009\" srcset=\"https:\/\/wolles-elektronikkiste.de\/wp-content\/uploads\/2022\/04\/output_ext_eeprom_int_array_page_write_read.png 675w, https:\/\/wolles-elektronikkiste.de\/wp-content\/uploads\/2022\/04\/output_ext_eeprom_int_array_page_write_read-300x107.png 300w\" sizes=\"auto, (max-width: 675px) 100vw, 675px\" \/><\/a><figcaption class=\"wp-element-caption\">Output of ext_eeprom_int_array_write_read.ino<\/figcaption><\/figure>\n\n<p>Writing the array took 552 milliseconds. 500 milliseconds of this time is &#8220;write cycle time&#8221;. If your EEPROM supports fast I\u00b2C, you can reduce the remaining 52 milliseconds by uncommenting line 6, <code>Wire.setClock(400000)<\/code>. This will increase the I\u00b2C frequency from 100 to 400 kHz.  At 400 kHz I was able to reduce the write process to 519 milliseconds.<\/p>\n<p>The data sheet specifies the &#8220;write cycle Ttme&#8221; to be 5 milliseconds. In reality it&#8217;s shorter. As long as the EEPROM is busy writing, it cannot be accessed via I\u00b2C. This means that it will acknowledge during a write cycle. This property is used by the function <code>isBusy()<\/code> to check if the EEPROM is available.<\/p>\n<p>Comment line 43, <code>delay(5)<\/code>, and uncomment the following three lines. With this measure and the switch to 400 kHz, the time required to write the array dropped to 380 milliseconds. The real &#8220;write cycle time&#8221; is therefore about 3.5 milliseconds.<\/p>\n\n<h2 class=\"wp-block-heading\" id=\"page_write\">EEPROM Page Write<\/h2>\n\n<p>As you have just seen, it is possible to write several bytes to the EEPROM &#8220;in one go&#8221; (Page Write), i.e. without intermediate <code>Wire.endTransmission()<\/code> and <code>delay()<\/code>. Otherwise, writing to the integer array would have taken at least 1000 milliseconds.<\/p>\n<p>This works because the EEPROM is segmented into memory sections (Pages) and has a buffer for these sections. The data to be written is quickly transferred to the buffer. And from there the data is written to the memory. The advantage is that writing the entire buffer to the memory takes no longer than the write cycle time. The page size can be found in the data sheet. For the 24LC64 the page size is 32 bytes, for a 24LC256 it is 64 bytes.<\/p>\n<p>The pages start and end at fixed memory addresses. Page writing beyond the end of a page does not work.<\/p>\n\n<h3 class=\"wp-block-heading\">Limitation by the Wire.write() buffer<\/h3>\n\n<p>For page writing, there is still a limiting factor related to the Arduino. And that&#8217;s the buffer for <code>Wire.write()<\/code>. You can see how this works with the following sketch (provided you&#8217;re using a board with a 32-byte buffer and an EEPROM with a page size of at least 32):<\/p>\n<\/p>\n<div class=\"scroll-paragraph\">\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-group=\"ext_eeprom_wire_limit_test.ino\" data-enlighter-title=\"ext_eeprom_wire_limit_test.ino\">#include &lt;Wire.h&gt;\n#define I2C_ADDRESS 0x50\n\n\/* choose a greater number if the i2c buffer is bigger, e.g. a number \n   greater than 128 for an ESP32 board *\/\nuint8_t numOfValues = 64; \n\nvoid setup(){\n  Wire.begin();\n  Serial.begin(115200);\n  uint16_t address = 0;\n   \n  for(uint16_t i=address; i&lt;numOfValues; i++){\n    eepromByteWrite(i,(uint8_t)i);\n  }\n\n  uint8_t byteArray[numOfValues];\n  for(uint8_t i=0; i&lt;numOfValues; i++){\n    byteArray[i] = i*2;\n  }\n  eepromBytePageWrite(address, byteArray, sizeof(byteArray));\n  \n  address = 0;\n  for(uint16_t i=address; i&lt;sizeof(byteArray); i++){\n    Serial.print(\"byteArray[\");\n    Serial.print(i);\n    Serial.print(\"]: \");\n    Serial.println(readEEPROM(i)); \n  }\n}\nvoid loop(){}\n\nvoid eepromByteWrite(uint16_t addr, uint8_t byteToWrite){\n  Wire.beginTransmission(I2C_ADDRESS);\n  Wire.write((uint8_t)(addr &gt;&gt; 8));\n  Wire.write((uint8_t)(addr &amp; 0xFF));\n  Wire.write(byteToWrite);\n  Wire.endTransmission();\n  delay(5);\n}\n\nvoid eepromBytePageWrite(uint16_t addr, uint8_t *byteArrayToWrite, uint8_t sizeOfArray){\n  Wire.beginTransmission(I2C_ADDRESS);\n  Wire.write((uint8_t)(addr &gt;&gt; 8));\n  Wire.write((uint8_t)(addr &amp; 0xFF));\n  for(uint16_t i=addr; i&lt;sizeOfArray; i++){\n    Wire.write(byteArrayToWrite[i]);\n  }\n  Wire.endTransmission();\n  delay(5);\n}\n\nuint8_t readEEPROM(uint16_t addr){\n  byte byteToRead;\n  Wire.beginTransmission(I2C_ADDRESS);\n  Wire.write((uint8_t)(addr &gt;&gt; 8));\n  Wire.write((uint8_t)(addr &amp; 0xFF));\n  Wire.endTransmission();\n  Wire.requestFrom(I2C_ADDRESS, 1);\n  byteToRead = Wire.read();\n  return byteToRead;\n}<\/pre>\n<p>\u00a0<\/p>\n<\/div>\n<p>\n\n<p>The sketch writes values to the first 64 EEPROM memory addresses, namely the address itself. The values are written individually and with a 5 millisecond pause. With this, we have a defined initial state. <\/p>\n<p>Then the sketch writes (or at least tries to write) 64 new values (address multiplied by 2)&nbsp; to the EEPROM. This time it uses the page write method. Here is the unexpected result:<\/p>\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/wolles-elektronikkiste.de\/wp-content\/uploads\/2022\/04\/output__ext_eeprom_wire_limit_test.png\"><img loading=\"lazy\" decoding=\"async\" width=\"584\" height=\"184\" src=\"https:\/\/wolles-elektronikkiste.de\/wp-content\/uploads\/2022\/04\/output__ext_eeprom_wire_limit_test.png\" alt=\"\" class=\"wp-image-26008\" srcset=\"https:\/\/wolles-elektronikkiste.de\/wp-content\/uploads\/2022\/04\/output__ext_eeprom_wire_limit_test.png 584w, https:\/\/wolles-elektronikkiste.de\/wp-content\/uploads\/2022\/04\/output__ext_eeprom_wire_limit_test-300x95.png 300w\" sizes=\"auto, (max-width: 584px) 100vw, 584px\" \/><\/a><figcaption class=\"wp-element-caption\">Output of ext_eeprom_wire_limit_test.ino<\/figcaption><\/figure>\n\n<p>The first 30 values (0\u201329) have been replaced by the page-write method; after that, we encounter the old values. The reason is as follows: For successive <code>Wire.write()<\/code> commands (i.e. without intermediate <code>Wire.endTransmission()<\/code>), the data to be written is written to a buffer that is limited to 32 bytes. This happens on the Arduino side, and it has nothing to do with the EEPROM. The transmission of the address requires 2 bytes, so there are still 30 bytes left for the data. All additional <code>Wire.write()<\/code> calls end up in Nirvana.<\/p>\n\n<h3 class=\"wp-block-heading\">Correct page writing<\/h3>\n\n<p>In summary: when using the page-write method, there are three things to keep in mind:<\/p>\n<ol>\n<li>The page size,<\/li>\n<li>the &#8220;wire.write()&#8221; buffer and<\/li>\n<li>Data must not be written beyond the current page.<\/li>\n<\/ol>\n<p>In the next example, we write an array of 100 integer values (= 200 bytes) to an EEPROM with a page size of 64 bytes using the page write method correctly. If we start at the address 0, then we have 64 bytes which we can write to the page. The limiting factor is the <code>Wire.write()<\/code> buffer. So we write to memory locations 0\u201329, then 30\u201359. After that, we need to be aware that the page ends at address 63, so we can only write 4 additional bytes.  The same happens in the following two pages. Finally, we write the remaining 8 bytes to the last page. Schematically, it looks like this:<\/p>\n\n<figure class=\"wp-block-image size-large is-resized\"><a href=\"https:\/\/wolles-elektronikkiste.de\/wp-content\/uploads\/2022\/03\/EEPROM_pages-1024x447.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"447\" src=\"https:\/\/wolles-elektronikkiste.de\/wp-content\/uploads\/2022\/03\/EEPROM_pages-1024x447.png\" alt=\"Writing 100 integers to an EEPROM with a page size of 64 bytes\" class=\"wp-image-13909\" style=\"width:842px;height:367px\" srcset=\"https:\/\/wolles-elektronikkiste.de\/wp-content\/uploads\/2022\/03\/EEPROM_pages-1024x447.png 1024w, https:\/\/wolles-elektronikkiste.de\/wp-content\/uploads\/2022\/03\/EEPROM_pages-300x131.png 300w, https:\/\/wolles-elektronikkiste.de\/wp-content\/uploads\/2022\/03\/EEPROM_pages-768x335.png 768w, https:\/\/wolles-elektronikkiste.de\/wp-content\/uploads\/2022\/03\/EEPROM_pages-1536x670.png 1536w, https:\/\/wolles-elektronikkiste.de\/wp-content\/uploads\/2022\/03\/EEPROM_pages-1320x576.png 1320w, https:\/\/wolles-elektronikkiste.de\/wp-content\/uploads\/2022\/03\/EEPROM_pages.png 1574w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption class=\"wp-element-caption\">Writing 100 integers to an EEPROM with a page size of 64 bytes<\/figcaption><\/figure>\n\n<p>A sketch could look like this:<\/p>\n<\/p>\n<div class=\"scroll-paragraph\">\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-group=\"ext_eeprom_int_array_page_write_read.ino\" data-enlighter-title=\"ext_eeprom_int_array_page_write_read.ino\">#include &lt;Wire.h&gt;\n#define I2C_ADDRESS 0x50\n#define PAGE_SIZE 64\n#define WRITE_LIMIT 30 \n\nvoid setup(){\n  Wire.begin();\n  Serial.begin(115200);\n  uint16_t address = 0;\n  uint32_t writeStart = 0;\n  uint32_t writeDuration = 0;\n  \n  uint16_t arraySize = 100;\n  int intArray[arraySize];\n  \n  for(uint16_t i=0; i&lt;arraySize; i++){\n    intArray[i] = i;\n  }\n  writeStart = millis();\n  writeIntArrayToEEPROM(address, intArray, arraySize);\n  writeDuration = millis() - writeStart; \n  \n  address = 0;\n  for(uint16_t i=0; i&lt;arraySize; i++){\n    Serial.print(\"intArray[\");\n    Serial.print(i);\n    Serial.print(\"]: \");\n    Serial.println(readIntFromEEPROM(address + 2*i)); \n  }\n  Serial.print(\"Time needed for writing [ms]: \");\n  Serial.println(writeDuration);\n}\n\nvoid loop(){}\n\nvoid writeIntArrayToEEPROM(uint16_t addr, int *iArr, uint16_t arrSize){  \n  uint16_t noOfIntsStillToWrite = arrSize;\n  uint16_t arrayIndex = 0;\n  \n  while((noOfIntsStillToWrite != 0)){\n    uint16_t chunk = (WRITE_LIMIT \/ sizeof(uint16_t));  \/\/ max chunk in number of ints\n    uint16_t positionInPage = (addr % PAGE_SIZE);  \/\/ current position in page\n    uint16_t spaceLeftInPage = (PAGE_SIZE - positionInPage) \/ sizeof(uint16_t); \/\/ available storage space \n    if(spaceLeftInPage &lt; chunk){\n      chunk = spaceLeftInPage;\n    }\n    if(noOfIntsStillToWrite &lt; chunk){\n      chunk = noOfIntsStillToWrite;\n    }\n    writeEEPROM(addr, iArr, chunk, arrayIndex);\n    noOfIntsStillToWrite -= chunk;\n    addr += (chunk * 2);\n    arrayIndex += chunk;\n  } \n}\n\nvoid writeEEPROM(uint16_t addr, int *iArr, uint16_t chunkSize, uint16_t arrIdx){  \n  Wire.beginTransmission(I2C_ADDRESS);\n  Wire.write((uint8_t)(addr&gt;&gt;8));\n  Wire.write((uint8_t)(addr&amp;0xFF));\n\n  for(uint16_t i=0; i&lt;chunkSize; i++){\n    Wire.write((uint8_t)(iArr[i+arrIdx]&gt;&gt;8));\n    Wire.write((uint8_t)(iArr[i+arrIdx])&amp;0xFF);\n  }\n  Wire.endTransmission();\n  delay(5); \n}\n\nint16_t readIntFromEEPROM(uint16_t addr){\n  int16_t intToRead;\n  uint8_t msByte;\n  uint8_t lsByte;\n  Wire.beginTransmission(I2C_ADDRESS);\n  Wire.write((uint8_t)(addr&gt;&gt;8));\n  Wire.write((uint8_t)(addr&amp;0xFF));\n  Wire.endTransmission();\n  Wire.requestFrom(I2C_ADDRESS, 2);\n  msByte = Wire.read();\n  lsByte = Wire.read();\n  intToRead = (int16_t)(msByte&lt;&lt;8 | lsByte);\n  return intToRead;\n}<\/pre>\n<p>\u00a0<\/p>\n<\/div>\n<p>\n\n<p>So you have to always calculate how many bytes you can write to the EEPROM in a single step. As expected, the speed gain through the page write method is considerable:<\/p>\n\n<figure class=\"wp-block-image size-full is-style-default\"><a href=\"https:\/\/wolles-elektronikkiste.de\/wp-content\/uploads\/2022\/04\/output_ext_eeprom_int_array_page_write_read-1.png\"><img loading=\"lazy\" decoding=\"async\" width=\"614\" height=\"183\" src=\"https:\/\/wolles-elektronikkiste.de\/wp-content\/uploads\/2022\/04\/output_ext_eeprom_int_array_page_write_read-1.png\" alt=\"\" class=\"wp-image-26011\" style=\"aspect-ratio:3.355096334655863;object-fit:cover\" srcset=\"https:\/\/wolles-elektronikkiste.de\/wp-content\/uploads\/2022\/04\/output_ext_eeprom_int_array_page_write_read-1.png 614w, https:\/\/wolles-elektronikkiste.de\/wp-content\/uploads\/2022\/04\/output_ext_eeprom_int_array_page_write_read-1-300x89.png 300w\" sizes=\"auto, (max-width: 614px) 100vw, 614px\" \/><\/a><figcaption class=\"wp-element-caption\">Output of ext_eeprom_int_array_write_read.ino<\/figcaption><\/figure>\n\n<p>Again, you can further increase the speed by using the isBusy() function and by switching to 400 kHz. The latter, of course, only if the EEPROM masters it.<\/p>\n\n<h2 class=\"wp-block-heading\" id=\"sparkfun_bibliothek\">Sparkfun Library<\/h2>\n\n<p>You can make your life much easier by using a library. I tested the SparkFun_External_EEPROM_Arduino_Library. It is easy to use and quite comfortable. You can install the library via the library manager of the Arduino IDE or you can download it directly from GitHub (<a href=\"https:\/\/github.com\/sparkfun\/SparkFun_External_EEPROM_Arduino_Library\" target=\"_blank\" rel=\"noopener\">link<\/a>). The functions get() and put() are similar to the corresponding functions from EEPROM.h for the internal EEPROMs of the AVR boards. The usage is practically the same.<\/p>\n<p>If you want to write strings to the EEPROM or read them from it, use functions <code>putString()<\/code> and <code>getString()<\/code>, respectively. The rest should actually be self-explanatory. Here is an example sketch:<\/p>\n<\/p>\n<div class=\"scroll-paragraph\">\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-group=\"Example1_BasicReadWrite.ino\" data-enlighter-title=\"Example1_BasicReadWrite.ino\">\/*\n  Read and write settings and calibration data to an external I2C EEPROM\n  By: Nathan Seidle\n  SparkFun Electronics\n  Date: December 11th, 2019\n  License: This code is public domain but you buy me a beer if you use this\n  and we meet someday (Beerware license).\n  Feel like supporting our work? Buy a board from SparkFun!\n  https:\/\/www.sparkfun.com\/products\/18355\n\n  This example demonstrates how to read and write various variables to memory.\n\n  The I2C EEPROM should have all its ADR pins set to GND (0). This is default\n  on the Qwiic board.\n\n  Hardware Connections:\n  Plug the SparkFun Qwiic EEPROM to an Uno, Artemis, or other Qwiic equipped board\n  Load this sketch\n  Open output window at 115200bps\n*\/\n\n#include &lt;Wire.h&gt;\n\n#include \"SparkFun_External_EEPROM.h\" \/\/ Click here to get the library: http:\/\/librarymanager\/All#SparkFun_External_EEPROM\nExternalEEPROM myMem;\n\nvoid setup()\n{\n  Serial.begin(115200);\n  \/\/delay(250); \/\/Often needed for ESP based platforms\n  Serial.println(\"Qwiic EEPROM example\");\n\n  Wire.begin();\n\n  \/\/We must set the memory specs. Pick your EEPROM From the list:\n\n  \/\/ 24xx00 - 128 bit \/ 16 bytes - 1 address byte, 1 byte page\n  \/\/ 24xx01 - 1024 bit \/ 128 bytes - 1 address byte, 8 byte page\n  \/\/ 24xx02 - 2048 bit \/ 256 bytes - 1 address byte, 8 byte page\n  \/\/ 24xx04 - 4096 bit \/ 512 bytes - 1 address byte, 16 byte page\n  \/\/ 24xx08 - 8192 bit \/ 1024 bytes - 1 address byte, 16 byte page\n  \/\/ 24xx16 - 16384 bit \/ 2048 bytes - 1 address byte, 16 byte page\n  \/\/ 24xx32 - 32768 bit \/ 4096 bytes - 2 address bytes, 32 byte page\n  \/\/ 24xx64 - 65536 bit \/ 8192 bytes - 2 address bytes, 32 byte page\n  \/\/ 24xx128 - 131072 bit \/ 16384 bytes - 2 address bytes, 64 byte page\n  \/\/ 24xx256 - 262144 bit \/ 32768 bytes - 2 address bytes, 64 byte page\n  \/\/ 24xx512 - 524288 bit \/ 65536 bytes - 2 address bytes, 128 byte page\n  \/\/ 24xx1025 - 1024000 bit \/ 128000 byte - 2 address byte, 128 byte page\n  \/\/ 24xxM02 - 2097152 bit \/ 262144 byte - 2 address bytes, 256 byte page\n\n  \/\/ Setting the memory type configures the memory size in bytes, the number of address bytes, and the page size in bytes.\n\n  \/\/ Default to the Qwiic 24xx512 EEPROM: https:\/\/www.sparkfun.com\/products\/18355\n  myMem.setMemoryType(512); \/\/ Valid types: 0, 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1025, 2048\n\n  if (myMem.begin() == false)\n  {\n    Serial.println(\"No memory detected. Freezing.\");\n    while (true)\n      ;\n  }\n  Serial.println(\"Memory detected!\");\n\n  Serial.print(\"Mem size in bytes: \");\n  Serial.println(myMem.length());\n\n  \/\/Yes you can read and write bytes, but you shouldn't!\n  byte myValue1 = 200;\n  myMem.write(0, myValue1); \/\/(location, data)\n\n  byte myRead1 = myMem.read(0);\n  Serial.print(\"I read (should be 200): \");\n  Serial.println(myRead1);\n\n  \/\/You should use gets and puts. This will automatically and correctly arrange\n  \/\/the bytes for larger variable types.\n  int myValue2 = -366;\n  myMem.put(10, myValue2); \/\/(location, data)\n  int myRead2;\n  myMem.get(10, myRead2); \/\/location to read, thing to put data into\n  Serial.print(\"I read (should be -366): \");\n  Serial.println(myRead2);\n\n  float myValue3 = -7.35;\n  myMem.put(20, myValue3); \/\/(location, data)\n  float myRead3;\n  myMem.get(20, myRead3); \/\/location to read, thing to put data into\n  Serial.print(\"I read (should be -7.35): \");\n  Serial.println(myRead3);\n\n  String myString = \"Hi, I am just a simple test string\";\n  unsigned long nextEEPROMLocation = myMem.putString(30, myString);\n  String myRead4 = \"\";\n  myMem.getString(30, myRead4);\n  Serial.print(\"I read: \");\n  Serial.println(myRead4);\n  Serial.print(\"Next available EEPROM location: \");\n  Serial.println(nextEEPROMLocation);\n}\n\nvoid loop()\n{\n}<\/pre>\n<p>\u00a0<\/p>\n<\/div>\n<p>\n\n<p>Here&#8217;s what the output looks like:<\/p>\n\n<figure class=\"wp-block-image size-full\"><a href=\"&lt;!--[CDATA[https:\/\/wolles-elektronikkiste.de\/wp-content\/uploads\/2022\/04\/output_ext_eeprom_sparkfun_example.png]]--&gt;\"><img loading=\"lazy\" decoding=\"async\" width=\"582\" height=\"148\" src=\"https:\/\/wolles-elektronikkiste.de\/wp-content\/uploads\/2022\/04\/output_ext_eeprom_sparkfun_example.png\" alt=\"\" class=\"wp-image-26012\" srcset=\"https:\/\/wolles-elektronikkiste.de\/wp-content\/uploads\/2022\/04\/output_ext_eeprom_sparkfun_example.png 582w, https:\/\/wolles-elektronikkiste.de\/wp-content\/uploads\/2022\/04\/output_ext_eeprom_sparkfun_example-300x76.png 300w\" sizes=\"auto, (max-width: 582px) 100vw, 582px\" \/><\/a><figcaption class=\"wp-element-caption\">Output of Example1_BasicReadWrite.ino<\/figcaption><\/figure>\n\n<p>You should also try out the other example sketches in the library, especially Example2_Settings.ino.<\/p>\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>I show how you can use I2C controlled EEPROM ICs with your microcontroller. This works very comfortably with a library, but it can also be done without it. <\/p>\n","protected":false},"author":1,"featured_media":14018,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[565],"tags":[1752,1756,1753,556,1725,666,1755,1749,1497,1750,1754,1751],"class_list":["post-14356","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-other-parts","tag-24lc256-en","tag-24lc64-en","tag-acknowledge-en","tag-arduino-en-2","tag-eeprom-en","tag-i2c-en","tag-page-size-en","tag-page-write-en","tag-pinout-en","tag-sparkfun-en","tag-wire-write-buffer","tag-write-cycle-en"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>EEPROM Part 2 - external I2C EEPROMs &#8226; Wolles Elektronikkiste<\/title>\n<meta name=\"description\" content=\"I will show you how to use I2C controlled EEPROMc with your microcontroller without or with a library.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/wolles-elektronikkiste.de\/en\/eeprom-part-2-external-i2c-eeproms\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"EEPROM Part 2 - external I2C EEPROMs &#8226; Wolles Elektronikkiste\" \/>\n<meta property=\"og:description\" content=\"I will show you how to use I2C controlled EEPROMc with your microcontroller without or with a library.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/wolles-elektronikkiste.de\/en\/eeprom-part-2-external-i2c-eeproms\" \/>\n<meta property=\"og:site_name\" content=\"Wolles Elektronikkiste\" \/>\n<meta property=\"article:published_time\" content=\"2022-04-22T19:40:19+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-05-03T12:40:46+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/wolles-elektronikkiste.de\/wp-content\/uploads\/2022\/03\/EEPROM_Post-1.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"1200\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Wolfgang Ewald\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Wolfgang Ewald\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"21 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/wolles-elektronikkiste.de\\\/en\\\/eeprom-part-2-external-i2c-eeproms#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/wolles-elektronikkiste.de\\\/en\\\/eeprom-part-2-external-i2c-eeproms\"},\"author\":{\"name\":\"Wolfgang Ewald\",\"@id\":\"https:\\\/\\\/wolles-elektronikkiste.de\\\/en#\\\/schema\\\/person\\\/b774e4d64b4766889a2f7c6e5ec85b46\"},\"headline\":\"EEPROM Part 2 &#8211; external I2C EEPROMs\",\"datePublished\":\"2022-04-22T19:40:19+00:00\",\"dateModified\":\"2026-05-03T12:40:46+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/wolles-elektronikkiste.de\\\/en\\\/eeprom-part-2-external-i2c-eeproms\"},\"wordCount\":2572,\"commentCount\":5,\"publisher\":{\"@id\":\"https:\\\/\\\/wolles-elektronikkiste.de\\\/en#\\\/schema\\\/person\\\/b774e4d64b4766889a2f7c6e5ec85b46\"},\"image\":{\"@id\":\"https:\\\/\\\/wolles-elektronikkiste.de\\\/en\\\/eeprom-part-2-external-i2c-eeproms#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/wolles-elektronikkiste.de\\\/wp-content\\\/uploads\\\/2022\\\/03\\\/EEPROM_Post-1.png\",\"keywords\":[\"24LC256\",\"24LC64\",\"Acknowledge\",\"Arduino\",\"EEPROM\",\"I2C\",\"Page Size\",\"Page Write\",\"Pinout\",\"Sparkfun\",\"Wire.write() buffer\",\"Write Cycle\"],\"articleSection\":[\"Other parts\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/wolles-elektronikkiste.de\\\/en\\\/eeprom-part-2-external-i2c-eeproms#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/wolles-elektronikkiste.de\\\/en\\\/eeprom-part-2-external-i2c-eeproms\",\"url\":\"https:\\\/\\\/wolles-elektronikkiste.de\\\/en\\\/eeprom-part-2-external-i2c-eeproms\",\"name\":\"EEPROM Part 2 - external I2C EEPROMs &#8226; Wolles Elektronikkiste\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/wolles-elektronikkiste.de\\\/en#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/wolles-elektronikkiste.de\\\/en\\\/eeprom-part-2-external-i2c-eeproms#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/wolles-elektronikkiste.de\\\/en\\\/eeprom-part-2-external-i2c-eeproms#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/wolles-elektronikkiste.de\\\/wp-content\\\/uploads\\\/2022\\\/03\\\/EEPROM_Post-1.png\",\"datePublished\":\"2022-04-22T19:40:19+00:00\",\"dateModified\":\"2026-05-03T12:40:46+00:00\",\"description\":\"I will show you how to use I2C controlled EEPROMc with your microcontroller without or with a library.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/wolles-elektronikkiste.de\\\/en\\\/eeprom-part-2-external-i2c-eeproms#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/wolles-elektronikkiste.de\\\/en\\\/eeprom-part-2-external-i2c-eeproms\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/wolles-elektronikkiste.de\\\/en\\\/eeprom-part-2-external-i2c-eeproms#primaryimage\",\"url\":\"https:\\\/\\\/wolles-elektronikkiste.de\\\/wp-content\\\/uploads\\\/2022\\\/03\\\/EEPROM_Post-1.png\",\"contentUrl\":\"https:\\\/\\\/wolles-elektronikkiste.de\\\/wp-content\\\/uploads\\\/2022\\\/03\\\/EEPROM_Post-1.png\",\"width\":1200,\"height\":1200},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/wolles-elektronikkiste.de\\\/en\\\/eeprom-part-2-external-i2c-eeproms#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Startseite\",\"item\":\"https:\\\/\\\/wolles-elektronikkiste.de\\\/en\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"EEPROM Part 2 &#8211; external I2C EEPROMs\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/wolles-elektronikkiste.de\\\/en#website\",\"url\":\"https:\\\/\\\/wolles-elektronikkiste.de\\\/en\",\"name\":\"Wolles Elektronikkiste\",\"description\":\"Die wunderbare Welt der Elektronik\",\"publisher\":{\"@id\":\"https:\\\/\\\/wolles-elektronikkiste.de\\\/en#\\\/schema\\\/person\\\/b774e4d64b4766889a2f7c6e5ec85b46\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/wolles-elektronikkiste.de\\\/en?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/wolles-elektronikkiste.de\\\/en#\\\/schema\\\/person\\\/b774e4d64b4766889a2f7c6e5ec85b46\",\"name\":\"Wolfgang Ewald\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/wolles-elektronikkiste.de\\\/wp-content\\\/uploads\\\/2019\\\/03\\\/cropped-Logo-1.png\",\"url\":\"https:\\\/\\\/wolles-elektronikkiste.de\\\/wp-content\\\/uploads\\\/2019\\\/03\\\/cropped-Logo-1.png\",\"contentUrl\":\"https:\\\/\\\/wolles-elektronikkiste.de\\\/wp-content\\\/uploads\\\/2019\\\/03\\\/cropped-Logo-1.png\",\"width\":512,\"height\":512,\"caption\":\"Wolfgang Ewald\"},\"logo\":{\"@id\":\"https:\\\/\\\/wolles-elektronikkiste.de\\\/wp-content\\\/uploads\\\/2019\\\/03\\\/cropped-Logo-1.png\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"EEPROM Part 2 - external I2C EEPROMs &#8226; Wolles Elektronikkiste","description":"I will show you how to use I2C controlled EEPROMc with your microcontroller without or with a library.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/wolles-elektronikkiste.de\/en\/eeprom-part-2-external-i2c-eeproms","og_locale":"en_US","og_type":"article","og_title":"EEPROM Part 2 - external I2C EEPROMs &#8226; Wolles Elektronikkiste","og_description":"I will show you how to use I2C controlled EEPROMc with your microcontroller without or with a library.","og_url":"https:\/\/wolles-elektronikkiste.de\/en\/eeprom-part-2-external-i2c-eeproms","og_site_name":"Wolles Elektronikkiste","article_published_time":"2022-04-22T19:40:19+00:00","article_modified_time":"2026-05-03T12:40:46+00:00","og_image":[{"width":1200,"height":1200,"url":"https:\/\/wolles-elektronikkiste.de\/wp-content\/uploads\/2022\/03\/EEPROM_Post-1.png","type":"image\/png"}],"author":"Wolfgang Ewald","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Wolfgang Ewald","Est. reading time":"21 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/wolles-elektronikkiste.de\/en\/eeprom-part-2-external-i2c-eeproms#article","isPartOf":{"@id":"https:\/\/wolles-elektronikkiste.de\/en\/eeprom-part-2-external-i2c-eeproms"},"author":{"name":"Wolfgang Ewald","@id":"https:\/\/wolles-elektronikkiste.de\/en#\/schema\/person\/b774e4d64b4766889a2f7c6e5ec85b46"},"headline":"EEPROM Part 2 &#8211; external I2C EEPROMs","datePublished":"2022-04-22T19:40:19+00:00","dateModified":"2026-05-03T12:40:46+00:00","mainEntityOfPage":{"@id":"https:\/\/wolles-elektronikkiste.de\/en\/eeprom-part-2-external-i2c-eeproms"},"wordCount":2572,"commentCount":5,"publisher":{"@id":"https:\/\/wolles-elektronikkiste.de\/en#\/schema\/person\/b774e4d64b4766889a2f7c6e5ec85b46"},"image":{"@id":"https:\/\/wolles-elektronikkiste.de\/en\/eeprom-part-2-external-i2c-eeproms#primaryimage"},"thumbnailUrl":"https:\/\/wolles-elektronikkiste.de\/wp-content\/uploads\/2022\/03\/EEPROM_Post-1.png","keywords":["24LC256","24LC64","Acknowledge","Arduino","EEPROM","I2C","Page Size","Page Write","Pinout","Sparkfun","Wire.write() buffer","Write Cycle"],"articleSection":["Other parts"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/wolles-elektronikkiste.de\/en\/eeprom-part-2-external-i2c-eeproms#respond"]}]},{"@type":"WebPage","@id":"https:\/\/wolles-elektronikkiste.de\/en\/eeprom-part-2-external-i2c-eeproms","url":"https:\/\/wolles-elektronikkiste.de\/en\/eeprom-part-2-external-i2c-eeproms","name":"EEPROM Part 2 - external I2C EEPROMs &#8226; Wolles Elektronikkiste","isPartOf":{"@id":"https:\/\/wolles-elektronikkiste.de\/en#website"},"primaryImageOfPage":{"@id":"https:\/\/wolles-elektronikkiste.de\/en\/eeprom-part-2-external-i2c-eeproms#primaryimage"},"image":{"@id":"https:\/\/wolles-elektronikkiste.de\/en\/eeprom-part-2-external-i2c-eeproms#primaryimage"},"thumbnailUrl":"https:\/\/wolles-elektronikkiste.de\/wp-content\/uploads\/2022\/03\/EEPROM_Post-1.png","datePublished":"2022-04-22T19:40:19+00:00","dateModified":"2026-05-03T12:40:46+00:00","description":"I will show you how to use I2C controlled EEPROMc with your microcontroller without or with a library.","breadcrumb":{"@id":"https:\/\/wolles-elektronikkiste.de\/en\/eeprom-part-2-external-i2c-eeproms#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/wolles-elektronikkiste.de\/en\/eeprom-part-2-external-i2c-eeproms"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/wolles-elektronikkiste.de\/en\/eeprom-part-2-external-i2c-eeproms#primaryimage","url":"https:\/\/wolles-elektronikkiste.de\/wp-content\/uploads\/2022\/03\/EEPROM_Post-1.png","contentUrl":"https:\/\/wolles-elektronikkiste.de\/wp-content\/uploads\/2022\/03\/EEPROM_Post-1.png","width":1200,"height":1200},{"@type":"BreadcrumbList","@id":"https:\/\/wolles-elektronikkiste.de\/en\/eeprom-part-2-external-i2c-eeproms#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Startseite","item":"https:\/\/wolles-elektronikkiste.de\/en"},{"@type":"ListItem","position":2,"name":"EEPROM Part 2 &#8211; external I2C EEPROMs"}]},{"@type":"WebSite","@id":"https:\/\/wolles-elektronikkiste.de\/en#website","url":"https:\/\/wolles-elektronikkiste.de\/en","name":"Wolles Elektronikkiste","description":"Die wunderbare Welt der Elektronik","publisher":{"@id":"https:\/\/wolles-elektronikkiste.de\/en#\/schema\/person\/b774e4d64b4766889a2f7c6e5ec85b46"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/wolles-elektronikkiste.de\/en?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/wolles-elektronikkiste.de\/en#\/schema\/person\/b774e4d64b4766889a2f7c6e5ec85b46","name":"Wolfgang Ewald","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/wolles-elektronikkiste.de\/wp-content\/uploads\/2019\/03\/cropped-Logo-1.png","url":"https:\/\/wolles-elektronikkiste.de\/wp-content\/uploads\/2019\/03\/cropped-Logo-1.png","contentUrl":"https:\/\/wolles-elektronikkiste.de\/wp-content\/uploads\/2019\/03\/cropped-Logo-1.png","width":512,"height":512,"caption":"Wolfgang Ewald"},"logo":{"@id":"https:\/\/wolles-elektronikkiste.de\/wp-content\/uploads\/2019\/03\/cropped-Logo-1.png"}}]}},"_links":{"self":[{"href":"https:\/\/wolles-elektronikkiste.de\/en\/wp-json\/wp\/v2\/posts\/14356","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wolles-elektronikkiste.de\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wolles-elektronikkiste.de\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wolles-elektronikkiste.de\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wolles-elektronikkiste.de\/en\/wp-json\/wp\/v2\/comments?post=14356"}],"version-history":[{"count":2,"href":"https:\/\/wolles-elektronikkiste.de\/en\/wp-json\/wp\/v2\/posts\/14356\/revisions"}],"predecessor-version":[{"id":26051,"href":"https:\/\/wolles-elektronikkiste.de\/en\/wp-json\/wp\/v2\/posts\/14356\/revisions\/26051"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wolles-elektronikkiste.de\/en\/wp-json\/wp\/v2\/media\/14018"}],"wp:attachment":[{"href":"https:\/\/wolles-elektronikkiste.de\/en\/wp-json\/wp\/v2\/media?parent=14356"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wolles-elektronikkiste.de\/en\/wp-json\/wp\/v2\/categories?post=14356"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wolles-elektronikkiste.de\/en\/wp-json\/wp\/v2\/tags?post=14356"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}