{"id":617,"date":"2025-01-28T02:12:10","date_gmt":"2025-01-27T18:12:10","guid":{"rendered":"https:\/\/www.ddzheng.cc\/?p=617"},"modified":"2025-08-04T23:15:32","modified_gmt":"2025-08-04T15:15:32","slug":"roland-sr-jv80-re-writable-rom-card-with-esp32","status":"publish","type":"post","link":"https:\/\/www.ddzheng.cc\/?p=617","title":{"rendered":"Roland SR-JV80 Re-writable ROM Card with ESP32"},"content":{"rendered":"\n<p>For user manual and purchasing please visit: <a href=\"https:\/\/www.ddzheng.cc\/?page_id=666\">https:\/\/www.ddzheng.cc\/?page_id=666<\/a><\/p>\n\n\n<h2 class=\"simpletoc-title\">Table of Contents<\/h2>\n<ul class=\"simpletoc-list\">\n<li><a href=\"#final-update\">Final Update<\/a>\n\n\n<ul><li>\n<a href=\"#opensource-hardware\">Open-source Hardware<\/a>\n\n<\/li>\n<li><a href=\"#production-test\">Production Test<\/a>\n\n<\/li>\n<li><a href=\"#hardware-12\">Hardware 1.2<\/a>\n\n<\/li>\n<\/ul>\n<li><a href=\"#update-13-feb-2025\">Update 13 Feb. 2025:<\/a>\n\n<\/li>\n<li><a href=\"#update-29-jan-2025\">Update 29 Jan 2025:<\/a>\n\n<\/li>\n<li><a href=\"#well-here-it-is\">Well, here it is<\/a>\n\n<\/li>\n<li><a href=\"#the-srjv80-expansion-card\">The SR-JV80 Expansion Card<\/a>\n\n<\/li>\n<li><a href=\"#the-project\">The Project<\/a>\n\n\n<ul><li>\n<a href=\"#blackbox\">Blackbox<\/a>\n\n<\/li>\n<li><a href=\"#defining-the-system-and-design-the-schematic\">Defining the System and Design the Schematic<\/a>\n\n<\/li>\n<li><a href=\"#layout\">Layout<\/a>\n\n<\/li>\n<li><a href=\"#fabrication-and-testing\">Fabrication and Testing<\/a>\n\n<\/li>\n<li><a href=\"#software\">Software<\/a>\n\n<\/li>\n<li><a href=\"#overall-result\">Overall Result<\/a>\n<\/li>\n<\/ul>\n<\/li><\/ul>\n\n<h1 class=\"wp-block-heading\" id=\"final-update\">Final Update<\/h1>\n\n<h2 class=\"wp-block-heading\" id=\"opensource-hardware\">Open-source Hardware<\/h2>\n\n\n<p>Hardware Repo:<\/p>\n\n\n\n<p><a href=\"https:\/\/github.com\/connorzheng97\/srjv\">https:\/\/github.com\/connorzheng97\/srjv<\/a><\/p>\n\n\n\n<p>Firmware Repo:<\/p>\n\n\n\n<p><a href=\"https:\/\/github.com\/connorzheng97\/srjv-fw\">https:\/\/github.com\/connorzheng97\/srjv-fw<\/a><\/p>\n\n\n<h2 class=\"wp-block-heading\" id=\"production-test\">Production Test<\/h2>\n\n\n<p>For production test I have a contractor made a test fixture which probe the production header footprint from top side. The card is placed upside down in the fixture, a small board with mating expansion connector is connected to the card during test.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"902\" height=\"1207\" src=\"https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/\u5c4f\u5e55\u622a\u56fe-2025-08-04-223425.jpg\" alt=\"\" class=\"wp-image-1032\" srcset=\"https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/\u5c4f\u5e55\u622a\u56fe-2025-08-04-223425.jpg 902w, https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/\u5c4f\u5e55\u622a\u56fe-2025-08-04-223425-897x1200.jpg 897w, https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/\u5c4f\u5e55\u622a\u56fe-2025-08-04-223425-383x512.jpg 383w, https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/\u5c4f\u5e55\u622a\u56fe-2025-08-04-223425-768x1028.jpg 768w\" sizes=\"auto, (max-width: 902px) 100vw, 902px\" \/><\/figure>\n\n\n\n<p>Inside the fixture there is a USB 2.0 hub, a USB to serial converter, an Arduino Mega and a development SR-JV board reused as auto-programming control. Extra power is supplied to the USB hub via the white charging cable.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"897\" height=\"1207\" src=\"https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/\u5c4f\u5e55\u622a\u56fe-2025-08-04-223407.jpg\" alt=\"\" class=\"wp-image-1031\" srcset=\"https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/\u5c4f\u5e55\u622a\u56fe-2025-08-04-223407.jpg 897w, https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/\u5c4f\u5e55\u622a\u56fe-2025-08-04-223407-892x1200.jpg 892w, https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/\u5c4f\u5e55\u622a\u56fe-2025-08-04-223407-381x512.jpg 381w, https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/\u5c4f\u5e55\u622a\u56fe-2025-08-04-223407-768x1033.jpg 768w\" sizes=\"auto, (max-width: 897px) 100vw, 897px\" \/><\/figure>\n\n\n\n<p>There is an API to write test content into the flash chip. The flash came erased from factory so there is no need to erase it first.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1474\" height=\"504\" src=\"https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/image-26.png\" alt=\"\" class=\"wp-image-1029\" srcset=\"https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/image-26.png 1474w, https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/image-26-1200x410.png 1200w, https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/image-26-512x175.png 512w, https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/image-26-768x263.png 768w\" sizes=\"auto, (max-width: 1474px) 100vw, 1474px\" \/><\/figure>\n\n\n\n<p>The expansion connector is connected to an Arduino Mega which communicate with production test script (python) using USB serial. It will test all IOs for correct high and low level, as well detect if there is any shortage between IOs. It will read the test content from flash as the final step of production test to determine if everything is correct. I was able to detect a total of 5 boards with soldering issues across all batches.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1920\" height=\"413\" src=\"https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/image-24-1920x413.png\" alt=\"\" class=\"wp-image-1027\" srcset=\"https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/image-24-1920x413.png 1920w, https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/image-24-1200x258.png 1200w, https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/image-24-512x110.png 512w, https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/image-24-768x165.png 768w, https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/image-24-1536x331.png 1536w, https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/image-24.png 1993w\" sizes=\"auto, (max-width: 1920px) 100vw, 1920px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"348\" height=\"353\" src=\"https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/image-25.png\" alt=\"\" class=\"wp-image-1028\" srcset=\"https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/image-25.png 348w, https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/image-25-100x100.png 100w\" sizes=\"auto, (max-width: 348px) 100vw, 348px\" \/><\/figure>\n\n\n\n<p>The production test script will first connect to ESP32, erase its program memory, program the firmware and do a hard reset. It then connect to the AP created by ESP32 user code, and access the home page. Once it has successfully reached the home page, a request is sent to the production test content API to write test content. A serial command is sent to the Arduino Mega to initiate external IO test. Once Arduino Mega report test as passed, the script will proceed to request the erase flash API, after which the card can be packaged.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1269\" height=\"360\" src=\"https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/image-23.png\" alt=\"\" class=\"wp-image-1026\" srcset=\"https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/image-23.png 1269w, https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/image-23-1200x340.png 1200w, https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/image-23-512x145.png 512w, https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/image-23-768x218.png 768w\" sizes=\"auto, (max-width: 1269px) 100vw, 1269px\" \/><\/figure>\n\n\n\n<p>To control Wi-Fi on Windows machine I used the win32wifi python package.<\/p>\n\n\n<h2 class=\"wp-block-heading\" id=\"hardware-12\">Hardware 1.2<\/h2>\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1007\" height=\"1089\" src=\"https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/image-22.png\" alt=\"\" class=\"wp-image-1024\" srcset=\"https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/image-22.png 1007w, https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/image-22-473x512.png 473w, https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/image-22-768x831.png 768w\" sizes=\"auto, (max-width: 1007px) 100vw, 1007px\" \/><\/figure>\n\n\n\n<p>Due to some issues found in the first version of hardware (too slow access speed led to the card not working in XP-80&#8217;s slot C and D) I changed the logic section as shown, using 4x 1G125s to deal with CE and changed the 7486 to use AHC or LV family which has the lowest propagation delay in all 5V compatible logic family. However, this didn&#8217;t fix the issue.<\/p>\n\n\n<h1 class=\"wp-block-heading\" id=\"update-13-feb-2025\">Update 13 Feb. 2025:<\/h1>\n\n\n<p>The first batch run has finished. This will be also PVT. change to reverse mounted 1206 led on bottom side.<\/p>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1920\" height=\"1440\" data-id=\"721\" src=\"https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/02\/IMG_20250213_141707.jpg\" alt=\"\" class=\"wp-image-721\" srcset=\"https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/02\/IMG_20250213_141707.jpg 1920w, https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/02\/IMG_20250213_141707-1200x900.jpg 1200w, https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/02\/IMG_20250213_141707-512x384.jpg 512w, https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/02\/IMG_20250213_141707-768x576.jpg 768w, https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/02\/IMG_20250213_141707-1536x1152.jpg 1536w\" sizes=\"auto, (max-width: 1920px) 100vw, 1920px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1920\" height=\"1440\" data-id=\"720\" src=\"https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/02\/IMG_20250213_152459.jpg\" alt=\"\" class=\"wp-image-720\" srcset=\"https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/02\/IMG_20250213_152459.jpg 1920w, https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/02\/IMG_20250213_152459-1200x900.jpg 1200w, https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/02\/IMG_20250213_152459-512x384.jpg 512w, https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/02\/IMG_20250213_152459-768x576.jpg 768w, https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/02\/IMG_20250213_152459-1536x1152.jpg 1536w\" sizes=\"auto, (max-width: 1920px) 100vw, 1920px\" \/><\/figure>\n<\/figure>\n\n\n<h1 class=\"wp-block-heading\" id=\"update-29-jan-2025\">Update 29 Jan 2025:<\/h1>\n\n\n<p>Out of advice from Gearspace user I will add a header footprint for remote mounted button.<\/p>\n\n\n\n<p>I added ability to wake up WiFi using Bluetooth LE. The operation is done by using a smartphone and attempt to connect to the board. The connection will wake up WiFi and at same time kill BLE process in ESP32, this will cause the connection to fail. This is done on purpose so an app is not needed to wake the WiFi, and you won&#8217;t have to un-pair the Bluetooth device each time.<\/p>\n\n\n<h1 class=\"wp-block-heading\" id=\"well-here-it-is\">Well, here it is<\/h1>\n\n\n<p>This project has taken too long but it&#8217;s finally complete and ready to use and I&#8217;ll make everything open source at a later time.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1920\" height=\"1440\" src=\"https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/IMG_20250127_230813.jpg\" alt=\"\" class=\"wp-image-623\" srcset=\"https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/IMG_20250127_230813.jpg 1920w, https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/IMG_20250127_230813-1200x900.jpg 1200w, https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/IMG_20250127_230813-512x384.jpg 512w, https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/IMG_20250127_230813-768x576.jpg 768w, https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/IMG_20250127_230813-1536x1152.jpg 1536w\" sizes=\"auto, (max-width: 1920px) 100vw, 1920px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1920\" height=\"1440\" src=\"https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/IMG_20250127_230744.jpg\" alt=\"\" class=\"wp-image-656\" srcset=\"https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/IMG_20250127_230744.jpg 1920w, https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/IMG_20250127_230744-1200x900.jpg 1200w, https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/IMG_20250127_230744-512x384.jpg 512w, https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/IMG_20250127_230744-768x576.jpg 768w, https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/IMG_20250127_230744-1536x1152.jpg 1536w\" sizes=\"auto, (max-width: 1920px) 100vw, 1920px\" \/><\/figure>\n\n\n<h1 class=\"wp-block-heading\" id=\"the-srjv80-expansion-card\">The SR-JV80 Expansion Card<\/h1>\n\n\n<p>The Roland JV series synthesizer were a legend of their time. Most of those synthesizers can accept 1 or more SR-JV80 series expansion card.<\/p>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-default wp-block-gallery-2 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"441\" height=\"577\" data-id=\"618\" src=\"https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/image.png\" alt=\"\" class=\"wp-image-618\" srcset=\"https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/image.png 441w, https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/image-391x512.png 391w\" sizes=\"auto, (max-width: 441px) 100vw, 441px\" \/><figcaption class=\"wp-element-caption\">Image by Don Solaris <a href=\"https:\/\/www.donsolaris.com\/?p=404\">https:\/\/www.donsolaris.com\/?p=404<\/a><\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"256\" height=\"194\" data-id=\"620\" src=\"https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/image-2.png\" alt=\"\" class=\"wp-image-620\"\/><figcaption class=\"wp-element-caption\">Image by Edward D Tech <a href=\"https:\/\/www.dtech.lv\/techarticles_roland_exp.html\">https:\/\/www.dtech.lv\/techarticles_roland_exp.html<\/a><\/figcaption><\/figure>\n<\/figure>\n\n\n\n<p>Roland has made some great sounds in these cards. According to most material there are 19 cards made by Roland. As time progresses these cards has become unobtanium and extremely expensive (especially in China, a card usually calls for $60 to $200). A list of expansion card can be seen at Edward DTech&#8217;s site: <a href=\"https:\/\/www.dtech.lv\/techarticles_roland_exp.html\">https:\/\/www.dtech.lv\/techarticles_roland_exp.html<\/a><\/p>\n\n\n\n<p>The Roland&nbsp;<em>JV-80<\/em>,&nbsp;<em>JV-90<\/em>,&nbsp;<em>JV-1000<\/em>,&nbsp;<em>JV-880<\/em>, and&nbsp;<em>JV-1010<\/em>&nbsp;synths from the JV series can be expanded with <strong>1<\/strong> SR-JV80 wave expansion board, as can the&nbsp;<em>JD-990<\/em>&nbsp;and the&nbsp;<em>Fantom FA-76<\/em>. The&nbsp;<em>XP-30<\/em>&nbsp;and&nbsp;<em>XV-88<\/em>&nbsp;can accept up to <strong>2<\/strong>. The&nbsp;<em>XP-50<\/em>,&nbsp;<em>XP-60<\/em>,&nbsp;<em>XP-80<\/em>,&nbsp;<em>JV-1080<\/em>,&nbsp;<em>XV-3080<\/em>, and&nbsp;<em>XV-5080<\/em>&nbsp;can accept up to <strong>4<\/strong>. The&nbsp;<em>JV-2080<\/em>&nbsp;can accept up to <strong>8<\/strong>.<\/p>\n\n\n\n<p>There are products available to act as re-writable SR-JV80 card but they are equally as expensive and from my view, not as user friendly.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1023\" height=\"860\" src=\"https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/\u5c4f\u5e55\u622a\u56fe-2025-01-27-233815.jpg\" alt=\"\" class=\"wp-image-624\" srcset=\"https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/\u5c4f\u5e55\u622a\u56fe-2025-01-27-233815.jpg 1023w, https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/\u5c4f\u5e55\u622a\u56fe-2025-01-27-233815-512x430.jpg 512w, https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/\u5c4f\u5e55\u622a\u56fe-2025-01-27-233815-768x646.jpg 768w\" sizes=\"auto, (max-width: 1023px) 100vw, 1023px\" \/><\/figure>\n\n\n\n<p>Now these cards are relatively simple, they consist of 8MB of ROM and that&#8217;s it. It&#8217;s connected to the sound generation part of synthesizer via the 40-pin connector. It then act as wave ROM and the sound engine can retrieve samples and patch data from it.<\/p>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-default wp-block-gallery-3 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1206\" height=\"859\" data-id=\"621\" src=\"https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/IMG_5824.webp\" alt=\"\" class=\"wp-image-621\" srcset=\"https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/IMG_5824.webp 1206w, https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/IMG_5824-1200x855.webp 1200w, https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/IMG_5824-512x365.webp 512w, https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/IMG_5824-768x547.webp 768w\" sizes=\"auto, (max-width: 1206px) 100vw, 1206px\" \/><figcaption class=\"wp-element-caption\">Image by Big City Music <a href=\"https:\/\/www.bigcitymusic.com\/products\/pop-expansion-board-sr-jv80-01\">https:\/\/www.bigcitymusic.com\/products\/pop-expansion-board-sr-jv80-01<\/a><\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1670\" height=\"951\" data-id=\"622\" src=\"https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/image-3.png\" alt=\"\" class=\"wp-image-622\" srcset=\"https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/image-3.png 1670w, https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/image-3-1200x683.png 1200w, https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/image-3-512x292.png 512w, https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/image-3-768x437.png 768w, https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/image-3-1536x875.png 1536w\" sizes=\"auto, (max-width: 1670px) 100vw, 1670px\" \/><\/figure>\n<\/figure>\n\n\n<h1 class=\"wp-block-heading\" id=\"the-project\">The Project<\/h1>\n\n<h2 class=\"wp-block-heading\" id=\"blackbox\">Blackbox<\/h2>\n\n\n<p>The expansion interface and the synthesizer is essentially a giant blackbox system which we cannot know exactly how it operates. And one thing for sure is that the connector is nowhere to get. After some research I find the SCSI 40-pin all plastic connector which fits the expansion connector perfectly after some filing of the edges.<\/p>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-4 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1260\" height=\"870\" data-id=\"625\" src=\"https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/\u5c4f\u5e55\u622a\u56fe-2025-01-28-010434.jpg\" alt=\"\" class=\"wp-image-625\" srcset=\"https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/\u5c4f\u5e55\u622a\u56fe-2025-01-28-010434.jpg 1260w, https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/\u5c4f\u5e55\u622a\u56fe-2025-01-28-010434-1200x829.jpg 1200w, https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/\u5c4f\u5e55\u622a\u56fe-2025-01-28-010434-512x354.jpg 512w, https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/\u5c4f\u5e55\u622a\u56fe-2025-01-28-010434-768x530.jpg 768w\" sizes=\"auto, (max-width: 1260px) 100vw, 1260px\" \/><\/figure>\n<\/figure>\n\n\n\n<p>The connector pinout can be gathered from the schematic and PCB image in service manual.<\/p>\n\n\n\n<p>The physical form factor is another problem. Since I don&#8217;t even have a real card on hand, I used some of the high-res photo I found on the internet and used photoshop to correct the image and took some measurement. I then put the drawings in KiCAD.<\/p>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-5 is-layout-flex wp-block-gallery-is-layout-flex\"><div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"773\" height=\"560\" data-id=\"627\" src=\"https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/\u5c4f\u5e55\u622a\u56fe-2025-01-28-010743-edited.jpg\" alt=\"\" class=\"wp-image-627\" srcset=\"https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/\u5c4f\u5e55\u622a\u56fe-2025-01-28-010743-edited.jpg 773w, https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/\u5c4f\u5e55\u622a\u56fe-2025-01-28-010743-edited-512x371.jpg 512w, https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/\u5c4f\u5e55\u622a\u56fe-2025-01-28-010743-edited-768x556.jpg 768w\" sizes=\"auto, (max-width: 773px) 100vw, 773px\" \/><\/figure>\n<\/div><\/figure>\n\n\n<h2 class=\"wp-block-heading\" id=\"defining-the-system-and-design-the-schematic\">Defining the System and Design the Schematic<\/h2>\n\n\n<p>I&#8217;ve defined the requirements for this project as follows:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>This product will have a re-writable memory (EEPROM or flash memory, as opposed to mask rom or OTP ROM)<\/li>\n\n\n\n<li>This product will have a Wi-Fi interface so that one don&#8217;t need to remove it from the synthesizer to reprogram it<\/li>\n\n\n\n<li>It need to conform to the original SR-JV80 expansion card form factor and be able to install in the synth without modifying the synth<\/li>\n<\/ul>\n\n\n\n<p>For the main processor, as I&#8217;ve previously used Espressif products, I decided to use ESP32-S3 as the processor of the card. I decided on the WROOM module. <\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1200\" height=\"1200\" src=\"https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/E508B10DC8B5338AAF472E64445EB60B.jpg\" alt=\"\" class=\"wp-image-633\" style=\"width:488px;height:auto\" srcset=\"https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/E508B10DC8B5338AAF472E64445EB60B.jpg 1200w, https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/E508B10DC8B5338AAF472E64445EB60B-512x512.jpg 512w, https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/E508B10DC8B5338AAF472E64445EB60B-768x768.jpg 768w, https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/E508B10DC8B5338AAF472E64445EB60B-100x100.jpg 100w\" sizes=\"auto, (max-width: 1200px) 100vw, 1200px\" \/><\/figure>\n<\/div>\n\n\n<p>Because the original SR-JV80 expansion card has 4 2MB ROM, the Sector101&#8217;s Romulator use the same structure, utilizing 4 flash chips. <\/p>\n\n\n\n<figure class=\"wp-block-gallery aligncenter has-nested-images columns-default wp-block-gallery-6 is-layout-flex wp-block-gallery-is-layout-flex\"><div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"553\" height=\"431\" data-id=\"628\" src=\"https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/\u5c4f\u5e55\u622a\u56fe-2025-01-27-234856.jpg\" alt=\"\" class=\"wp-image-628\" srcset=\"https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/\u5c4f\u5e55\u622a\u56fe-2025-01-27-234856.jpg 553w, https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/\u5c4f\u5e55\u622a\u56fe-2025-01-27-234856-512x399.jpg 512w\" sizes=\"auto, (max-width: 553px) 100vw, 553px\" \/><\/figure>\n<\/div><\/figure>\n\n\n\n<p>I decided to ditch this solution and use one 8MB(64M) flash. <strong>I selected the Cypress (Spansion) S29GL064 and MXIC MX29LV640E.<\/strong> <\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1004\" height=\"1080\" src=\"https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/image-4.png\" alt=\"\" class=\"wp-image-629\" srcset=\"https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/image-4.png 1004w, https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/image-4-476x512.png 476w, https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/image-4-768x826.png 768w\" sizes=\"auto, (max-width: 1004px) 100vw, 1004px\" \/><\/figure>\n\n\n\n<p>The interface has one chip select line for each chip. This means I&#8217;ll need to translate 4 mutually exclusive active low input to 2 active high output (4 to 2 encoder), which can be realized with XOR gate. <strong>I selected 74HC86<\/strong>.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"643\" height=\"474\" src=\"https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/image-5.png\" alt=\"\" class=\"wp-image-630\" style=\"width:430px;height:auto\" srcset=\"https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/image-5.png 643w, https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/image-5-512x377.png 512w\" sizes=\"auto, (max-width: 643px) 100vw, 643px\" \/><\/figure>\n<\/div>\n\n\n<p>At this capacity level there are only 3.3V flash available, but since I need to be able to isolate the synthesizer interface from the card to be able to program it in-place anyway, this won&#8217;t be a problem. The data and address lines on the 3.3V side will connect to processor for erasing and programming. On the 5V side they connect to the interface. <strong>This is done using 4x 74LVC8T245.<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1523\" height=\"560\" src=\"https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/image-6.png\" alt=\"\" class=\"wp-image-631\" srcset=\"https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/image-6.png 1523w, https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/image-6-1200x441.png 1200w, https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/image-6-512x188.png 512w, https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/image-6-768x282.png 768w\" sizes=\"auto, (max-width: 1523px) 100vw, 1523px\" \/><\/figure>\n\n\n\n<p>There isn&#8217;t enough IO on the ESP32 so I decided on the first version to use a IO expander, which turns out to be way too slow. So I later changed to <strong>74HC595 and eventually 74HCS595.<\/strong> Driving these with the SPI interface it can reach a clock speed of 20MHz or more (Max available from ESP32 is 80M but I don&#8217;t think it&#8217;s possible with the HCS logic family).<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"556\" height=\"1014\" src=\"https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/image-7.png\" alt=\"\" class=\"wp-image-632\" style=\"width:265px;height:auto\" srcset=\"https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/image-7.png 556w, https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/image-7-281x512.png 281w\" sizes=\"auto, (max-width: 556px) 100vw, 556px\" \/><\/figure>\n<\/div>\n\n\n<p>Finally power management with a 1117, a USB port, a program port, a button, 2 LEDs, and a MOSFET for controlling the card present sense pin is added.<\/p>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-default wp-block-gallery-7 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"530\" height=\"647\" data-id=\"635\" src=\"https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/image-9.png\" alt=\"\" class=\"wp-image-635\" srcset=\"https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/image-9.png 530w, https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/image-9-419x512.png 419w\" sizes=\"auto, (max-width: 530px) 100vw, 530px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"893\" height=\"609\" data-id=\"634\" src=\"https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/image-8.png\" alt=\"\" class=\"wp-image-634\" srcset=\"https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/image-8.png 893w, https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/image-8-512x349.png 512w, https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/image-8-768x524.png 768w\" sizes=\"auto, (max-width: 893px) 100vw, 893px\" \/><\/figure>\n<\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1202\" height=\"767\" src=\"https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/image-14.png\" alt=\"\" class=\"wp-image-640\" srcset=\"https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/image-14.png 1202w, https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/image-14-1200x766.png 1200w, https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/image-14-512x327.png 512w, https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/image-14-768x490.png 768w\" sizes=\"auto, (max-width: 1202px) 100vw, 1202px\" \/><\/figure>\n\n\n\n<p>The OE and CE of the flash is configurable to pull-up or pull-down, together with mounting the diodes or not it can control the behavior of the bus controls. <\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"355\" height=\"505\" src=\"https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/image-10.png\" alt=\"\" class=\"wp-image-636\"\/><\/figure>\n<\/div>\n\n<h2 class=\"wp-block-heading\" id=\"layout\">Layout<\/h2>\n\n\n<p>There are 3 versions as of now:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Test board version 1 with IO expander. Occupies 2 card slots.<\/li>\n\n\n\n<li>Test board with 74HC595 and no 74HC08. Occupies 2 card slots.<\/li>\n\n\n\n<li>Board with current design, occupying 1 slot and same profile as real card.<\/li>\n<\/ol>\n\n\n\n<p>Laying out the board is a painful process as there are so many wires. Luckily with KiCAD&#8217;s shove routing and long-lat top-bottom strategy it can be done without too much of a hassle.<\/p>\n\n\n\n<p>For the current version I&#8217;m using 4-layer board but it can also be fabricated with 2 layers only since the internal layers are only just power and ground, which is also present on top and bottom layer.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"655\" height=\"971\" src=\"https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/image-12.png\" alt=\"\" class=\"wp-image-638\" srcset=\"https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/image-12.png 655w, https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/image-12-345x512.png 345w\" sizes=\"auto, (max-width: 655px) 100vw, 655px\" \/><\/figure>\n<\/div>\n\n<h2 class=\"wp-block-heading\" id=\"fabrication-and-testing\">Fabrication and Testing<\/h2>\n\n\n<p>I manufactured the boards at JLCPCB. I have JLCPCB assemble the basic parts like LDO, RCL, and anything else that doesn&#8217;t require feeder changing fee in their SMT process. <\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1022\" height=\"210\" src=\"https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/image-13.png\" alt=\"\" class=\"wp-image-639\" srcset=\"https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/image-13.png 1022w, https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/image-13-512x105.png 512w, https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/image-13-768x158.png 768w\" sizes=\"auto, (max-width: 1022px) 100vw, 1022px\" \/><\/figure>\n\n\n\n<p>For testing I bought N8R8 version (8MB Flash, 8MB PSRAM) of the ESP32S3-WROOM.<\/p>\n\n\n\n<p>On the first version (IO expander) I quickly realized it won&#8217;t work due to the slow speed of the IO expander. So I quickly spun the next test board version. However under the influence of the <a href=\"https:\/\/github.com\/hackyourlife\/srscramble\">scramble scheme<\/a> of these ROM, I connected the address and data wires all wrong. So I had to airwire all those lines at the 5V side. Luckily I put 0R resistor in series with the 5V signals on the test boards.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1440\" height=\"1920\" src=\"https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/IMG_20250106_184944.jpg\" alt=\"\" class=\"wp-image-643\" srcset=\"https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/IMG_20250106_184944.jpg 1440w, https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/IMG_20250106_184944-900x1200.jpg 900w, https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/IMG_20250106_184944-384x512.jpg 384w, https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/IMG_20250106_184944-768x1024.jpg 768w, https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/IMG_20250106_184944-1152x1536.jpg 1152w\" sizes=\"auto, (max-width: 1440px) 100vw, 1440px\" \/><\/figure>\n\n\n\n<p>On this version I tested for all functionality and did some signal measurement. On these first versions I didn&#8217;t manage the CE lines from the interface however since those are CE lines there are no overall CE available after encoding (can&#8217;t distinguish between address 00 or no CE active). This resulted in one card shown as 4 identical cards in my XP-80 due to the WOE line is shared between cards. I only made one test board but there definitely will be bus conflict if more than one card are installed. <\/p>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-default wp-block-gallery-8 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1920\" height=\"1440\" data-id=\"653\" src=\"https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/IMG_20250106_184608.jpg\" alt=\"\" class=\"wp-image-653\" srcset=\"https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/IMG_20250106_184608.jpg 1920w, https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/IMG_20250106_184608-1200x900.jpg 1200w, https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/IMG_20250106_184608-512x384.jpg 512w, https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/IMG_20250106_184608-768x576.jpg 768w, https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/IMG_20250106_184608-1536x1152.jpg 1536w\" sizes=\"auto, (max-width: 1920px) 100vw, 1920px\" \/><figcaption class=\"wp-element-caption\">This is only one test card installed&#8230;<\/figcaption><\/figure>\n<\/figure>\n\n\n\n<p>So later on the third version I added a <strong>74HC08<\/strong> to get a combined CE line, which through a diode control the flash&#8217;s CE pin. This is OR&#8217;ed with the WOE line to get the card&#8217;s OE control, which is fed through the remaining 74LVC245 channel to get a 3.3V OE to control the flash and the data port 74LVC245. The OR&#8217;ing is done using the remaining gates of the 74HC86 and 74HC08 to save cost.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1186\" height=\"381\" src=\"https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/image-15.png\" alt=\"\" class=\"wp-image-641\" srcset=\"https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/image-15.png 1186w, https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/image-15-512x164.png 512w, https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/image-15-768x247.png 768w\" sizes=\"auto, (max-width: 1186px) 100vw, 1186px\" \/><\/figure>\n\n\n\n<p>Currently this all working just fine. For the production version I&#8217;ll probably just tie CE with a pull-down.<\/p>\n\n\n<h2 class=\"wp-block-heading\" id=\"software\">Software<\/h2>\n\n\n<p>This is where I suck. I have previously used ESP-IDF and know something about FreeRTOS but when it comes to real projects it still give me headaches. <\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"218\" height=\"49\" src=\"https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/image-17.png\" alt=\"\" class=\"wp-image-644\"\/><\/figure>\n<\/div>\n\n\n<p> When user connect to the WiFi hotspot and access the ESP32 server, some webpages are served, and the user can erase the flash, upload a new ROM, and configure the WiFi. The WiFi off option is the latest add due to the fear of too high current consumption if someone install all expansion with such card.<\/p>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-default wp-block-gallery-9 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"561\" height=\"611\" data-id=\"648\" src=\"https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/\u5c4f\u5e55\u622a\u56fe-2025-01-28-015658.jpg\" alt=\"\" class=\"wp-image-648\" srcset=\"https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/\u5c4f\u5e55\u622a\u56fe-2025-01-28-015658.jpg 561w, https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/\u5c4f\u5e55\u622a\u56fe-2025-01-28-015658-470x512.jpg 470w\" sizes=\"auto, (max-width: 561px) 100vw, 561px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"478\" height=\"442\" data-id=\"646\" src=\"https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/\u5c4f\u5e55\u622a\u56fe-2025-01-28-015714.jpg\" alt=\"\" class=\"wp-image-646\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"447\" height=\"221\" data-id=\"647\" src=\"https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/\u5c4f\u5e55\u622a\u56fe-2025-01-28-015741.jpg\" alt=\"\" class=\"wp-image-647\"\/><\/figure>\n<\/figure>\n\n\n\n<p>To save cost, some flash I chose does only support byte\/word programming. The flash programming is done with IO operations so their speed is very important. I used direct register writes for bus control pins, used dedicated IO to control the data pins (single CPU cycle set 8 pins), and SPI running at 20M clock to control the shift registers for address lines. <strong>The current program time for 8MB is 6 minutes.<\/strong><\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"351\" height=\"25\" src=\"https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/image-18.png\" alt=\"\" class=\"wp-image-649\"\/><\/figure>\n<\/div>\n\n\n<p><\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"409\" height=\"52\" src=\"https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/image-20.png\" alt=\"\" class=\"wp-image-651\"\/><\/figure>\n<\/div>\n\n\n<p><\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"357\" height=\"73\" src=\"https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/image-21.png\" alt=\"\" class=\"wp-image-662\"\/><\/figure>\n<\/div>\n\n\n<p>The programming runs in a task and receive data to program through a queue. <\/p>\n\n\n\n<p>The software reads nvs storage on startup to get WiFi configuration information. It configures data pins, shift register output pins and all bus control pins as tri-state. If the button is pressed on boot and still pressed after 3 seconds, the nvs config will be cleared. If WiFi off is set, a button press will start WiFi and server. When user selects erase or program, ESP32 will set the OE of U2, U3, U4 high through IO1 so their outputs tri-state. The OE of U5 will also tri-state due to pull-up. This way the expansion port is isolated allowing programming of the flash in-system.<\/p>\n\n\n\n<p>I chose to only include off and on option, rather than more options like off after x minutes, because if the 5V supply is not enough, the WiFi of multiple installed card cannot start simultaneously anyway, so it has to be off on boot and be later woken up manually.<\/p>\n\n\n\n<p><\/p>\n\n\n<h2 class=\"wp-block-heading\" id=\"overall-result\">Overall Result<\/h2>\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1440\" height=\"1920\" src=\"https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/IMG_20250127_202606.jpg\" alt=\"\" class=\"wp-image-654\" srcset=\"https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/IMG_20250127_202606.jpg 1440w, https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/IMG_20250127_202606-900x1200.jpg 900w, https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/IMG_20250127_202606-384x512.jpg 384w, https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/IMG_20250127_202606-768x1024.jpg 768w, https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/IMG_20250127_202606-1152x1536.jpg 1152w\" sizes=\"auto, (max-width: 1440px) 100vw, 1440px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1920\" height=\"1440\" src=\"https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/IMG_20250127_202654.jpg\" alt=\"\" class=\"wp-image-655\" srcset=\"https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/IMG_20250127_202654.jpg 1920w, https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/IMG_20250127_202654-1200x900.jpg 1200w, https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/IMG_20250127_202654-512x384.jpg 512w, https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/IMG_20250127_202654-768x576.jpg 768w, https:\/\/www.ddzheng.cc\/wp-content\/uploads\/2025\/01\/IMG_20250127_202654-1536x1152.jpg 1536w\" sizes=\"auto, (max-width: 1920px) 100vw, 1920px\" \/><\/figure>\n\n\n\n<p>Currently everything is working. I&#8217;ll do some more testing and probably will spin a small batch for PVT sale. After I&#8217;m confident enough with the design I&#8217;ll release those as open source.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>For user manual and purchasing please visit: https:\/\/www.ddzheng.cc\/?page_id=666 Final Update Open-source Hardware Hardware Repo: https:\/\/github.com\/connorzheng97\/srjv Firmware Repo: https:\/\/github.com\/connorzheng97\/srjv-fw Production Test For production test I have a contractor made a test fixture which probe the production header footprint from top side. The card is placed upside down in the fixture, a small board with mating expansion [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":623,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[7,23,14,10],"class_list":["post-617","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tech","tag-hw","tag-pcb","tag-software","tag-writeup"],"_links":{"self":[{"href":"https:\/\/www.ddzheng.cc\/index.php?rest_route=\/wp\/v2\/posts\/617","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.ddzheng.cc\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.ddzheng.cc\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.ddzheng.cc\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.ddzheng.cc\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=617"}],"version-history":[{"count":13,"href":"https:\/\/www.ddzheng.cc\/index.php?rest_route=\/wp\/v2\/posts\/617\/revisions"}],"predecessor-version":[{"id":1034,"href":"https:\/\/www.ddzheng.cc\/index.php?rest_route=\/wp\/v2\/posts\/617\/revisions\/1034"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.ddzheng.cc\/index.php?rest_route=\/wp\/v2\/media\/623"}],"wp:attachment":[{"href":"https:\/\/www.ddzheng.cc\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=617"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.ddzheng.cc\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=617"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.ddzheng.cc\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=617"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}