{"id":243,"date":"2012-05-02T01:54:43","date_gmt":"2012-05-01T23:54:43","guid":{"rendered":"http:\/\/electronicapractica.crearblog.com\/?p=243"},"modified":"2019-06-13T19:36:59","modified_gmt":"2019-06-13T17:36:59","slug":"introduccion-al-i2c-bus","status":"publish","type":"post","link":"https:\/\/www.diarioelectronicohoy.com\/blog\/introduccion-al-i2c-bus","title":{"rendered":"Introducci\u00f3n al I2C Bus"},"content":{"rendered":"<h2><strong>Introducci\u00f3n al I\u00b2C-bus. <span style=\"font-size: .7em; color: #ff0000;\">(Actualizada)<\/span><br \/>\n<\/strong><\/h2>\n<p style=\"text-align: justify;\">Hablar del I2C bus, en nuestros d\u00edas es, poco menos que arriesgado, hay que afinar mucho en lo que se dice, ya que cualquiera ha realizado su descripci\u00f3n y creo realmente que hay muy buenas descripciones y de esas, se bebe el conocimiento, por parte de muchos aficionados a la electr\u00f3nica, cuando tiene que utilizar esta t\u00e9cnica de transmisi\u00f3n de datos como es el I2C-bus. I2C es un acr\u00f3nimo de \u00abInter-Integrated Circuit\u00bb. En esta ocasi\u00f3n, espero exponer mi puntual experiencia y dar un poco de luz a los que est\u00e9n interesados en conocer los pasos a seguir para utilizar con \u00e9xito esta t\u00e9cnica de transmisi\u00f3n I2C.<\/p>\n<p style=\"text-align: justify;\">Hace ya muchos a\u00f1os cuando tuve conocimiento del sistema I2C bus, en aquellos momentos mi trabajo estaba relacionado directamente con la electr\u00f3nica m\u00e1s puntera de la \u00e9poca, lo que se conoc\u00eda como, <strong>\u00abla cresta de la ola\u00bb<\/strong>. Ciertamente que no estaba en mi camino el hacer pr\u00e1cticas (por motivos que no vienen al caso) de esta novedosa t\u00e9cnica que, present\u00f3 la firma \u00abPhilips Semiconductors\u00bb (ahora <a href=\"http:\/\/www.nxp.com\/profile\/\" target=\"_blank\" rel=\"noopener noreferrer\">NXP<\/a>) a principios de los 80s, sin embargo, si puse en manos de bastantes ingenieros de la \u00e9poca y las Universidades de la zona, la extensa informaci\u00f3n que prove\u00eda la mencionada empresa.<!--more--><\/p>\n<p style=\"text-align: justify;\">Los ingenieros de \u00abPhilips\u00bb vieron la necesidad de la simplificaci\u00f3n y normalizaci\u00f3n de las l\u00edneas de datos que viajan entre los diversos circuitos integrados en sus productos. Su soluci\u00f3n fue el bus I2C. Esto redujo el n\u00famero de cables a dos (SDA &#8211; los datos, y SCL &#8211; reloj).<\/p>\n<p style=\"text-align: justify;\">Esta documentaci\u00f3n, nace sabiendo que existen otras muchas m\u00e1s profundas, solamente pretende explicar desde mi punto de vista que es y como se comporta superficialmente una red I\u00b2C, por si alguien necesita un detalle diferente.<\/p>\n<p style=\"text-align: justify;\">Se supone que usted, domina el sistema binario, decimal codificado y hexadecimal, esto le servir\u00e1 para una mejor comprensi\u00f3n.<\/p>\n<h3><span style=\"color: #000080; font-size: 12pt;\"><strong>Un motivo para usar el I2C<\/strong><\/span><\/h3>\n<p style=\"text-align: justify;\">Es sabido que el playgrund de Arduino tiene una descripci\u00f3n sobre el <a href=\"http:\/\/www.arduino.cc\/playground\/Learning\/I2C\" target=\"_blank\" rel=\"noopener noreferrer\">I2C &#8211; TWI (Two-Wire Interface)<\/a>, se trata del I2C. En dicho documento, se habla del I2C y se refiere a enlaces relevantes, para los que tengan inter\u00e9s en el tema.<\/p>\n<p style=\"text-align: justify;\">Por mi parte, he de decir que, hasta hace alg\u00fan tiempo, no hab\u00eda puesto ning\u00fan empe\u00f1o en ampliar mis conocimientos sobre la transmisi\u00f3n de datos, tal vez por que no hab\u00eda tenido la necesidad. Sin embargo hace poco m\u00e1s de un a\u00f1o cuando empec\u00e9 a utilizar en mis ratos libres el Arduino, descubr\u00ed que dispon\u00eda de dos patillas que est\u00e1n dotadas de este protocolo o sistema de transmisi\u00f3n y bueno, mi inter\u00e9s no paso de la curiosidad del momento, por lo que no entre en detalle.<\/p>\n<p style=\"text-align: justify;\">Por aquellos d\u00edas, tuve un encuentro casual con un amigo que, me propuso realizar un sistema de acceso a una empresa. En el proyecto por denominarlo de alg\u00fan modo, se deb\u00eda controlar los veh\u00edculos que entraban y sal\u00edan de la empresa, por puertas de entrada y salida, el sistema deb\u00eda enviar datos a un PC central, en el cual se encuentran los permisos de los veh\u00edculos autorizados&#8230; En cierto momento del proyecto, se present\u00f3 la necesidad de utilizar el sistema del bus I\u00b2C, para economizar en las E\/S del Arduino y ese es el momento en el que surge la necesidad de conocer m\u00e1s a fondo el modo en que se basa y como trabaja el mencionado protocolo.<\/p>\n<p style=\"text-align: justify;\">Mis primeros paso fueron la adquisici\u00f3n de datos, aquellos libros de Philips que guarde, ahora ser\u00edan vitales, adem\u00e1s de informaci\u00f3n que, extraje de varios documentos de dominio p\u00fablico que, se encuentran en la red y otros libros actuales que lo relacionan con Arduino.<\/p>\n<p style=\"text-align: justify;\">Entre la documentaci\u00f3n de <a href=\"http:\/\/www.arduino.cc\/playground\/Learning\/I2C\" target=\"_blank\" rel=\"noopener noreferrer\">TWI (Two-Wire Interface)<\/a> que es incompleta y no explica cada funci\u00f3n, como corresponde a una funci\u00f3n I\u00b2C, los ejemplos de c\u00f3digo que son anticuados y de vez en cuando incorrectos, mi carencia de familiaridad con I\u00b2C en general, adem\u00e1s, no teniendo un circuito I\u00b2C en funcionamiento como referencia y desde luego mis despistes y mis muchos errores, esto puso por un momento a relucir una falta de experiencia desconcertante por mi parte. Esto fue un reto.<\/p>\n<p style=\"text-align: justify;\">Despu\u00e9s, me procur\u00e9 una serie de circuitos integrados que tuvieran este protocolo entre sus cualidades, encontr\u00e9 bastantes dispositivos basados en este protocolo del I\u00b2C y ya s\u00f3lo ten\u00eda que poner manos a la obra, practicar y practicar, buscar la forma de servirme de aquellas posibilidades y adaptarlas a mis necesidades. No pas\u00f3 mucho tiempo para tener el \u00e9xito esperado, al principio estuvo el tema de direccionar cada dispositivo, todos los dispositivos dise\u00f1ados para funcionar en este bus poseen su propia y \u00fanica direcci\u00f3n de acceso, preestablecida por el fabricante. Poder leer una direcci\u00f3n, ni que decir, de escribir en una direcci\u00f3n, recomiendo leer las HD del fabricante para conocer dicha direcci\u00f3n. Esto ya pas\u00f3, con esto quiero decir a los interesados que, no es tan dif\u00edcil aprender y aplicar el protocolo del bus I\u00b2C.<\/p>\n<h3><span style=\"color: #000080; font-size: 12pt;\"><strong>QU\u00c9 ES EL I\u00b2C-BUS?<\/strong><\/span><\/h3>\n<p style=\"text-align: justify;\">El <strong>I\u00b2C bus<\/strong>, no tan s\u00f3lo son dos cables, usados para realizar una transmisi\u00f3n bidireccional de datos entre distintos sistemas gobernados por microcontroladores de forma eficaz. Veremos, c\u00f3mo podemos controlar un importante n\u00famero de dispositivos con nuestro Arduino, aunque, no es f\u00e1cil de dominar. Se trata de, un bus bidireccional que utiliza dos l\u00edneas, una de datos serie (SDA) y otra de reloj serie (SCL), que requiere resistencias de polarizaci\u00f3n a positivo (RPA). SCL es la l\u00ednea de reloj, se utiliza para sincronizar todos los datos SDA de las transferencias durante <strong>I\u00b2C bus<\/strong>. SDA es la l\u00ednea de datos.<\/p>\n<p style=\"text-align: justify;\">Las l\u00edneas SCL y SDA est\u00e1n conectadas a todos los dispositivos en el <strong>I\u00b2C bus<\/strong>. Ambas l\u00edneas SCL y SDA son del tipo drenador abierto asociados a un transistor de efecto de campo (o FET), es decir, un estado similar al de colector abierto. Esto significa que el chip puede manejar su salida a BAJO, pero no puede manejar a ALTO. Para que la l\u00ednea pueda ir a ALTO, se deben proporcionar resistencias de polarizaci\u00f3n a 5V. Necesita de una resistencia de la l\u00ednea SCL a la l\u00ednea de 5V y otra de la l\u00ednea SDA a la l\u00ednea de 5V. S\u00f3lo necesita un conjunto de resistencias de RPA (pull-up) para todo el <strong>I\u00b2C bus<\/strong>, no son necesarias para cada dispositivo. La alimentaci\u00f3n del sistema, debe tener una masa com\u00fan, tambi\u00e9n puede haber una alimentaci\u00f3n compartida que, se distribuye entre los distintos dispositivos.<\/p>\n<p style=\"text-align: justify;\">Los dispositivos en el I\u00b2C bus son maestros o esclavos. <strong>El maestro, es siempre el dispositivo que maneja la l\u00ednea de reloj SCL<\/strong>. Los esclavos, son los dispositivos que responden al maestro. Un esclavo no puede iniciar una transferencia a trav\u00e9s del I\u00b2C bus, s\u00f3lo un maestro puede hacer esa funci\u00f3n. Generalmente son, varios esclavos en el I\u00b2C bus, sin embargo, normalmente hay un solo maestro. Es posible tener varios maestros, pero es inusual y no se comentar\u00e1 aqu\u00ed. <strong>Los esclavos, nunca inician una transferencia<\/strong>. Tanto el maestro, como el esclavo puede transferir datos a trav\u00e9s del I\u00b2C bus, pero la transferencia siempre es controlada por el maestro.<\/p>\n<p style=\"text-align: center;\"><a href=\"https:\/\/www.diarioelectronicohoy.com\/blog\/introduccion-al-i2c-bus\/i2ca\" rel=\"attachment wp-att-3379\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-3379\" src=\"https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2012\/05\/i2ca-300x108.gif\" alt=\"i2ca\" width=\"300\" height=\"108\" \/><\/a><\/p>\n<p style=\"text-align: justify;\">Todas las direcciones <strong>I\u00b2C bus<\/strong> son de 7 bits o 10 bits. Esto significa que, se pueden tener hasta 128 dispositivos en el bus I\u00b2C, ya que un n\u00famero de 7bit puede estar de 0 a 127. El I\u00b2C tiene un dise\u00f1o de espacio de referencia de 7 bits de direcciones, reservado con 16 direcciones, de modo que finalmente, pueden comunicarse en el mismo bus un m\u00e1ximo de 112 nodos. El n\u00famero m\u00e1ximo de nodos est\u00e1 limitado por el espacio de direcciones y tambi\u00e9n por la capacidad total de los buses de 400 pF, lo que restringe la pr\u00e1ctica de comunicaci\u00f3n, a distancias de unos pocos metros.<\/p>\n<p style=\"text-align: justify;\">Cuando se env\u00eda la direcci\u00f3n de 7 bits, siempre seguimos enviando 8 bits. El <strong>bit<\/strong> extra (bit 8\u00ba) se usa para informar al esclavo si el maestro est\u00e1 escribiendo o leyendo de \u00e9l. Si el <strong>bit<\/strong> 8\u00ba es 0, el maestro est\u00e1 escribiendo al esclavo. Si el <strong>bit<\/strong> 8\u00ba es 1, el maestro esta en la lectura del esclavo. Existen disposiciones en la norma de I\u00b2C para entornos multi-master, as\u00ed como de 10 bits frente a la m\u00e1s simple y la m\u00e1s com\u00fanmente usada, es la configuraci\u00f3n de un solo maestro, de 7 bits de direccionamiento.<\/p>\n<p style=\"text-align: justify;\">Yo se que, la localizaci\u00f3n de la direcci\u00f3n de 7 bits en la parte superior del byte, es una fuente de confusi\u00f3n para los reci\u00e9n llegados, pero intentar\u00e9 hacer un esfuerzo para dejar lo m\u00e1s claro posible este punto. No deber\u00eda haber ning\u00fan problema en que, los tres bits A0, A1 y A2 correspondientes a los pines 1, 2 y 3 seleccionan la direcci\u00f3n del dispositivo, del P0 al P7 son los puertos de E\/S e INT, es una salida de interrupci\u00f3n que no lo usaremos. De modo que, para poner en servicio un <a href=\"http:\/\/www.hispavila.com\/3ds\/atmega\/pcf8574expansor_datos\/pcf8574_esp.pdf\" target=\"_blank\" rel=\"noopener noreferrer\">PDF8574<\/a>, son necesarias dos cosas, la direcci\u00f3n del dispositivo (b0100000) y un byte de datos para el pin de salida que se necesita.<\/p>\n<p style=\"text-align: justify;\"><a href=\"https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2012\/05\/definicion-interface.gif\" target=\"_blank\" rel=\"noopener noreferrer\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1838\" title=\"definicion interface\" src=\"https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2012\/05\/definicion-interface.gif\" alt=\"\" width=\"585\" height=\"146\" srcset=\"https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2012\/05\/definicion-interface.gif 585w, https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2012\/05\/definicion-interface-300x74.gif 300w, https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2012\/05\/definicion-interface-500x124.gif 500w\" sizes=\"auto, (max-width: 585px) 100vw, 585px\" \/><\/a>De modo que, si ponemos los pines A0 <span style=\"font-family: Arial;\">~<\/span> A2 a masa o GND, <strong>la direcci\u00f3n de nuestro dispositivo<\/strong> en el sistema binario ser\u00e1 0100000, o 0x20 en formato hexadecimal. Y <strong>con los bytes de datos<\/strong>, haremos lo mismo, <strong>configurando as\u00ed los pines de salida<\/strong>, por ejemplo: si queremos poner todos a Alto (H), enviamos 0 en binario que, en hexadecimal es 0, o bien para poner los cuatro primeros a <strong>H<\/strong> y los segundos cuatro a <strong>L<\/strong>. Se utiliza 00001111 en binario que, en hexadecimal es 0x0F.<\/p>\n<p style=\"text-align: justify;\">\u00bfSe ha dado cuenta? Por qu\u00e9 raz\u00f3n estos datos parecen estar al rev\u00e9s de lo que se ha comentado. Y \u00bfpor qu\u00e9 enviamos un cero, convirtiendo todos los pines a H? El motivo es, que las E\/S del PCH8574 son sumideros de corriente, esto quiere decir que, las corrientes circulan desde los +5V, a trav\u00e9s de las cargas hacia los pines de E\/S del dispositivo. No olvidemos que estamos configurando los datos del segundo byte y siguientes. Tratamos con las entradas\/salidas. Por dicho motivo, los valores de E\/S que establezcamos, se ver\u00e1n complementados en nuestra instrucci\u00f3n.<\/p>\n<p style=\"text-align: justify;\">Adem\u00e1s, en la instrucci\u00f3n, no hay que olvidar el <strong>bit0<\/strong> (R\/W), el de menor peso <strong>LSB<\/strong> (o Least Significant Bit, en ingl\u00e9s) que le indica al bus I2C, la funci\u00f3n del maestro, seg\u00fan su valor (0 para leer y 1 para escribir).<\/p>\n<p style=\"text-align: justify;\"><strong>Nota:<\/strong> El &#8216;octavo bit&#8217; (<strong>LSB<\/strong>) es el que indica si la operaci\u00f3n es, de lectura o escritura y es a\u00f1adido autom\u00e1ticamente por el Arduino, por ese motivo, las direcciones I2C deben ser de 7 bits.<\/p>\n<p style=\"text-align: justify;\">Por ejemplo, para escribir en la direcci\u00f3n 0x21, realmente se tiene que enviar 0x42, que es el 21 desplazado 1 bit a la izquierda, para insertar el bit de lectura\/escritura (R\/W) en el byte (recuerde 8bits). Veamos:<\/p>\n<pre>Bits  76543210\r\n    b 00100001  = 21 h; b00100001 x 10 = b01000010;\r\n    b 01000010  = 42 h<\/pre>\n<p style=\"text-align: justify;\">Esto es la base del protocolo <strong>I\u00b2C-bus<\/strong>, el bus tiene dos funciones para los nodos: <strong>maestro<\/strong> y <strong>esclavo<\/strong>. El resultado de este sistema produce un anillo compuesto por dos v\u00edas (hilos) para el desarrollo de la funci\u00f3n de comunicarse entre s\u00ed, los dispositivos interconectados a las mencionadas v\u00edas, esto permite comunicarse entre ellos mismos con un protocolo que, consiste en que en cada momento hay un <strong>MAESTRO<\/strong> y el resto son <strong>ESCLAVOS<\/strong>. Un s\u00edmil ser\u00eda que, &#8211;<em><strong>mientras uno habla, el resto escuchan<\/strong><\/em>-, es decir, <strong>uno escribe y el resto leen<\/strong>.<\/p>\n<p style=\"text-align: justify;\"><a href=\"http:\/\/s2.subirimagenes.com\/privadas\/previo\/thump_1259586transferenciai2c.gif\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" src=\"http:\/\/s2.subirimagenes.com\/privadas\/previo\/thump_1259586transferenciai2c.gif\" alt=\"\" width=\"513\" height=\"200\" \/><\/a><\/p>\n<p style=\"text-align: justify;\">En la figura anterior se puede apreciar que, la condici\u00f3n <strong>START<\/strong> est\u00e1 definida, cuando la se\u00f1al de reloj SCL permanece estable ALTO (<strong>H<\/strong>) adem\u00e1s, el nivel de la se\u00f1al de \u00abno reconocimiento\u00bb, debe ser tambi\u00e9n ALTA (<strong>H<\/strong>), si en ese preciso instante se produce un descenso (flanco de bajada) en la se\u00f1al de datos, autom\u00e1ticamente se produce la condici\u00f3n de <strong>START<\/strong> (inicio) de la transmisi\u00f3n y el dispositivo que la produjo se convierte en <strong>MAESTRO<\/strong>, dando comienzo a la transmisi\u00f3n. El pulso de reconocer o reconocimiento, conocido como <strong>ACK<\/strong> (del ingl\u00e9s Acknowledge), se logra colocando la l\u00ednea de datos a un nivel l\u00f3gico bajo, durante el transcurso del noveno pulso de reloj. Yo se, que esta parte, es mas compleja de lo que parece, debe observar con atenci\u00f3n los pasos que sigue el inicio de una transmisi\u00f3n en la figura que sigue.<\/p>\n<p style=\"text-align: justify;\"><a href=\"http:\/\/s3.subirimagenes.com:81\/privadas\/previo\/thump_1259588transfer1.gif\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" src=\"http:\/\/s3.subirimagenes.com:81\/privadas\/previo\/thump_1259588transfer1.gif\" alt=\"\" width=\"457\" height=\"200\" \/><\/a>Yo se, que esta parte, es mas compleja de lo que parece. <strong>Es muy importante<\/strong>, debe observar con atenci\u00f3n, los cuatro pasos que sigue el inicio de una transmisi\u00f3n, son los 4 bytes de inicio, vea la figura anterior<\/p>\n<ol>\n<li style=\"text-align: justify;\"><strong>En el primer paso<\/strong>, el <strong>byte<\/strong> que se env\u00eda es <strong>START<\/strong>, despu\u00e9s de la condici\u00f3n de <strong>Bit inicio<\/strong> (START) se env\u00eda un byte que, contiene <strong>siete bits<\/strong> que componen la direcci\u00f3n del dispositivo que se quiere seleccionar y un <strong>octavo bit<\/strong> <strong>R\/W<\/strong> (que corresponde a la operaci\u00f3n que se quiere realizar con \u00e9l, lectura o escritura).<\/li>\n<li style=\"text-align: justify;\"><strong>El segundo paso<\/strong>, este <strong>byte<\/strong>, contiene la direcci\u00f3n del registro que se desea leer\/escribir. Puede realizarse un reinicio como se muestra en la figura.<\/li>\n<li style=\"text-align: justify;\"><strong>El tercer paso<\/strong>, aqu\u00ed se escribe la direcci\u00f3n con el bit menos significativo <strong>LSB<\/strong> a nivel 1, para <strong>indicar que se lee<\/strong>.<\/li>\n<li><strong>El cuarto paso<\/strong> y siguientes contin\u00faan la misma funci\u00f3n de lectura, no tiene por qu\u00e9 ser s\u00f3lo uno.<\/li>\n<\/ol>\n<p style=\"text-align: justify;\">A cada byte transferido al bus, le sigue un <strong>noveno pulso de reloj<\/strong> durante el cual, el dispositivo receptor, debe generar un pulso de reconocimiento.<\/p>\n<p style=\"text-align: justify;\">Para pasar a la funci\u00f3n de escritura en el mismo dispositivo, puede realizarse, enviando un bit de <strong>STOP<\/strong> o de reinicio, considerado como parada e inicio. El paso que sigue es, escribir el byte que contiene siete bits que componen la direcci\u00f3n del dispositivo que se quiere seleccionar y un octavo bit a 0 que corresponde a la operaci\u00f3n que se quiere realizar con \u00e9l, ahora escritura. Y los pasos siguientes pueden ser como en el caso anterior.<\/p>\n<p style=\"text-align: justify;\">Dicho esto, se debe resaltar que en el I\u00b2C-bus se definen tres tipos b\u00e1sicos de mensajes, cada uno de los cuales comienza con un START y se termina con una STOP.<\/p>\n<pre>a) Simple mensaje, donde un maestro escribe datos a un esclavo.\r\nb) Simple mensaje, donde un maestro lee datos de un esclavo.\r\nc) Mensajes combinados, donde un maestro publica y al menos dos\r\n  leen\/escriben a uno o varios esclavos.<\/pre>\n<p style=\"text-align: justify;\">En un mensaje combinado, cada uno, sea de lectura o escritura comienza con un START y la direcci\u00f3n de esclavo. Despu\u00e9s del primer START, tambi\u00e9n se pueden hacer llamados repetidos bits de START, esto confirma que repetidos bits START no vienen precedidos por bits de STOP, que es como los esclavos conocen la pr\u00f3xima transferencia que, es parte del mismo mensaje. Todo esclavo puede s\u00f3lo responder a mensajes particulares, tal como se define por su documentaci\u00f3n de producto.<\/p>\n<p style=\"text-align: justify;\">Cuando el maestro ha terminado de escribir todos los datos en el esclavo, se env\u00eda una secuencia de parada que completa la transacci\u00f3n. As\u00ed que para escribir en un dispositivo esclavo:<\/p>\n<pre>1. Enviar una secuencia de inicio (START).\r\n2. Enviar la direcci\u00f3n I2C del esclavo m\u00e1s el bit bajo\r\n   <strong>R<\/strong>\/<strong>W<\/strong>.(0xC0 = b1100 000<strong>0<\/strong>)\r\n3. Enviar el n\u00famero de registro interno al que se quiere\r\n   escribir.(ej. 0x00 = b0000 0000)\r\n4. Enviar el byte de datos. (0x01 = b 0000 0001)\r\n5. [Opcionalmente, env\u00ede algunos otros bytes de datos].\r\n6. Enviar la secuencia de parada (STOP).<\/pre>\n<p style=\"text-align: justify;\">Para lograr este prop\u00f3sito, se parte de una palabra de direcci\u00f3n, un byte, en los que debemos distinguir: el bit START, con direcci\u00f3n del esclavo al que interrogar\u00e1. Esta direcci\u00f3n est\u00e1 formada por 4 bits de c\u00f3digo de control m\u00e1s tres bits (A0..A2) de selecci\u00f3n de dispositivo y el bit de escritura \/lectura (R\/W), por \u00faltimo se env\u00eda el bit ACK (<strong>reconocer<\/strong>) por que es el maestro el que est\u00e1 transmitiendo.<\/p>\n<p style=\"margin-top: 12px; margin-bottom: 12px;\" align=\"justify\"><a href=\"http:\/\/s2.subirimagenes.com\/privadas\/previo\/thump_1259590deviceaddressing.gif\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" src=\"http:\/\/s2.subirimagenes.com\/privadas\/previo\/thump_1259590deviceaddressing.gif\" alt=\"\" width=\"328\" height=\"200\" \/><\/a><\/p>\n<h3><a name=\"FUNCI\u00d3N_ESCRITURA.\"><\/a><span style=\"color: #000080; font-size: 12pt;\"><strong>FUNCI\u00d3N ESCRITURA.<\/strong><\/span><\/h3>\n<p style=\"text-align: justify;\">Cuando un dispositivo quiere \u00abdecir algo\u00bb se dirige al dispositivo con el que quiere hablar, env\u00eda una se\u00f1al START (<strong>inicio<\/strong>) condicional y se procede al env\u00edo de un byte con los siete bits que componen la direcci\u00f3n del dispositivo esclavo con el que se quiere comunicar, mas un octavo bit de menor peso que corresponde con la operaci\u00f3n deseada (E\/L), <strong>escritura<\/strong> = <strong>0<\/strong> (enviar al esclavo) y <strong>lectura<\/strong> = <strong>1<\/strong> (recibir del esclavo), seguido del bit <em>reconocer<\/em> ACK.<\/p>\n<p style=\"text-align: justify;\">La direcci\u00f3n enviada es comparada por cada uno de los esclavos del bus con su propia direcci\u00f3n, si ambas coinciden, el esclavo se considera direccionado como esclavo-receptor o esclavo-transmisor dependiendo del bit de menor peso E\/L. El esclavo responde enviando un bit de <em>reconocer<\/em> ACK que le indica al dispositivo maestro que el esclavo reconoce la solicitud y est\u00e1 en condiciones de comunicarse. Y comienza el intercambio de informaci\u00f3n entre ambos dispositivos.<\/p>\n<p style=\"text-align: justify;\">El maestro env\u00eda la direcci\u00f3n del registro interno del dispositivo, en el que se desea leer o escribir, el esclavo responde con otro bit de <em>reconocer<\/em>, ahora el maestro puede empezar a leer o escribir bytes de datos. Todos los bytes de datos deben constar de 8 bits, el n\u00famero m\u00e1ximo de bytes que pueden ser enviados en una transmisi\u00f3n no est\u00e1 restringido, siendo el esclavo quien fija esta cantidad dependiendo de sus caracter\u00edsticas. Esto se consigue por que cada byte le\u00eddo\/escrito por el maestro debe ser obligatoriamente reconocido por un bit de <em>reconocer<\/em> por el dispositivo maestro\/esclavo.<\/p>\n<p style=\"text-align: justify;\">Es conveniente recordar estos puntos que, el n\u00famero de bytes de datos transferidos entre las condiciones de inicio y parada del transmisor al receptor no esta limitado. Cada byte de ocho bits es seguido por un bit <em>reconocer<\/em> (ver Fig. 6). El bit <em>reconocer<\/em> es un nivel ALTO puesto en el bus por el transmisor mientras que el maestro genera un pulso de reloj extra <em>reconocer<\/em> relacionado.<\/p>\n<p style=\"text-align: justify;\">Un receptor esclavo cuando es direccionado debe generar un <em>reconocer<\/em> despu\u00e9s de la recepci\u00f3n de cada byte. Tambi\u00e9n un maestro debe generar un <em>reconocer<\/em> despu\u00e9s de la recepci\u00f3n de cada byte que ha sido registrado desde el esclavo transmisor. El dispositivo que reconoce tiene que poner a BAJO la l\u00ednea SDA durante el pulso de reloj <em>reconocer<\/em>, por lo que la l\u00ednea SDA es estable BAJO, durante el per\u00edodo ALTO del pulso de reloj <em>reconocer<\/em> relacionado, los tiempos de configuraci\u00f3n y mantenimiento deben ser tenidos en cuenta.<\/p>\n<p style=\"text-align: justify;\">A pesar de que el maestro normalmente controla el estado de la l\u00ednea de reloj SCL , puede que un esclavo de baja velocidad o que un esclavo deba detener la transferencia de datos mientras efect\u00faa otra funci\u00f3n, podr\u00eda forzar la l\u00ednea SCL a nivel bajo. Esto har\u00eda que el maestro entrase en un estado de espera, durante el cual, no transmitir\u00e1 informaci\u00f3n esperando a que el esclavo est\u00e9 listo para continuar la transferencia en el punto donde hab\u00eda sido detenida. Cuando finaliza la comunicaci\u00f3n, el maestro transmite una condici\u00f3n de \u00abstop\u00bb para dejar libre el bus.<\/p>\n<p style=\"text-align: justify;\"><a href=\"https:\/\/www.diarioelectronicohoy.com\/blog\/introduccion-al-i2c-bus\/figura-6-escritura\" rel=\"attachment wp-att-3380\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-3380\" src=\"https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2012\/05\/figura-6-escritura-300x122.jpg\" alt=\"figura-6-escritura\" width=\"300\" height=\"122\" srcset=\"https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2012\/05\/figura-6-escritura-300x122.jpg 300w, https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2012\/05\/figura-6-escritura-768x313.jpg 768w, https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2012\/05\/figura-6-escritura.jpg 1008w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><a href=\"http:\/\/www.hispavila.com\/3ds\/atmega\/intro_i2c_datos\/figura-6-escritura.jpg\" target=\"_blank\" rel=\"noopener noreferrer\"><br \/>\n<\/a><span style=\"color: #000080; font-size: 12pt;\"><strong>FUNCION LECTURA.<\/strong><\/span><\/p>\n<p style=\"text-align: justify;\">La figura que sigue corresponde al registro en el modo lectura. Siga las se\u00f1ales de la figura para comprender su funcionamiento.<\/p>\n<p style=\"text-align: center;\"><a href=\"https:\/\/www.diarioelectronicohoy.com\/blog\/introduccion-al-i2c-bus\/figura-8-lectura\" rel=\"attachment wp-att-3381\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-3381\" src=\"https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2012\/05\/figura-8-lectura-300x118.jpg\" alt=\"figura-8-lectura\" width=\"300\" height=\"118\" srcset=\"https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2012\/05\/figura-8-lectura-300x118.jpg 300w, https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2012\/05\/figura-8-lectura-768x303.jpg 768w, https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2012\/05\/figura-8-lectura.jpg 1007w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p style=\"text-align: justify;\">Esto es para comunicaciones simples I\u00b2C casi todo, pero hay una complicaci\u00f3n m\u00e1s. Cuando el maestro lee del esclavo, es el esclavo el que coloca los datos sobre la l\u00ednea SDA, pero es el maestro quien controla el reloj. \u00bfQu\u00e9 pasa si el esclavo no est\u00e1 listo para enviar los datos? Con dispositivos tales como memorias EEPROM esto no es un problema, pero cuando el dispositivo esclavo es en realidad un microprocesador con otras cosas que hacer, puede ser un problema.<\/p>\n<p style=\"text-align: justify;\">El microprocesador del dispositivo esclavo tendr\u00e1 que ir a una rutina de interrupci\u00f3n, guardar\u00e1 sus registros de trabajo, averiguar\u00e1 de que direcci\u00f3n quiere leer el maestro, para obtener los datos y colocarlos en su registro de transmisi\u00f3n. Esto puede tomar muchos uS para que ocurra, mientras que el maestro est\u00e1 felizmente enviando pulsos de reloj por la l\u00ednea SCL que, el esclavo no puede responder.<\/p>\n<p style=\"text-align: justify;\">El protocolo I\u00b2C proporciona una soluci\u00f3n a esto: el esclavo est\u00e1 autorizado a mantener la l\u00ednea SCL baja. Esto se llama reloj de estiramiento. Cuando el esclavo recibe la orden de lectura del maestro, este mantiene la l\u00ednea de reloj baja. El microprocesador obtiene los datos solicitados, los coloca en el registro de transmisi\u00f3n y libera la l\u00ednea de reloj que habilita la resistencia RPA para finalmente dejarla a alto.<\/p>\n<p style=\"text-align: justify;\">Desde el punto de vista de los maestros, se emitir\u00e1 el primer pulso de reloj de lectura, haciendo SCL ALTO y luego verificar\u00e1 si realmente se ha ido a ALTO. Si es todav\u00eda BAJO, entonces es el esclavo quien lo mantendr\u00e1 BAJO y el maestro deber\u00eda esperar hasta que este vaya ALTO antes de continuar. Por suerte, los puertos de hardware I2C en la mayor\u00eda de los microprocesadores se encargar\u00e1 de forma autom\u00e1tica.<\/p>\n<h3><span style=\"color: #000080; font-size: 12pt;\"><strong>NOTA.<\/strong><\/span><\/h3>\n<p style=\"text-align: justify;\">Como se ha visto, el dispositivo maestro, para el caso de lectura, enviar\u00e1 el primer pulso de reloj para la lectura de datos del esclavo, liberando la l\u00ednea SCL para que pase a ALTO, pero antes de continuar comprobar\u00e1 que SCL realmente haya ido al nivel l\u00f3gico 1, si la l\u00ednea SCL permanece en BAJO, el dispositivo maestro interpreta que el esclavo la mantiene as\u00ed y espera a que SCL vaya a ALTO antes de continuar. Cuando el maestro est\u00e1 leyendo desde el esclavo, es el dispositivo esclavo quien pone los datos en la l\u00ednea SDA del bus y el maestro es el que controla el pulso de reloj.<\/p>\n<p style=\"text-align: justify;\">Esto es lo que ocurre normalmente, sin embargo, que ocurre si el esclavo no est\u00e1 listo para enviar un dato. Con dispositivos como una EEPROMs esto no ser\u00eda problema, ya que son esclavos de otro dispositivo. Cuando el dispositivo \u00abesclavo\u00bb se trata de un microprocesador, el cual se supone que tiene otras tareas que atender, aqu\u00ed es donde surge el problema. Dicho microprocesador, para atender la llamada del dispositivo maestro, deber\u00e1 utilizar una interrupci\u00f3n, guardando el estado de sus registros de trabajo en ese momento, determinar la direcci\u00f3n que desea leer el maestro, tomar el dato y ponerlo en el registro de transmisi\u00f3n.<\/p>\n<p style=\"text-align: justify;\">En el tiempo que transcurre (micro segundos) con esta transacci\u00f3n, el dispositivo maestro estar\u00eda enviando pulsos de reloj ciegamente por la l\u00ednea SCL, sin que el dispositivo esclavo le respondiera. Para este caso, el protocolo I\u00b2C ofrece una soluci\u00f3n; el esclavo puede mantener la l\u00ednea SCL en BAJO, a esto se le llama <strong>estiramiento del reloj<\/strong>. Por este motivo, cuando el esclavo recibe el comando de lectura, lo primero que hace es poner la l\u00ednea de reloj en BAJO, hasta que obtiene el dato solicitado, entonces lo pone en el registro de transmisi\u00f3n e inmediatamente libera la l\u00ednea de reloj, que pasar\u00e1 de inmediato a ALTO debido al nivel que aporta la resistencia de polarizaci\u00f3n.<\/p>\n<p style=\"text-align: justify;\">Mi experiencia personal en el uso del I\u00b2C bus, evidentemente debe mejorar con la pr\u00e1ctica, del mismo modo que ocurrir\u00e1 con la del lector interesado, si sigue realizando proyectos y practicando con el sistema de transmisi\u00f3n de datos entre dispositivos con micro-controladores. La pr\u00e1ctica ha ido mejorando mis conocimientos sobre el I2C y algunas muestras se encuentran en <a href=\"http:\/\/www.hispavila.com\/3ds\/atmega\/indice.html\" target=\"_blank\" rel=\"noopener noreferrer\">este sitio<\/a>. Para una mayor informaci\u00f3n refi\u00e9rase a las indicaciones del fabricante en <a href=\"http:\/\/www.hispavila.com\/3ds\/atmega\/intro_i2c_datos\/i2c_Philips.pdf\" target=\"_blank\" rel=\"noopener noreferrer\">especificaciones del I\u00b2C de Philips<\/a>.<\/p>\n<h2><span style=\"color: #000080; font-size: 12pt;\"><strong>El I\u00b2C-bus con Arduino.<\/strong><\/span><\/h2>\n<p style=\"text-align: justify;\">Actualmente existen muchas aplicaciones, para aplicar con la placa Arduino; como un reloj en tiempo real, potenci\u00f3metros digitales, sensores de temperatura, br\u00fajulas digitales, chips de memoria, servos, circuitos de radio FM, E\/S expansores, controladores de LCD, amplificadores, etc. Y adem\u00e1s usted puede tener m\u00e1s de una idea para aplicar este bus, en cualquier momento, como se ha dicho, el n\u00famero m\u00e1ximo de dispositivos I\u00b2C utiliza en un momento dado es de 112 nodos.<\/p>\n<p style=\"text-align: justify;\">Debe tenerse muy en cuenta el Arduino que est\u00e1 utilizando, si es un Arduino Mega, el pin SDA, es pin 20 y el SCL, es el pin 21, as\u00ed que, tenga en cuenta que en los escudos con I\u00b2C, necesitan ser espec\u00edficamente para el Mega. Si usted tiene otro tipo de tarjeta, revise la hoja de datos o consulte la p\u00e1gina web de pruebas de hardware de Arduino. Y por \u00faltimo, si usted est\u00e1 usando un microcontrolador ATMega328 base DIP-PU, deber\u00e1 a utilizar para SDA el pin 27 y SCL el pin 28.<\/p>\n<p style=\"text-align: justify;\">Si s\u00f3lo est\u00e1 utilizando un dispositivo I\u00b2C, las resistencias RPA, no son necesarias ya que el microcontrolador ATMega328 en nuestro Arduino las ha incorporado. Sin embargo, si est\u00e1 empleando una serie de dispositivos, utilice dos resistencias de 4k7 ohmios. Como todo, algunas pruebas en un circuito protoboard o prototipo determinar\u00e1 su necesidad. La longitud m\u00e1xima de un bus I\u00b2C es de alrededor de un metro y es una funci\u00f3n de la capacidad del bus. Esta distancia se puede ampliar con el uso de un circuito especial que no examinaremos en el presente cap\u00edtulo.<\/p>\n<p style=\"text-align: justify;\">Cada dispositivo se puede conectar al bus en cualquier orden y como ya se ha mencionado, los dispositivos pueden ser maestros o esclavos. En nuestra aplicaci\u00f3n el IDE Arduino, es el maestro y los dispositivos que \u00abcolguemos\u00bb en el bus I\u00b2C son los esclavos. Podemos escribir datos en un dispositivo o leer datos de un dispositivo. A estas alturas ya no debe tener la duda \u00ab\u00bfc\u00f3mo podemos diferenciar cada dispositivo en el bus?\u00bb M\u00e1s arriba, ya se ha documentado. Cada dispositivo tiene una direcci\u00f3n \u00fanica. Nosotros usaremos esa direcci\u00f3n en las funciones descritas m\u00e1s adelante, para dirigir nuestras peticiones de lectura o escritura al dispositivo correcto.<\/p>\n<p style=\"text-align: justify;\">Al igual que en la mayor\u00eda de dispositivos, hacemos uso de una librer\u00eda Arduino, en este caso <span style=\"color: #000080;\">&lt;<\/span><span style=\"color: #ff00ff;\">wire.h<\/span><span style=\"color: #000080;\">&gt;<\/span>. A continuaci\u00f3n, utilice la <span style=\"color: #008000;\"><em>Wire.begin function();<\/em><\/span> dentro de la configuraci\u00f3n del <em><span style=\"color: #008000;\">vo\u00edd setup();<\/span><\/em> y estamos listos para empezar.<\/p>\n<p style=\"text-align: justify;\"><strong>ENV\u00cdO<\/strong> de datos (sending), desde nuestro Arduino a los dispositivos I\u00b2C depende de dos cosas: la direcci\u00f3n \u00fanica del dispositivo (que necesitamos est\u00e9 en hexadecimal) y al menos un byte de datos a enviar. (Como ya se ha descrito <a href=\"#FUNCI%C3%93N_ESCRITURA.\">arriba<\/a>).<\/p>\n<p style=\"text-align: justify;\">Por ejemplo; la direcci\u00f3n del dispositivo en el ejemplo (de abajo) es 00101111 (binario), que es 0x2F en hexadecimal.<\/p>\n<p style=\"text-align: justify;\">Entonces debemos establecer el valor del puntero, que es un valor entre 0 y 127, o sea 0\u00d700 y 0x7F en hexadecimal. As\u00ed que para establecer el puntero a cero, usar\u00edamos las funciones siguientes:<\/p>\n<p style=\"text-align: justify;\"><span style=\"color: #008080;\"> Wire.beginTransmission(0x68);<\/span> <span style=\"color: #008000;\">\/\/ direcci\u00f3n \u00fanica 0x68 del ds1307<\/span><\/p>\n<p style=\"text-align: justify;\">Esto env\u00eda la direcci\u00f3n del dispositivo por la l\u00ednea del bus SDA (datos). Viaja a lo largo del bus, y \u00abavisa\u00bb al dispositivo correspondiente que tiene algunos datos que vienen &#8230;<\/p>\n<p style=\"text-align: justify;\"><span style=\"color: #008080;\"> Wire.send(0x00);<\/span> <span style=\"color: #008000;\">\/\/ inicia el puntero de la memoria del ds1307 (es el byte)<\/span><\/p>\n<p style=\"text-align: justify;\">Esto env\u00eda el byte de datos en el dispositivo &#8211; en el registro del dispositivo (o la memoria de todo tipo), que est\u00e1 esperando con los brazos abiertos. Cualquier otro dispositivo en el bus pasar\u00e1 por alto esto. Tenga en cuenta que s\u00f3lo puede realizar una operaci\u00f3n I\u00b2C a la vez! Luego, cuando haya terminado de enviar datos al dispositivo, queda \u00abla transmisi\u00f3n final\u00bb. Esto le dice al dispositivo que hemos terminado, y libera el bus I\u00b2C para la siguiente operaci\u00f3n:<\/p>\n<p style=\"text-align: justify;\"><span style=\"color: #008080;\"> Wire.endTransmission();<\/span> <span style=\"color: #008000;\">\/\/ termina la transmisi\u00f3n<br \/>\n<\/span><\/p>\n<p style=\"text-align: justify;\">Algunos dispositivos pueden tener m\u00e1s de un registro y por lo tanto requieren m\u00e1s bytes de datos en cada transmisi\u00f3n. Por ejemplo, el DS1307 reloj en tiempo real tiene ocho registros para almacenar los datos de tiempo, cada uno requiere ocho bits de datos (un byte), o puede ser una RAM o una E2PROM.<\/p>\n<p style=\"text-align: justify;\"><a href=\"http:\/\/s3.subirimagenes.com:81\/privadas\/previo\/thump_1308762avrds130707.gif\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" src=\"http:\/\/s3.subirimagenes.com:81\/privadas\/previo\/thump_1308762avrds130707.gif\" alt=\"\" width=\"444\" height=\"275\" \/><\/a>Sin embargo, con el DS1307 &#8211; como requiere ocho bits de datos, enviar la totalidad del lote necesita volverlo a reescribir cada vez. As\u00ed que, en este caso, ser\u00e1 necesario utilizar ocho funciones de <strong>wire.send ()<\/strong>, cada vez. Cada dispositivo interpreta los bytes de datos enviados al mismo, por lo que se necesita la hoja de datos del dispositivo, para entender c\u00f3mo usarlo.<\/p>\n<p style=\"text-align: justify;\"><strong>Recepci\u00f3n<\/strong> de datos (Receiving) desde un dispositivo I\u00b2C con nuestro Arduino, requiere dos cosas: la direcci\u00f3n \u00fanica del dispositivo (que necesitamos est\u00e9 en hexadecimal) y el n\u00famero de bytes de datos a aceptar desde el dispositivo. La recepci\u00f3n de datos en este momento es un proceso que consta de dos etapas. Si revisamos el cuadro anterior de la hoja de datos del DS1307, tengamos en cuenta que hay ocho registros o bytes de datos all\u00ed. Lo primero que tenemos que hacer es tener el inicio del dispositivo I\u00b2C leer el primer registro, que se realiza mediante el env\u00edo de un cero en el dispositivo:<\/p>\n<pre><span style=\"color: #339966;\"> <span style=\"color: #008080;\">Wire.beginTransmission(device_address);<\/span><\/span>\r\n<span style=\"color: #339966;\"> <span style=\"color: #008080;\">Wire.send(0);<\/span><\/span>\r\n<span style=\"color: #339966;\"> <span style=\"color: #008080;\">Wire.endTransmission();<\/span><\/span><\/pre>\n<p style=\"text-align: justify;\">Ahora, el dispositivo I2C enviar\u00e1 los datos del primer registro cuando se le solicite. Ahora, necesitamos pedir al dispositivo los datos y la cantidad de bytes que queremos. Por ejemplo, si un dispositivo necesita tres bytes de datos, le pedimos para tres y, almacenar cada byte en su propia variable (por ejemplo, tenemos tres variables de tipo byte: a, b y c. La primera funci\u00f3n a ejecutar es la siguiente:<\/p>\n<pre> <span style=\"color: #008080;\">Wire.requestFrom(device_address, 3); <span style=\"color: #339966;\">\/\/<\/span><\/span><span style=\"color: #339966;\">device_address, es la variable del dispositivo<\/span><\/pre>\n<p style=\"text-align: justify;\">Que le dice al dispositivo, \u00abenv\u00eda tres bytes de datos de vuelta\u00bb al Arduino. A continuaci\u00f3n, inmediatamente despu\u00e9s de esto con:<\/p>\n<pre> <span style=\"color: #339966;\"> <span style=\"color: #008080;\">*a = Wire.receive();<\/span><\/span>\r\n\r\n  <span style=\"color: #008080;\">*b = Wire.receive();<\/span>\r\n\r\n  <span style=\"color: #008080;\">*c = Wire.receive();<\/span><\/pre>\n<p style=\"text-align: justify;\">No es necesario utilizar <span style=\"color: #000000;\"><strong>Wire.endTransmission()<\/strong><\/span> al leer los datos. Ahora que los datos solicitados se encuentran en sus respectivas variables, se pueden tratar como cualquier otra variable de bytes ordinaria.<\/p>\n<p style=\"text-align: justify;\">Para una explicaci\u00f3n m\u00e1s detallada del bus I2C, lea el documento explicativo u hojas de datos. Ahora vamos a utilizar nuestro conocimiento I2C mediante el control de una amplia gama de dispositivos &#8230;<\/p>\n<p style=\"text-align: justify;\">Esta es una utilidad que le puede ayudar a conocer la direcci\u00f3n del dispositivo que usted ha adquirido, en el caso de disponer de varias unidades, lea este simple <a href=\"https:\/\/www.diarioelectronicohoy.com\/blog\/scaner-i2c-bus\" target=\"_blank\" rel=\"noopener noreferrer\">art\u00edculo<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introducci\u00f3n al I\u00b2C-bus. (Actualizada) Hablar del I2C bus, en nuestros d\u00edas es, poco menos que arriesgado, hay que afinar mucho en lo que se dice, ya que cualquiera ha realizado su descripci\u00f3n y creo realmente que hay muy buenas descripciones y de esas, se bebe el conocimiento, por parte de muchos aficionados a la electr\u00f3nica, [&hellip;]<\/p>\n","protected":false},"author":4,"featured_media":3384,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_exactmetrics_skip_tracking":false,"_exactmetrics_sitenote_active":false,"_exactmetrics_sitenote_note":"","_exactmetrics_sitenote_category":0,"footnotes":""},"categories":[22,31,15],"tags":[270,81,82,90,122,172],"class_list":["post-243","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-arduino","category-introduccion-al-i2cbus","category-microcontroladores","tag-arduino","tag-ds1307","tag-eeprom","tag-i2cbus","tag-pcf8754","tag-rs232"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.diarioelectronicohoy.com\/blog\/wp-json\/wp\/v2\/posts\/243","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.diarioelectronicohoy.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.diarioelectronicohoy.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.diarioelectronicohoy.com\/blog\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/www.diarioelectronicohoy.com\/blog\/wp-json\/wp\/v2\/comments?post=243"}],"version-history":[{"count":51,"href":"https:\/\/www.diarioelectronicohoy.com\/blog\/wp-json\/wp\/v2\/posts\/243\/revisions"}],"predecessor-version":[{"id":4831,"href":"https:\/\/www.diarioelectronicohoy.com\/blog\/wp-json\/wp\/v2\/posts\/243\/revisions\/4831"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.diarioelectronicohoy.com\/blog\/wp-json\/wp\/v2\/media\/3384"}],"wp:attachment":[{"href":"https:\/\/www.diarioelectronicohoy.com\/blog\/wp-json\/wp\/v2\/media?parent=243"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.diarioelectronicohoy.com\/blog\/wp-json\/wp\/v2\/categories?post=243"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.diarioelectronicohoy.com\/blog\/wp-json\/wp\/v2\/tags?post=243"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}