{"id":3585,"date":"2025-04-21T04:31:38","date_gmt":"2025-04-21T04:31:38","guid":{"rendered":"https:\/\/webprojects.cloud\/wordpress\/splatco\/?post_type=spl_knowledgebase&#038;p=3585"},"modified":"2025-06-10T11:57:39","modified_gmt":"2025-06-10T11:57:39","slug":"spicex-basic-principles","status":"publish","type":"spl_knowledgebase","link":"https:\/\/webprojects.cloud\/wordpress\/splatco\/knowledgebase\/tutorials-application-notes-and-white-papers\/tutorial-using-spicex-for-large-i-o-counts\/spicex-basic-principles\/","title":{"rendered":"SPiceX: Basic principles"},"content":{"rendered":"\n<p>The basic principle of this &#8220;<a href=\"https:\/\/webprojects.cloud\/wordpress\/splatco\/knowledgebase\/glossary-of-terms\/#o368\">SPiceX<\/a>&#8221; technique is that you maintain an image of the expansion inputs and outputs in&nbsp;<a href=\"https:\/\/webprojects.cloud\/wordpress\/splatco\/knowledgebase\/glossary-of-terms\/#o414\">RAM<\/a>&nbsp;(data memory) and then bulk transfer them between the controller and the expansion board using special instructions. Within RAM each input and output point will be represented by a single bit of data. Hence, to for example change an output pin you would first alter the corresponding bit in RAM (the&nbsp;<a href=\"https:\/\/webprojects.cloud\/wordpress\/splatco\/knowledgebase\/programming-reference\/instructions-arranged-by-function\/semaphore-instructions\/\">semaphore instructions<\/a>&nbsp;can be very handy for this!) and then you would transfer the RAM data to the actual expansion boards.<\/p>\n\n\n\n<p>Note that with this technique it is not possible to update a single output pin (or read a single input pin) individually. You must update (refresh) the whole lot (<em>every<\/em>&nbsp;bit in&nbsp;<em>every<\/em>&nbsp;expansion board) every time. That&#8217;s why you keep an image of all outputs in RAM, and transfer them all out every time you need to update even one single output pin. In theory you could access inputs pseudo-randomly by doing a total read each time and picking out the bit you want. In practice it usually is simpler to read in the whole lot periodically and then pick the bits you want out of RAM.<\/p>\n\n\n\n<p>The principle instruction used for transferring data between the controller and the expansion board is called&nbsp;<code><a href=\"https:\/\/webprojects.cloud\/wordpress\/splatco\/knowledgebase\/programming-reference\/instructions-arranged-by-function\/splat-expansion-framework-generic-instructions\/spxtxfru-p\/\">SPxTxfrU<\/a><\/code><a href=\"https:\/\/www.splatco.com\/skb\/650.htm\">.<\/a>&nbsp;That instruction transfers a number of bytes out of the U register and out to the expansion boards (as outputs) and at the same time transfers the same number of inputs from the boards and leaves them in U. The number of bytes transferred is set by the number pre-loaded into the V register. The transfer always starts at U0.<\/p>\n\n\n\n<p>The U register is described under &#8220;<a href=\"https:\/\/webprojects.cloud\/wordpress\/splatco\/knowledgebase\/tutorials-application-notes-and-white-papers\/the-splat-expansion-framework\/spx-register-model\/\">SPx Register Model<\/a>&#8221; in the SPLat Expansion Framework documentation. In brief it is a register consisting of 20 bytes of information (this may grow in the future). It is used for a variety of data transfers between the SPLat controller and external devices, and in the future is likely to find other uses. Associated with U is the V register. V is a single byte register that is usually used as a byte counter to determine how many bytes of U are being transferred.<\/p>\n\n\n\n<p>The&nbsp;<code>SPxTxfrU<\/code>&nbsp;instruction has an argument&nbsp;<code>p<\/code>. In all existing implementations use p=0, i.e.&nbsp;<code>SPxTxfrU 0<\/code>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>The basic principle of this &#8220;SPiceX&#8221; technique is that you maintain an image of the expansion inputs and outputs in&nbsp;RAM&nbsp;(data memory) and then bulk transfer&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":3584,"menu_order":0,"template":"","class_list":["post-3585","spl_knowledgebase","type-spl_knowledgebase","status-publish","hentry"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v25.6 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>SPiceX: Basic principles - SPLat Controls<\/title>\n<meta name=\"robots\" content=\"noindex, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"SPiceX: Basic principles - SPLat Controls\" \/>\n<meta property=\"og:description\" content=\"The basic principle of this &#8220;SPiceX&#8221; technique is that you maintain an image of the expansion inputs and outputs in&nbsp;RAM&nbsp;(data memory) and then bulk transfer...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/webprojects.cloud\/wordpress\/splatco\/knowledgebase\/tutorials-application-notes-and-white-papers\/tutorial-using-spicex-for-large-i-o-counts\/spicex-basic-principles\/\" \/>\n<meta property=\"og:site_name\" content=\"SPLat Controls\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-10T11:57:39+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"2 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/webprojects.cloud\/wordpress\/splatco\/knowledgebase\/tutorials-application-notes-and-white-papers\/tutorial-using-spicex-for-large-i-o-counts\/spicex-basic-principles\/\",\"url\":\"https:\/\/webprojects.cloud\/wordpress\/splatco\/knowledgebase\/tutorials-application-notes-and-white-papers\/tutorial-using-spicex-for-large-i-o-counts\/spicex-basic-principles\/\",\"name\":\"SPiceX: Basic principles - SPLat Controls\",\"isPartOf\":{\"@id\":\"https:\/\/webprojects.cloud\/wordpress\/splatco\/#website\"},\"datePublished\":\"2025-04-21T04:31:38+00:00\",\"dateModified\":\"2025-06-10T11:57:39+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/webprojects.cloud\/wordpress\/splatco\/knowledgebase\/tutorials-application-notes-and-white-papers\/tutorial-using-spicex-for-large-i-o-counts\/spicex-basic-principles\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/webprojects.cloud\/wordpress\/splatco\/knowledgebase\/tutorials-application-notes-and-white-papers\/tutorial-using-spicex-for-large-i-o-counts\/spicex-basic-principles\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/webprojects.cloud\/wordpress\/splatco\/knowledgebase\/tutorials-application-notes-and-white-papers\/tutorial-using-spicex-for-large-i-o-counts\/spicex-basic-principles\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/webprojects.cloud\/wordpress\/splatco\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Tutorials, application notes and white papers\",\"item\":\"https:\/\/webprojects.cloud\/wordpress\/splatco\/knowledgebase\/tutorials-application-notes-and-white-papers\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Tutorial: Using SPiceX for large I\/O counts\",\"item\":\"https:\/\/webprojects.cloud\/wordpress\/splatco\/knowledgebase\/tutorials-application-notes-and-white-papers\/tutorial-using-spicex-for-large-i-o-counts\/\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"SPiceX: Basic principles\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/webprojects.cloud\/wordpress\/splatco\/#website\",\"url\":\"https:\/\/webprojects.cloud\/wordpress\/splatco\/\",\"name\":\"SPLat Controls\",\"description\":\"OEM Embedded Machine Controllers\",\"publisher\":{\"@id\":\"https:\/\/webprojects.cloud\/wordpress\/splatco\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/webprojects.cloud\/wordpress\/splatco\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/webprojects.cloud\/wordpress\/splatco\/#organization\",\"name\":\"SPLat Controls\",\"url\":\"https:\/\/webprojects.cloud\/wordpress\/splatco\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/webprojects.cloud\/wordpress\/splatco\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/webprojects.cloud\/wordpress\/splatco\/wp-content\/uploads\/2024\/10\/logo.svg\",\"contentUrl\":\"https:\/\/webprojects.cloud\/wordpress\/splatco\/wp-content\/uploads\/2024\/10\/logo.svg\",\"caption\":\"SPLat Controls\"},\"image\":{\"@id\":\"https:\/\/webprojects.cloud\/wordpress\/splatco\/#\/schema\/logo\/image\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"SPiceX: Basic principles - SPLat Controls","robots":{"index":"noindex","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"og_locale":"en_US","og_type":"article","og_title":"SPiceX: Basic principles - SPLat Controls","og_description":"The basic principle of this &#8220;SPiceX&#8221; technique is that you maintain an image of the expansion inputs and outputs in&nbsp;RAM&nbsp;(data memory) and then bulk transfer...","og_url":"https:\/\/webprojects.cloud\/wordpress\/splatco\/knowledgebase\/tutorials-application-notes-and-white-papers\/tutorial-using-spicex-for-large-i-o-counts\/spicex-basic-principles\/","og_site_name":"SPLat Controls","article_modified_time":"2025-06-10T11:57:39+00:00","twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"2 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/webprojects.cloud\/wordpress\/splatco\/knowledgebase\/tutorials-application-notes-and-white-papers\/tutorial-using-spicex-for-large-i-o-counts\/spicex-basic-principles\/","url":"https:\/\/webprojects.cloud\/wordpress\/splatco\/knowledgebase\/tutorials-application-notes-and-white-papers\/tutorial-using-spicex-for-large-i-o-counts\/spicex-basic-principles\/","name":"SPiceX: Basic principles - SPLat Controls","isPartOf":{"@id":"https:\/\/webprojects.cloud\/wordpress\/splatco\/#website"},"datePublished":"2025-04-21T04:31:38+00:00","dateModified":"2025-06-10T11:57:39+00:00","breadcrumb":{"@id":"https:\/\/webprojects.cloud\/wordpress\/splatco\/knowledgebase\/tutorials-application-notes-and-white-papers\/tutorial-using-spicex-for-large-i-o-counts\/spicex-basic-principles\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/webprojects.cloud\/wordpress\/splatco\/knowledgebase\/tutorials-application-notes-and-white-papers\/tutorial-using-spicex-for-large-i-o-counts\/spicex-basic-principles\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/webprojects.cloud\/wordpress\/splatco\/knowledgebase\/tutorials-application-notes-and-white-papers\/tutorial-using-spicex-for-large-i-o-counts\/spicex-basic-principles\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/webprojects.cloud\/wordpress\/splatco\/"},{"@type":"ListItem","position":2,"name":"Tutorials, application notes and white papers","item":"https:\/\/webprojects.cloud\/wordpress\/splatco\/knowledgebase\/tutorials-application-notes-and-white-papers\/"},{"@type":"ListItem","position":3,"name":"Tutorial: Using SPiceX for large I\/O counts","item":"https:\/\/webprojects.cloud\/wordpress\/splatco\/knowledgebase\/tutorials-application-notes-and-white-papers\/tutorial-using-spicex-for-large-i-o-counts\/"},{"@type":"ListItem","position":4,"name":"SPiceX: Basic principles"}]},{"@type":"WebSite","@id":"https:\/\/webprojects.cloud\/wordpress\/splatco\/#website","url":"https:\/\/webprojects.cloud\/wordpress\/splatco\/","name":"SPLat Controls","description":"OEM Embedded Machine Controllers","publisher":{"@id":"https:\/\/webprojects.cloud\/wordpress\/splatco\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/webprojects.cloud\/wordpress\/splatco\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/webprojects.cloud\/wordpress\/splatco\/#organization","name":"SPLat Controls","url":"https:\/\/webprojects.cloud\/wordpress\/splatco\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/webprojects.cloud\/wordpress\/splatco\/#\/schema\/logo\/image\/","url":"https:\/\/webprojects.cloud\/wordpress\/splatco\/wp-content\/uploads\/2024\/10\/logo.svg","contentUrl":"https:\/\/webprojects.cloud\/wordpress\/splatco\/wp-content\/uploads\/2024\/10\/logo.svg","caption":"SPLat Controls"},"image":{"@id":"https:\/\/webprojects.cloud\/wordpress\/splatco\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/webprojects.cloud\/wordpress\/splatco\/wp-json\/wp\/v2\/spl_knowledgebase\/3585","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/webprojects.cloud\/wordpress\/splatco\/wp-json\/wp\/v2\/spl_knowledgebase"}],"about":[{"href":"https:\/\/webprojects.cloud\/wordpress\/splatco\/wp-json\/wp\/v2\/types\/spl_knowledgebase"}],"author":[{"embeddable":true,"href":"https:\/\/webprojects.cloud\/wordpress\/splatco\/wp-json\/wp\/v2\/users\/1"}],"up":[{"embeddable":true,"href":"https:\/\/webprojects.cloud\/wordpress\/splatco\/wp-json\/wp\/v2\/spl_knowledgebase\/3584"}],"wp:attachment":[{"href":"https:\/\/webprojects.cloud\/wordpress\/splatco\/wp-json\/wp\/v2\/media?parent=3585"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}