{"id":416,"date":"2021-09-16T04:40:19","date_gmt":"2021-09-16T04:40:19","guid":{"rendered":"https:\/\/blog.embeddedexpert.io\/?p=416"},"modified":"2021-09-16T04:40:22","modified_gmt":"2021-09-16T04:40:22","slug":"working-with-stm32-and-i2c-inter-integrated-circuit-i2c-bus-scanner","status":"publish","type":"post","link":"https:\/\/blog.embeddedexpert.io\/?p=416","title":{"rendered":"Working with STM32 and I2C (Inter Integrated Circuit): I2C bus scanner"},"content":{"rendered":"\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-medium\"><img loading=\"lazy\" decoding=\"async\" width=\"273\" height=\"300\" src=\"https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2021\/09\/1200px-I\u00b2C_bus_logo.svg_-273x300.png\" alt=\"\" class=\"wp-image-417\" srcset=\"https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2021\/09\/1200px-I\u00b2C_bus_logo.svg_-273x300.png 273w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2021\/09\/1200px-I\u00b2C_bus_logo.svg_-933x1024.png 933w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2021\/09\/1200px-I\u00b2C_bus_logo.svg_-768x843.png 768w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2021\/09\/1200px-I\u00b2C_bus_logo.svg_-1150x1262.png 1150w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2021\/09\/1200px-I\u00b2C_bus_logo.svg_-750x823.png 750w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2021\/09\/1200px-I\u00b2C_bus_logo.svg_-400x439.png 400w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2021\/09\/1200px-I\u00b2C_bus_logo.svg_-250x274.png 250w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2021\/09\/1200px-I\u00b2C_bus_logo.svg_.png 1200w\" sizes=\"(max-width: 273px) 100vw, 273px\" \/><figcaption>official i2c logo<\/figcaption><\/figure><\/div>\n\n\n\n<p>In this guide, we shall discuss what is I2C and how to make an i2c bus scanner to scan the slave devices that connected to the i2c1 bus of STM32F411<\/p>\n\n\n\n<p>In this guide we will cover the following:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>What is I2C<\/li><li> I2C setup for stm32f4<\/li><li>I2C bus scanner code<\/li><li>Results<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">1.1: What is I2C<\/h2>\n\n\n\n<p>I2C or Inter Integrated Circuit is type of synchronous serial communication that capable to communicate with up to 127 slave devices as show in figure below.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"408\" src=\"https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2021\/09\/image-1024x408.png\" alt=\"\" class=\"wp-image-418\" srcset=\"https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2021\/09\/image-1024x408.png 1024w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2021\/09\/image-300x119.png 300w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2021\/09\/image-768x306.png 768w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2021\/09\/image-750x299.png 750w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2021\/09\/image-400x159.png 400w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2021\/09\/image-250x100.png 250w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2021\/09\/image.png 1130w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><figcaption>I2C bus<\/figcaption><\/figure><\/div>\n\n\n\n<p>Like UART communication, I2C only uses two wires to transmit data between devices:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>SDA (Serial Data): \u00a0The line for the master and slave to send and receive data. <\/li><li>SCL (Serial Clock): The line\u00a0that carries\u00a0the clock signal.<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">1.2: HOW I2C\u00a0WORKS<\/h2>\n\n\n\n<p>With I2C, data is transferred in&nbsp;<em>messages.&nbsp;<\/em>Messages are broken up into&nbsp;<em>frames<\/em>&nbsp;of data. Each&nbsp;message has an address frame that contains the binary address of the slave, and one or more data frames that contain the data being transmitted. The message also includes&nbsp;start and stop conditions, read\/write bits, and ACK\/NACK bits between each data frame:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><a href=\"https:\/\/www.circuitbasics.com\/wp-content\/uploads\/2016\/01\/Introduction-to-I2C-Message-Frame-and-Bit-2.png\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" src=\"https:\/\/www.circuitbasics.com\/wp-content\/uploads\/2016\/01\/Introduction-to-I2C-Message-Frame-and-Bit-2-1024x258.png\" alt=\"Introduction to I2C - Message, Frame, and Bit\" class=\"wp-image-420891\" \/><\/a><\/figure><\/div>\n\n\n\n<p><strong>Start Condition:<\/strong>&nbsp;The SDA line switches from a high voltage&nbsp;level to a low voltage level&nbsp;<em>before<\/em>&nbsp;the SCL line switches from high to low.<\/p>\n\n\n\n<p><strong>Stop Condition:<\/strong>&nbsp;The SDA line switches from a low voltage&nbsp;level to a high voltage level&nbsp;<em>after<\/em>&nbsp;the SCL line switches from low to high.<\/p>\n\n\n\n<p><strong>Address Frame:<\/strong>&nbsp;A 7 or 10 bit sequence unique to each slave that identifies the slave when the master wants to talk to it.<\/p>\n\n\n\n<p><strong>Read\/Write Bit:&nbsp;<\/strong>A single bit specifying whether the master is sending data to the slave (low voltage level) or requesting data from it (high voltage level).<\/p>\n\n\n\n<p><strong>ACK\/NACK Bit:<\/strong>\u00a0Each frame in a\u00a0message is followed by an acknowledge\/no-acknowledge bit. If an\u00a0address frame or data frame was successfully received, an ACK bit is returned to the sender from the receiving device.<\/p>\n\n\n\n<p>For more information and detailed explanations refer to this NXP documentation (<a href=\"https:\/\/www.nxp.com\/docs\/en\/user-guide\/UM10204.pdf\" data-type=\"URL\" data-id=\"https:\/\/www.nxp.com\/docs\/en\/user-guide\/UM10204.pdf\" target=\"_blank\" rel=\"noreferrer noopener\">here<\/a>).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">2.1: I2C setup for STM32F4: locating pins<\/h2>\n\n\n\n<p>First we need to find which pins are for I2C1 bus.<\/p>\n\n\n\n<p>From Table 9 of STM32F411 datasheet we find the pins for I2C1<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"692\" src=\"https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2021\/09\/Screen-Shot-2021-09-16-at-7.15.00-AM-1024x692.png\" alt=\"\" class=\"wp-image-419\" srcset=\"https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2021\/09\/Screen-Shot-2021-09-16-at-7.15.00-AM-1024x692.png 1024w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2021\/09\/Screen-Shot-2021-09-16-at-7.15.00-AM-300x203.png 300w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2021\/09\/Screen-Shot-2021-09-16-at-7.15.00-AM-768x519.png 768w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2021\/09\/Screen-Shot-2021-09-16-at-7.15.00-AM-1536x1038.png 1536w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2021\/09\/Screen-Shot-2021-09-16-at-7.15.00-AM-2048x1384.png 2048w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2021\/09\/Screen-Shot-2021-09-16-at-7.15.00-AM-1150x777.png 1150w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2021\/09\/Screen-Shot-2021-09-16-at-7.15.00-AM-750x507.png 750w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2021\/09\/Screen-Shot-2021-09-16-at-7.15.00-AM-400x270.png 400w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2021\/09\/Screen-Shot-2021-09-16-at-7.15.00-AM-250x169.png 250w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><figcaption>From the table, we can use PB6 &amp; PB7 or PB8 and PB9 for I2C1. In this guide, we will PB8 and PB9 and the alternate function is AF04.<\/figcaption><\/figure>\n\n\n\n<p>Now We find which bus provides the clock to I2C1. This can be found in datasheet of STM32F411 <\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"692\" src=\"https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2021\/09\/Screen-Shot-2021-09-16-at-7.20.28-AM-1024x692.png\" alt=\"\" class=\"wp-image-420\" srcset=\"https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2021\/09\/Screen-Shot-2021-09-16-at-7.20.28-AM-1024x692.png 1024w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2021\/09\/Screen-Shot-2021-09-16-at-7.20.28-AM-300x203.png 300w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2021\/09\/Screen-Shot-2021-09-16-at-7.20.28-AM-768x519.png 768w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2021\/09\/Screen-Shot-2021-09-16-at-7.20.28-AM-1536x1038.png 1536w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2021\/09\/Screen-Shot-2021-09-16-at-7.20.28-AM-2048x1384.png 2048w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2021\/09\/Screen-Shot-2021-09-16-at-7.20.28-AM-1150x777.png 1150w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2021\/09\/Screen-Shot-2021-09-16-at-7.20.28-AM-750x507.png 750w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2021\/09\/Screen-Shot-2021-09-16-at-7.20.28-AM-400x270.png 400w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2021\/09\/Screen-Shot-2021-09-16-at-7.20.28-AM-250x169.png 250w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>From the block diagram, the I2C1 is connected to APB1.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">2.2: I2C setup for STM32F4: Configuration<\/h2>\n\n\n\n<p>Now We need to enable clock access to I2C1 and GPIOB as following:<\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;showPanel&quot;:true,&quot;languageLabel&quot;:&quot;language&quot;,&quot;fullScreenButton&quot;:true,&quot;copyButton&quot;:true,&quot;mode&quot;:&quot;clike&quot;,&quot;mime&quot;:&quot;text\/x-csrc&quot;,&quot;theme&quot;:&quot;dracula&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;fileName&quot;:&quot;&quot;,&quot;language&quot;:&quot;C&quot;,&quot;maxHeight&quot;:&quot;400px&quot;,&quot;modeName&quot;:&quot;c&quot;}\">RCC-&gt;AHB1ENR|=RCC_AHB1ENR_GPIOBEN; \/\/enable gpiob clock\nRCC-&gt;APB1ENR|=RCC_APB1ENR_I2C1EN; \/\/enable i2c1 clock<\/pre><\/div>\n\n\n\n<p>Then configure the pins as alternate function and AF4:<\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;showPanel&quot;:true,&quot;languageLabel&quot;:&quot;language&quot;,&quot;fullScreenButton&quot;:true,&quot;copyButton&quot;:true,&quot;mode&quot;:&quot;clike&quot;,&quot;mime&quot;:&quot;text\/x-csrc&quot;,&quot;theme&quot;:&quot;dracula&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;fileName&quot;:&quot;&quot;,&quot;language&quot;:&quot;C&quot;,&quot;maxHeight&quot;:&quot;400px&quot;,&quot;modeName&quot;:&quot;c&quot;}\">GPIOB-&gt;MODER|=0xA0000; \/\/set pb8and9 to alternative function\nGPIOB-&gt;AFR[1]|=0x44;<\/pre><\/div>\n\n\n\n<p>Now we need to set the most important feature of I2C which the pins must be open drain as following<\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;showPanel&quot;:true,&quot;languageLabel&quot;:&quot;language&quot;,&quot;fullScreenButton&quot;:true,&quot;copyButton&quot;:true,&quot;mode&quot;:&quot;clike&quot;,&quot;mime&quot;:&quot;text\/x-csrc&quot;,&quot;theme&quot;:&quot;dracula&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;fileName&quot;:&quot;&quot;,&quot;language&quot;:&quot;C&quot;,&quot;maxHeight&quot;:&quot;400px&quot;,&quot;modeName&quot;:&quot;c&quot;}\">GPIOB-&gt;OTYPER|=GPIO_OTYPER_OT8|GPIO_OTYPER_OT9; \/\/set pb8 and pb9 as open drain<\/pre><\/div>\n\n\n\n<p>Now we need to configure the I2C as following<\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;showPanel&quot;:true,&quot;languageLabel&quot;:&quot;language&quot;,&quot;fullScreenButton&quot;:true,&quot;copyButton&quot;:true,&quot;mode&quot;:&quot;clike&quot;,&quot;mime&quot;:&quot;text\/x-csrc&quot;,&quot;theme&quot;:&quot;dracula&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;fileName&quot;:&quot;&quot;,&quot;language&quot;:&quot;C&quot;,&quot;maxHeight&quot;:&quot;400px&quot;,&quot;modeName&quot;:&quot;c&quot;}\">I2C1-&gt;CR1=I2C_CR1_SWRST;\/\/reset i2c\nI2C1-&gt;CR1&amp;=~I2C_CR1_SWRST;\/\/ release reset i2c\t\nI2C1-&gt;CR2|=16;\/\/set clock source to 16MHz\nI2C1-&gt;CCR=80;  \/\/based on calculation\nI2C1-&gt;TRISE=17; \/\/output max rise \nI2C1-&gt;CR1|=I2C_CR1_PE; \/\/enable I2C<\/pre><\/div>\n\n\n\n<p>Set up for I2C is completed.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">2.3: I2C setup for STM32F4: I2C scan bus<\/h2>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;showPanel&quot;:true,&quot;languageLabel&quot;:&quot;language&quot;,&quot;fullScreenButton&quot;:true,&quot;copyButton&quot;:true,&quot;mode&quot;:&quot;clike&quot;,&quot;mime&quot;:&quot;text\/x-csrc&quot;,&quot;theme&quot;:&quot;dracula&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;fileName&quot;:&quot;&quot;,&quot;language&quot;:&quot;C&quot;,&quot;maxHeight&quot;:&quot;400px&quot;,&quot;modeName&quot;:&quot;c&quot;}\">void i2c_bus_scan(void)\n{        \n\t\t\t\t\tint a=0; \/\/address variable\n         for (uint8_t i=0;i&lt;128;i++) \/\/go through all 127 address\n   {\n            I2C1-&gt;CR1 |= I2C_CR1_START; \/\/generate start \n            while(!(I2C1-&gt;SR1 &amp; I2C_SR1_SB)); \/\/ wait to start to be generated\n            I2C1-&gt;DR=(i&lt;&lt;1|0); \/\/ transmit the address\n            while(!(I2C1-&gt;SR1)|!(I2C1-&gt;SR2)){}; \/\/clear status register\n            I2C1-&gt;CR1 |= I2C_CR1_STOP; \/\/generate stop condition\n            delay(100);\/\/minium wait time is 40 uS, but for sure, leave it 100 uS\n            a=(I2C1-&gt;SR1&amp;I2C_SR1_ADDR); \/\/read the status register address set\n            if (a==2)\/\/if the address is valid\n         {\n\t\t\t\t\t \/\/print the address\n\t\t\t\t\t sprintf(data,&quot;Found I2C device at adress 0x%X (hexadecimal), or %d (decimal)\\r\\n&quot;,i,i);\n                UART_Write_String(data);\n         }\n     }\n}\n\n<\/pre><\/div>\n\n\n\n<p>The UART_Write_String function can be obtained from here (<a href=\"https:\/\/blog.embeddedexpert.io\/?p=341\" data-type=\"URL\" data-id=\"https:\/\/blog.embeddedexpert.io\/?p=341\" target=\"_blank\" rel=\"noreferrer noopener\">link<\/a>)<\/p>\n\n\n\n<p>or<\/p>\n\n\n\n<p>Simply download the entire project from here:<\/p>\n\n\n\n<div class=\"wp-block-file\"><a href=\"https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2021\/09\/i2c-scanner.zip\">i2c-scanner<\/a><a href=\"https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2021\/09\/i2c-scanner.zip\" class=\"wp-block-file__button\" download>Download<\/a><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">3. Results<\/h2>\n\n\n\n<p>Compile, upload the code and open your favourite terminal and you shall see the address of connected devices (Note: I got only 1 device connected)<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"528\" src=\"https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2021\/09\/Screen-Shot-2021-09-16-at-7.39.27-AM-1024x528.png\" alt=\"\" class=\"wp-image-422\" srcset=\"https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2021\/09\/Screen-Shot-2021-09-16-at-7.39.27-AM-1024x528.png 1024w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2021\/09\/Screen-Shot-2021-09-16-at-7.39.27-AM-300x155.png 300w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2021\/09\/Screen-Shot-2021-09-16-at-7.39.27-AM-768x396.png 768w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2021\/09\/Screen-Shot-2021-09-16-at-7.39.27-AM-1150x593.png 1150w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2021\/09\/Screen-Shot-2021-09-16-at-7.39.27-AM-750x387.png 750w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2021\/09\/Screen-Shot-2021-09-16-at-7.39.27-AM-400x206.png 400w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2021\/09\/Screen-Shot-2021-09-16-at-7.39.27-AM-250x129.png 250w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2021\/09\/Screen-Shot-2021-09-16-at-7.39.27-AM.png 1338w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Happy coding \ud83d\ude42<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In this guide, we shall discuss what is I2C and how to make an i2c bus scanner to scan the slave devices that connected to the i2c1 bus of STM32F411 In this guide we will cover the following: What is I2C I2C setup for stm32f4 I2C bus scanner code Results 1.1: What is I2C I2C [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2,11,12],"tags":[],"class_list":["post-416","post","type-post","status-publish","format-standard","hentry","category-embedded-systems","category-peripheral-drivers","category-stm32"],"_links":{"self":[{"href":"https:\/\/blog.embeddedexpert.io\/index.php?rest_route=\/wp\/v2\/posts\/416"}],"collection":[{"href":"https:\/\/blog.embeddedexpert.io\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.embeddedexpert.io\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.embeddedexpert.io\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.embeddedexpert.io\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=416"}],"version-history":[{"count":1,"href":"https:\/\/blog.embeddedexpert.io\/index.php?rest_route=\/wp\/v2\/posts\/416\/revisions"}],"predecessor-version":[{"id":423,"href":"https:\/\/blog.embeddedexpert.io\/index.php?rest_route=\/wp\/v2\/posts\/416\/revisions\/423"}],"wp:attachment":[{"href":"https:\/\/blog.embeddedexpert.io\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=416"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.embeddedexpert.io\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=416"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.embeddedexpert.io\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=416"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}