conector spi. Descripción de la interfaz SPI. Temporización de la señal

Introducción

SPI (3 hilos) es una interfaz popular para el intercambio de datos en serie entre microcircuitos. La interfaz SPI, junto con I 2 C, es una de las interfaces más utilizadas para conectar microcircuitos. Originalmente fue inventado por Motorola y actualmente se usa en los productos de muchos fabricantes. Su nombre es una abreviatura de "Serial Peripheral Bus", que refleja su propósito: un bus para conectar dispositivos externos. El bus SPI está organizado sobre una base maestro-esclavo. El bus maestro suele ser un microcontrolador, pero también puede ser una lógica programable, un controlador DSP o ASIC. Los dispositivos externos conectados al bus maestro forman el bus esclavo. Su papel lo desempeñan varios tipos de microcircuitos, incl. dispositivos de almacenamiento (EEPROM, Flash-memory, SRAM), reloj en tiempo real (RTC), ADC/DAC, potenciómetros digitales, controladores especializados, etc.

El componente principal de la interfaz SPI es un registro de desplazamiento convencional, cuyas señales de entrada/salida de flujo de bits y sincronización forman las señales de interfaz. Por lo tanto, el protocolo SPI se llama más correctamente no un protocolo de transferencia de datos, sino un protocolo de intercambio de datos entre dos registros de desplazamiento, cada uno de los cuales realiza simultáneamente la función de un receptor y la función de un transmisor. Una condición indispensable para la transferencia de datos en el bus SPI es la generación de una señal de reloj de bus. Esta señal tiene derecho a generar solo el bus maestro y el funcionamiento del bus esclavo depende completamente de esta señal.

Conexión eléctrica

Hay tres tipos de conexión al bus SPI, cada uno de los cuales implica cuatro señales (consulte la Tabla 1 para conocer sus designaciones principales y alternativas). La conexión más simple, en la que solo están involucrados dos chips, se muestra en la Figura 1. Aquí, el bus maestro transmite datos en la línea MOSI en sincronismo con la señal SCLK generada por él, y el esclavo captura los bits de datos transmitidos en ciertos bordes. de la señal de reloj recibida. Al mismo tiempo, el esclavo envía su paquete de datos. El esquema presentado se puede simplificar omitiendo la línea MISO si el IC esclavo utilizado no proporciona o no se requiere que envíe datos. La transferencia de datos unidireccional se puede encontrar en microcircuitos como DAC, potenciómetros digitales, amplificadores programables y controladores. Por lo tanto, la opción considerada de conectar un IC esclavo requiere 3 o 4 líneas de comunicación. Para que el IC esclavo reciba y transmita datos, además de la presencia de una señal de reloj, también es necesario que la línea SS esté baja. De lo contrario, el IC esclavo estará inactivo. Cuando solo se usa un IC externo, puede ser tentador excluir también la línea SS configurando la entrada de selección del IC esclavo en un nivel bajo. Tal solución es altamente indeseable y puede provocar fallas o incluso la imposibilidad de transferencia de datos, porque. la entrada de selección de chip sirve para restablecer el IC a su estado inicial y, a veces, inicia la salida del primer bit de datos.


Arroz. 1. La conexión más sencilla al bus SPI

Si es necesario conectar varios microcircuitos al bus SPI, se utiliza una conexión independiente (en paralelo) (Fig. 2) o una conexión en cascada (en serie) (Fig. 3). La conexión independiente es más común, porque. logrado usando cualquier chip compatible con SPI. Aquí, todas las señales, excepto la elección de los chips, se conectan en paralelo, y el maestro del bus, al transferir una u otra señal SS a un estado bajo, establece con qué IC esclavo intercambiará datos. La principal desventaja de dicha conexión es la necesidad de líneas adicionales para abordar los microcircuitos esclavos (el número total de líneas de comunicación es 3 + n, donde n es el número de microcircuitos esclavos). La conexión en cascada está libre de esta deficiencia, porque aquí, un gran registro de desplazamiento se forma a partir de varios microcircuitos. Para hacer esto, la salida de datos de transmisión de un IC se conecta a la entrada de datos de recepción del otro, como se muestra en la Figura 3. Las entradas de selección de chip están conectadas en paralelo aquí y, por lo tanto, el número total de líneas de comunicación se mantiene en 4. Sin embargo, la conexión en cascada solo es posible si su soporte está especificado en la documentación de los chips utilizados. Para averiguarlo, es importante saber que tal conexión se llama "daisy-chaining" en inglés.


Arroz. 2. Conexión independiente al bus SPI


Arroz. 3. Conexión en cascada al bus SPI

Protocolo de transferencia

El protocolo de transmisión sobre la interfaz SPI es extremadamente simple y, de hecho, es idéntico a la lógica del registro de desplazamiento, que consiste en realizar una operación de desplazamiento y, en consecuencia, la entrada y salida de datos bit a bit en ciertos bordes de la señal de sincronización. El conjunto de datos en transmisión y la búsqueda en recepción siempre se realizan en flancos de reloj opuestos. Esto es necesario para garantizar que los datos se recuperan después de que se hayan establecido de manera confiable. Si tenemos en cuenta que el flanco ascendente o descendente puede actuar como el primer flanco en el ciclo de transmisión, entonces hay cuatro opciones posibles para la lógica de la interfaz SPI. Estas opciones se denominan modos SPI y se describen mediante dos parámetros:

  • CPOL: el nivel inicial de la señal de sincronización (si CPOL = 0, entonces la línea de sincronización antes del inicio del ciclo de transmisión y después de su finalización tiene un nivel bajo (es decir, el primer borde sube y el último baja), de lo contrario, si CPOL=1, - alto (es decir, el primer frente cae y el último sube));
  • CPHA - fase de sincronización; este parámetro determina la secuencia en la que se realiza el ajuste y muestreo de datos (si CPHA=0, entonces el muestreo de datos se realizará en el flanco ascendente en el ciclo de sincronización, y luego, en el flanco descendente, ajuste de datos; si CPHA= 1, los datos de configuración se tomarán en el flanco ascendente del ciclo de reloj y se muestrearán en el flanco descendente). La información sobre los modos SPI se resume en la Tabla 2.

Los chips maestro y esclavo que funcionan en diferentes modos SPI son incompatibles, por lo que es importante aclarar qué modos admite el bus maestro antes de seleccionar los chips esclavos. Los módulos de hardware SPI integrados en los microcontroladores en la mayoría de los casos admiten la capacidad de seleccionar cualquier modo SPI y, por lo tanto, se les puede conectar cualquier microcircuito esclavo SPI (solo se aplica a una opción de conexión independiente). Además, el protocolo SPI en cualquiera de los modos se implementa fácilmente en el software.

Comparación con barra colectora I 2 C

Como ya se mencionó, el bus serial de 2 hilos I 2 C no es menos popular para acoplar microcircuitos. A continuación puede ver los beneficios que otorga este o aquel bus serie.

Beneficios del bus SPI Ventajas del bus I2C
La extrema simplicidad del protocolo de transmisión en la capa física determina la alta confiabilidad y velocidad de transmisión. El bus SPI tiene una velocidad máxima de decenas de megahercios y, por lo tanto, es ideal para la transmisión de datos de gran volumen y se usa ampliamente en DAC/ADC de alta velocidad, controladores de pantalla LED y chips de memoria. El bus I 2 C sigue siendo de dos hilos, independientemente del número de chips conectados a él.
Todas las líneas de bus SPI son unidireccionales, lo que simplifica enormemente la tarea de conversión de nivel y aislamiento galvánico de microcircuitos. Posibilidad de funcionamiento multimaestro cuando se conectan varios microcircuitos maestros al bus.
Facilidad de implementación del software del protocolo SPI. El protocolo I2C está más estandarizado, por lo tanto, el usuario de chips I2C está más protegido contra problemas de incompatibilidad de componentes seleccionados.

Protocolos derivados y compatibles

  • MICROALAMBRE.

    El protocolo MICROWIRE de National Semiconductor es idéntico al protocolo SPI en modo 0 (CPOL = 0, CPHA = 0).

  • Interfaz máxima de 3 hilos

    La diferencia con esta interfaz es que, en lugar de una transmisión full-duplex sobre dos líneas unidireccionales, realiza una transmisión half-duplex sobre una línea DQ bidireccional.

  • QSPI

    Un protocolo de mayor nivel que SPI que permite la transferencia de datos automatizada sin la participación de la CPU.

Además, la interfaz SPI es la base para construir una serie de interfaces especializadas, incl. Interfaz de depuración JTAG e interfaces de tarjeta de memoria Flash, incl. SD y MMC.

Pestaña. 1. Señales eléctricas del bus SPI

Neumáticos líderes autobús esclavo
Designación básica Notación alternativa Descripción Designación básica Notación alternativa Descripción
MOSI DO, SDO, DOUT MOSI DI, SDI, DIN
MISO DI, SDI, DIN Entrada de recepción en serie MISO DO, SDO, DOUT Salida en serie
SCLK DCLOCK, CLK, SCK Salida de sincronización de transferencia de datos SCLK DCLOCK, CLK, SCK Recibir entrada de sincronización
SS CS Salida de selección de esclavo (selección de chip) SS CS Entrada de selección de esclavo (selección de chip)

Al principio, se suponía que este artículo describía las características de implementación de la interfaz SPI serial síncrona en la familia ADuC70xx de microcontroladores de un solo chip de Analog Devices. La intención del autor no era solo revisar las características de la implementación de SPI, sino también discutir cuándo estas características son útiles, cómo y por qué deben usarse. Durante la redacción del artículo, resultó que la parte del texto dedicada a las preguntas "cuándo, cómo y para qué" superó el 50%, entonces se decidió cambiar la naturaleza de la presentación en la dirección indicada en el título. . Debido al aumento de volumen, el material se dividirá en tres artículos separados. 1. Principios de la interfaz SPI y la organización de dispositivos esclavos. 2. Subsistemas de interfaz SPI en microcontroladores: opciones de organización y uso. 3. Subsistema de interfaz SPI en microcontroladores de la familia ADuC70xx.

Todos los artículos de la serie:

  • Interfaz serie síncrona SPI en microcontroladores "de la A a la Z" y su implementación en el ejemplo de ADuC70xx de Analog Devices. Parte 1
  • Interfaz serial síncrona SPI en microcontroladores “de la A a la Z” y su implementación en ADuC70xx de Analog Devices. Parte 2
  • Interfaz serial síncrona SPI en microcontroladores de la "A a la Z" y su implementación en ADuC70xx de Analog Devices. parte 3

Durante la redacción del artículo, resultó que la parte del texto dedicada a las preguntas "cuándo, cómo y para qué" superó el 50%. Entonces se decidió cambiar la naturaleza de la presentación en la dirección indicada en el título.

Debido al aumento de volumen, el material se dividirá en tres artículos separados:

  1. Principios de la interfaz SPI y la organización de dispositivos esclavos.
  2. Subsistemas SPI en microcontroladores: opciones de organización y uso.
  3. Subsistema SPI en MK de la familia ADuC70xx.

Historia de SPI

La interfaz SPI fue inventada por Motorola. Sin embargo, la invención no se hizo desde cero. El predecesor fue la interfaz MicroWire de National Semiconductor. El autor del artículo se familiarizó con la interfaz SPI mientras trabajaba con la popular familia M68HC11, prácticamente la primera en la que apareció SPI a fines de la década de 1980. El propósito principal de esta interfaz es conectar varios dispositivos periféricos al MK. Muy rápidamente, SPI se hizo bastante popular por las siguientes razones:

  1. requisitos mínimos para el hardware del dispositivo conectado a la MC (registro de desplazamiento);
  2. Un maestro SPI en una configuración mínima es fácil de emular en software si el MK no tiene una implementación de hardware de SPI.

En las últimas dos décadas, numerosas empresas han estado produciendo una gran cantidad de nodos periféricos diferentes conectados al MC a través de SPI (ver, por ejemplo,). Estos son sensores de cantidades físicas (temperatura, presión, aceleración, etc.), dispositivos de conversión de analógico a digital (ADC, DAC, potenciómetros digitales), dispositivos de conversión de interfaz (controladores CAN, controladores Ethernet), módulos de memoria no volátil ( Flash- tarjetas MMC y SD, chips EEPROM) y muchos otros. En (2005) se afirma que "aproximadamente el 85% de los MCU están equipados con una interfaz SPI".

Históricamente, sin embargo, no ha habido un estándar oficial generalmente aceptado para la interfaz SPI. Por lo tanto, las propiedades del subsistema SPI en chips de diferentes fabricantes pueden diferir tanto en el conjunto de capacidades como en su implementación, lo que a menudo provoca dificultades de uso. Los desarrolladores superan estas dificultades en su mayor parte mediante ensayo y error o compartiendo experiencias. A su vez, los fabricantes de microcontroladores a menudo, asumiendo que SPI es un estándar bien conocido, describen las propiedades del subsistema demasiado brevemente. Esto, en particular, es culpa de la descripción técnica de la familia de MC ADuC70xx de Analog Devices.

Es muy difícil encontrar fuentes que describan sistemáticamente todas (o al menos la mayoría) de las posibles funciones de la interfaz SPI. Una recomendación que suele encontrarse en los foros de desarrolladores es tomar la descripción técnica del MK, en la que está disponible el SPI. Pero allí, por supuesto, solo se describe un subconjunto de las opciones implementadas en un MK en particular.

El autor conoce solo unas pocas publicaciones en las que se intentó describir las propiedades de SPI sin hacer referencia a un tipo específico de MC [ , , , ], y todas ellas adolecen de incompletitud. Algunas empresas han publicado su "visión" de lo que constituye SPI, por ejemplo [ , - ], pero los documentos mencionados están en gran medida "vinculados" a las implementaciones de MK producidas por estas empresas.

Configuración y arquitectura de interfaz mínima

La arquitectura mínima se muestra en la fig. 1. La interfaz SPI contiene cuatro líneas:

  • MOSI (Master Out Slave In): salida de datos maestros (también conocida como entrada de datos esclavos);
  • MISO (Master In Slave Out): entrada de datos maestros (también conocida como salida de datos esclavos);
  • SCK (Serial ClocK) - cronometraje (sincronización);
  • SS (Slave Select) - selección de esclavos.

Arroz. uno. Estructura de comunicación y líneas de la interfaz SPI

Sincronización de transmisión

La frecuencia de los intervalos de bits en las líneas de datos SPI está determinada por la señal de reloj SCK, que es generada por uno de los suscriptores: el maestro. Otros suscriptores: esclavos (Slave), que pueden ser uno o varios, usan la señal del reloj para determinar los momentos de cambio de bit en la línea de datos. Los dispositivos esclavos no pueden influir en la tasa de bits de ninguna manera (a diferencia, por ejemplo, de la interfaz I 2 C).

El líder en la gran mayoría de los casos es el transceptor SPI como parte del MK (si no hay hardware SPI, se puede emular en software). Sin embargo, el autor es consciente de la implementación del dispositivo maestro SPI como parte de los chips Xilinx PLD, así como en el IC del convertidor de interfaz paralela a la interfaz USB. En ambos casos, el maestro se centra en conectar un tipo específico de microcircuito: una EEPROM con una interfaz compatible con SPI.

El dispositivo esclavo suele ser un chip periférico. Sin embargo, SPI también se puede usar para vincular dos (o más) microcontroladores, esta posibilidad se discutirá más adelante.

Los bits se transmiten en paquetes. La longitud del paquete suele ser de 1 byte (8 bits), aunque existen implementaciones de SPI con una longitud de paquete diferente [ , , ]. Tanto el maestro como el esclavo tienen un contador (generalmente no accesible mediante programación) de pulsos de reloj (bits). El contador en el dispositivo esclavo le permite a este último determinar cuándo ha terminado la transmisión del paquete. El contador de bits se pone a cero cuando se deshabilita (desactiva) el subsistema SPI, que siempre está disponible en el maestro. En el esclavo, el contador de bits normalmente se pone a cero desactivando la señal de interfaz SS. La transferencia de paquetes, es decir, el inicio del generador de reloj en el maestro, generalmente se lleva a cabo automáticamente cuando el byte transmitido se escribe en el registro de desplazamiento del maestro.

La configuración de la tasa de bits F SCK se lleva a cabo de manera estándar para las interfaces en serie: F SCK \u003d F G /DIV, donde F G es la frecuencia constante del oscilador maestro SPI, cuyo valor se proporciona en la descripción técnica del microcircuito , DIVA-217. (Divisor O, que puede estar en varios MK, el divisor DIV solo se puede seleccionar de un conjunto de valores predefinidos. Por ejemplo, en el MK de la familia M68HC11, este es uno de los cuatro valores : 2, 4, 16, 32. Con un valor nominal de F G igual a 2 MHz, la frecuencia de cambio en estos MK puede ser 1000, 500, 125 o 62,5 kHz. En otros MK, el valor DIV se puede elegir arbitrariamente dentro de un ancho de bit limitado. En la familia de microcontroladores ADuC70xx, este ancho de bit es de un byte, el valor del divisor se puede establecer en el rango de 5 a 255, lo que permite seleccionar una de las 251 frecuencias de cambio que van desde 3482 a 81,2 kHz.

Dado que las acciones en los dispositivos maestro y esclavo están sincronizadas por la misma señal SCK, no existen requisitos para la estabilidad de frecuencia de esta señal (con la excepción del límite superior de la duración de los semiciclos, determinado por la frecuencia máxima de operación del abonado más lento). Esto permite el uso de SPI en sistemas con una frecuencia de reloj estable baja (un oscilador de reloj sin estabilización de cristal, con un circuito RC de temporización) y también facilita enormemente la emulación de software del dispositivo maestro. Además, en la emulación de software, es perfectamente aceptable pausar la transferencia "a la mitad" de un byte, si el dispositivo esclavo lo permite.

Transferencia de datos

SPI implica la transmisión bit a bit: desde el maestro en la línea MOSI y desde el esclavo (en sentido contrario) en la línea MISO. Por lo tanto, el modo dúplex completo es posible, cuando los datos se transmiten en ambas direcciones simultáneamente y sincrónicamente. El orden de bits en la versión original de SPI de Motorola se puede definir como "comenzando desde el más alto", pero más tarde algunos fabricantes de microcontroladores permitieron que se configurara mediante programación. Son posibles implementaciones en las que se utiliza una única línea bidireccional para la transmisión de datos; tal configuración se describe, en particular, en un documento de Freescale, una subsidiaria de semiconductores de Motorola.

Selección de esclavo - Señal SS

La cuarta señal de interfaz, SS (Slave Select, selección de esclavo), tiene el objetivo principal de encender o apagar el dispositivo esclavo con una señal del maestro (del MK).

Cuando la señal SS está activa (baja):

  • El circuito esclavo está activo.
  • El pin MISO está en modo de "salida".
  • La señal de reloj SCK del maestro es detectada por el esclavo, lo que hace que la entrada MOSI lea los valores transmitidos desde los bits maestros y cambie el registro del esclavo.

Cuando la señal SS es pasiva (alta), la señal de reloj SCK y la señal MOSI no tienen efecto en el dispositivo esclavo.

En el uso más simple de SPI, es posible que no se use la señal SS. En otros periféricos más complejos, la señal SS no solo se usa, sino que también realiza funciones adicionales, y este tema se discutirá más adelante.

Temporización de la señal

Varias opciones de diagrama son posibles. Uno de ellos se muestra en la Fig. 2, y otros se discutirán a continuación. Vamos a describir el diagrama en detalle.


Arroz. 2. Diagrama SPI, modo 0

Antes del inicio de la transmisión del paquete, a la izquierda del tiempo A, la señal SS en la salida del maestro está en un estado alto - fig. 2e), el esclavo está inactivo, su salida MISO está apagada y las entradas MOSI y SCK del esclavo no aceptan señales generadas por el maestro. La señal de reloj en la salida del maestro durante este período es baja.

Para activar el esclavo, el maestro enciende la señal de selección de esclavo SS (tiempo A). El esclavo se enciende, su entrada de reloj es capaz de recibir una señal de reloj y el pin MISO entra en modo de salida. El pulso del reloj aún no ha comenzado, las señales de salida en las líneas de datos MOSI y MISO ahora reflejan el valor del bit que será el primero en enviarse a otro suscriptor (intervalo de tiempo de A a 1).

Después de algún tiempo, el líder comienza la formación de un paquete de impulsos de corte - fig. 2a), señal SCK. Las transiciones de reloj hacen que se desplacen los contenidos de los registros de desplazamiento maestro y esclavo, así como capturar nuevos valores de bits después del desplazamiento. Los tiempos de cambio y bloqueo deben estar separados en el tiempo, por lo que estas acciones se realizan en la interfaz SPI en diferentes bordes de reloj. El diagrama se muestra bajo el supuesto de que la captura se realiza en la subida de la señal del reloj (en los bordes impares de la figura), los puntos de tiempo correspondientes también están marcados en la Fig. 2b), y el cambio en los registros sigue a la declinación (incluso a las caídas). Por lo tanto, el orden de los eventos durante la acción de cada pulso de reloj se puede describir como "capturar, luego cambiar" (Latch, luego Shift).

Después del final del intercambio de paquetes (a la derecha del borde de la secuencia de 16 relojes), la señal de salida en cada una de las líneas de datos MOSI y MISO refleja el valor del bit que se transmitió primero. La transmisión del paquete finaliza con la eliminación de la señal SS a la salida del maestro (tiempo B), lo que desactiva al suscriptor esclavo. Después de algún tiempo, es posible la transmisión del siguiente paquete (tiempo C).

La señal SS se puede generar a la salida del maestro de diferentes formas. En algunos MK, es generado por hardware: después de que el software escribe el byte transmitido en el registro de datos del transmisor, la señal de salida SS cambia automáticamente a un nivel bajo y, al final del paquete, vuelve a su valor inactivo original ( alto). Si el dispositivo maestro no tiene acondicionamiento de señal SS basado en hardware, se genera en software utilizando la salida del puerto paralelo de propósito general. Sin embargo, cuando se trabaja con algunos dispositivos periféricos, debe generar mediante programación la señal SS incluso con un controlador de hardware. Más adelante se darán ejemplos.

Esto concluye la consideración de las propiedades básicas de la interfaz SPI, y continuaremos su discusión más detallada sobre ejemplos de uso.

El ejemplo más simple de usar SPI

Considere un ejemplo simple del uso de la interfaz SPI para aumentar la cantidad de líneas de salida discretas (puertos paralelos) en el MK, por ejemplo, para controlar un grupo de LED o un indicador LCD de siete segmentos. Para hacer esto, puede tomar un registro de desplazamiento convencional como esclavo, por ejemplo 74HC164. Este registro de ocho bits tiene una entrada de datos en serie, una entrada de reloj (desplazamiento) y ocho salidas paralelas. No hay una salida de datos en serie separada en este registro, pero la salida de orden superior D7 se puede usar para esto. El diagrama de conexión se muestra en la fig. 3. Utiliza solo dos de las cuatro líneas de la interfaz SPI.


Arroz. 3. Conexión al registro de desplazamiento MC a través de SPI

El diseño del circuito del chip 74HC164 es tal que tanto la percepción del nuevo valor de la señal de entrada MOSI como el cambio (como resultado de lo cual los estados de las salidas paralelas D7, ..., D0 cambian) ocurren como el reloj la señal SCK sube. Por lo tanto, al usar dos salidas (MOSI y SCK), puede obtener ocho salidas digitales adicionales en el sistema.

En casi todos los microcontroladores con interfaz SPI, las líneas de esta interfaz están multiplexadas con los pines de los puertos paralelos de propósito general. Este hecho le permite utilizar las salidas no utilizadas del microcontrolador MISO y SS para otros fines. Pero este mismo hecho requiere que el programador recuerde reconfigurar los pines correspondientes del puerto paralelo para su uso en SPI.

Conexión secuencial de esclavos

Si necesita aumentar el número de salidas, puede conectar norte 74HC164 se registra en serie en una cadena que forma 8× norte-registro de desplazamiento de bits y proporcionará 8 × norte salidas En la fig. 4 muestra cómo se ve para norte = 2.


Arroz. 4. Conexión en serie al MK de registros de desplazamiento simples como esclavos

Para cargar este registro de desplazamiento compuesto, los nuevos contenidos deberían enviarse en serie a través de SPI. norte bytes La desventaja de esta solución es que durante la transferencia de la cadena de bits a través del registro de desplazamiento de bits múltiples, los estados de sus salidas cambiarán; sin embargo, para controlar un conjunto de LED o un indicador de siete segmentos de bits múltiples, esto es bastante aceptable.

De manera similar, uno o más circuitos integrados de registro de desplazamiento del tipo 74HC299 con salidas paralelas bidireccionales se pueden conectar al MK a través de la interfaz SPI, lo que proporcionará un número adicional de líneas de E/S bidireccionales.

Los periféricos SPI pueden ser más complejos que los registros de desplazamiento discutidos y requieren una secuencia específica de señales SCK y MOSI en sus entradas. Pertenece:

  • a la polaridad de los pulsos de reloj (o en su defecto, al nivel de señal que requiere el chip periférico en la entrada SCK en los intervalos entre transmisiones de paquetes),
  • y también al orden de los eventos "capturar y desplazar".

Por esta razón, se distinguen cuatro modos de operación en las especificaciones de la interfaz SPI, los diagramas para estos modos se muestran en la Fig. 5.


Arroz. 5. Cuatro modos de funcionamiento de la interfaz SPI

Las letras S y L sobre los gráficos denotan respectivamente Shift (desplazamiento) y Latch (captura). El diagrama discutido anteriormente corresponde al Modo 0. Se cree que el Modo 0 y el Modo 3 son los más comunes.

Para seleccionar uno de los modos en el dispositivo maestro (en el MC) que difieren en la polaridad de los pulsos de reloj y su “fase” (procedimiento), generalmente hay dos bits de control en uno de los registros periféricos del subsistema SPI: CPOL (polaridad) y CPHA (fase): las designaciones dadas de bits y designaciones de modos se usan ampliamente. Los dispositivos periféricos (esclavo) suelen admitir un solo modo y, antes de iniciar el intercambio, el maestro (MC) debe configurarse para este modo.

Llamemos la atención del lector sobre el hecho de que en el ejemplo anterior de trabajar con un registro de desplazamiento convencional, cualquiera de estos cuatro modos es igualmente adecuado.

Posibles topologías de sistemas de comunicación basados ​​en la interfaz SPI

El caso más simple: un solo esclavo está conectado al maestro y es necesario un intercambio bidireccional. En este caso, la estructura de interconexión puede utilizar un circuito de tres hilos (Fig. 6).


Arroz. 6. Intercambio bidireccional con un esclavo sin usar la señal SS

La entrada de selección SS en el esclavo puede estar permanentemente activa (baja) mientras que la salida SS del maestro no se usa en absoluto y se puede usar como una salida de puerto paralelo.

La interfaz SPI le permite conectar varios dispositivos esclavos a un maestro, y esto se puede hacer de varias maneras. El primero de ellos le permite implementar una estructura de comunicación radial ("estrella"), se considera que es el caso de uso principal para la interfaz SPI. La configuración de conexión correspondiente se muestra en la fig. 7 (tomado de).

Arroz. 7. Estructura de enlaces radiales
con múltiples esclavos a través de SPI

Como puede verse en la figura, para intercambiar con más de un esclavo, el maestro debe generar un número apropiado de señales de selección de esclavo SS. Este es exactamente el caso cuando las señales SS tienen que ser generadas por software, ya que no se genera más de una señal SS en el hardware del maestro. Si se requiere garantizar el intercambio siempre solo entre el maestro y solo uno de los esclavos, el programa en el maestro debe mantener todas las señales SS en un estado inactivo (alto) en los intervalos entre transferencias de datos, y para un intercambio con uno de los esclavos, coloque la señal correspondiente en un SS de nivel activo (bajo) (de ahí el nombre de selección de esclavo). Las salidas de datos de los esclavos MISO están conectadas en paralelo, pero no interfieren entre sí, ya que están en estado apagado y antes de que comience el intercambio, solo una de estas salidas (en el esclavo seleccionado) pasa al modo activo. Asegurar este estado de cosas requiere cuidado por parte del programador.

Sin embargo, puede ser deseable en algunas aplicaciones utilizar la transmisión de "difusión", en la que los datos transmitidos por el maestro son recibidos y utilizados simultáneamente por varios (quizás todos) los esclavos. Tal modo es posible sin el peligro de un conflicto eléctrico en la línea MISO en caso de que no haya necesidad de transferir datos de los esclavos al maestro, entonces simplemente no hay líneas de datos inversas desde los esclavos.

Si los MK también se utilizan como esclavos en la estructura en cuestión, en la que es posible controlar mediante programación el modo de salida MISO, entonces es posible organizar una transmisión de difusión incluso si hay un canal inverso (línea MISO). Para hacer esto, los programas que se ejecutan en microcontroladores, esclavos, deben mantener constantemente los pines MISO en estado apagado, mientras que la transmisión desde el maestro es posible. Si se requiere recibir datos de uno de los esclavos, el maestro puede informarle sobre esto en el modo de transmisión enviando un paquete con un código identificador de comando, reconociendo cuál, uno de los esclavos debe cambiar su salida MISO al estado activo , después de lo cual intercambio de datos bidireccional entre el maestro y el esclavo seleccionado. Al final del intercambio bidireccional, el maestro debe devolver el esclavo seleccionado a su estado original. En otras palabras, para obtener tal oportunidad, el desarrollador tendrá que diseñar algún tipo de protocolo de intercambio basado en diagramas SPI, en el que algunos valores de bytes (o sus secuencias) desempeñen el papel de comandos para esclavos MK. Este problema se tratará con más detalle en el próximo artículo de la serie cuando se analice la organización de una red troncal multimaestro simétrica basada en SPI.

La segunda forma, que le permite conectar un suscriptor maestro con varios esclavos, es la estructura de "anillo" (a veces esta estructura se denomina "cadena" o cascada, en la terminología inglesa se usa el nombre Daisy-Chain). Esta estructura se muestra en la Fig. 8 (tomado de).

Arroz. ocho. Topología de comunicación en anillo a través de SPI

Utiliza una sola señal SS para activar varios esclavos al mismo tiempo, y las salidas de datos de todos los suscriptores se conectan en serie y forman un circuito cerrado (anillo). Cuando se transmite un paquete desde el maestro, este paquete es recibido por el primer esclavo, que, a su vez, transmite su paquete al siguiente esclavo, y así sucesivamente, y finalmente, el último esclavo de la cadena transmite su paquete al maestro. . Para que un paquete del maestro llegue a un esclavo específico, el maestro debe emitir algunos paquetes más. Ya se ha comentado una variante de esta estructura (con un anillo abierto) (Fig. 4).

Algunos periféricos SPI están diseñados específicamente para su uso en configuraciones en cadena. Un ejemplo de tales microcircuitos son los convertidores de digital a analógico AD5444 y AD5446 de Analog Devices. Su estructura se muestra en la Fig. nueve.


Arroz. nueve. Estructura AD5444/AD5446 DAC adaptada para cadena SPI

La interfaz compatible con SPI de estos instrumentos contiene un registro de desplazamiento de 16 bits con entrada de datos en serie SDIN (MOSI), salida de datos en serie SDO (MISO), entrada de reloj de desplazamiento SCLK (SCK) y entrada de control SYNC. Las primeras tres salidas son completamente similares en sus funciones a las salidas SPI (se indican entre paréntesis). La presencia de la salida del registro de desplazamiento SDO le permite conectar varios chips DAC al MC (maestro) en una estructura de cadena. La captura del valor en la entrada del registro esclavo del AD5444/6 ocurre con la caída de la señal SCLK, el cambio de la señal en esta entrada (desplazamiento del registro de salida maestro) debe ocurrir con la subida de SCLK. Esta secuencia de acciones corresponde al Modo 1 (Fig. 5). La longitud del paquete transmitido al chip DAC es de 16 bits, de los cuales los dos bits más altos realizan funciones de control y los siguientes 14 bits (en el AD5446) o 12 bits (en el AD5444) representan el valor de muestra convertido en voltaje. Es posible que el programador cambie el modo de operación SPI en el esclavo AD544x configurando el valor de los dos bits más significativos del paquete a 11, como resultado de lo cual el esclavo AD544x cambiará al Modo 2, la señal de entrada será ser capturado en el aumento de la señal SCLK.

Pero la entrada SYNC (SS) realiza varias funciones al mismo tiempo. Primero, activa a bajo nivel en el chip DAC la función de detectar las señales de la línea de datos de entrada SDIN (MOSI) y la línea de reloj SCLK (SCK). Además, al final de la transmisión del paquete a los chips DAC, la transición a un nivel alto de la señal SYNC inicia la transferencia del paquete de 16 bits recibido al búfer de entrada del circuito DAC (lo que conducirá a la aparición de un nuevo valor de voltaje en la salida analógica del DAC sincrónicamente en todos los esclavos), y además, apaga la alimentación de los circuitos de interfaz para reducir la energía consumida por el chip DAC.

Por lo tanto, el modo normal de operación con una cadena de chips DAC implica establecer el nivel activo de la señal SYNC (SS), que enciende la fuente de alimentación al circuito de interfaz en el DAC, luego la transmisión en serie del número requerido de 16 -mensajes de bits, teniendo en cuenta el orden de los esclavos incluidos en la cadena (en este caso, cambios en los voltajes de salida no DAC) y, finalmente, apagando la señal SYNC activa, que cambiará simultáneamente los voltajes de salida de todos los DAC en la cadena La señal SYNC debe permanecer activa (baja) sin cambiar hasta que se hayan completado todas las transmisiones.

Algunos ejemplos más del uso de SPI

Tanto en el caso del esquema radial con broadcast como en el último ejemplo con la conexión daisy chain del DAC, se obtuvieron capacidades adicionales como resultado de la presencia y uso de un protocolo de alto nivel que involucra la transmisión de multi-byte. paquetes En el ejemplo de transmisión, el programador de la aplicación debe realizar el desarrollo de dicho protocolo, mientras que con el AD5444/AD5446, este protocolo se especifica en su hoja de datos.

La interfaz de depuración JTAG ampliamente utilizada también es un ejemplo de implementación de un protocolo de alto nivel sobre SPI. JTAG implica la conexión de varios dispositivos controlados (esclavo) en un anillo y la presencia de un único maestro (anfitrión JTAG) en este anillo [ , , ]. Las longitudes de ráfaga utilizadas en JTAG pueden ser bastante grandes, pero su tamaño es un múltiplo de 8 bits.

Consideremos otro ejemplo, en el que la transferencia de datos se lleva a cabo solo en la dirección opuesta, del esclavo al maestro, y la señal SS realiza una función adicional: iniciar la operación en el dispositivo periférico.


Arroz. once. Diagrama de funcionamiento del ADC SPI MAX1240/1241 con disparador SS

Inicialmente, cuando la señal CS está inactiva (alta), la salida de datos DOUT está en estado desactivado (alta impedancia).

A medida que la señal CS cae del MCU maestro al MAX1240/1241 esclavo, ocurre lo siguiente:

  1. captura de la señal analógica de entrada en el dispositivo de muestreo/retención SHA incorporado;
  2. comenzando el proceso de conversión de analógico a digital con la transición simultánea de la señal DOUT a un nivel bajo.

Al final (después de 7,5 µs) del proceso de conversión AD, el SHA cambia del estado de "almacenamiento" (HOLD) al estado de "búsqueda" (TRACK), y la señal DOUT pasa a un nivel alto: este último señala el microcontrolador sobre el resultado final.

Después de eso, la MCU maestra puede comenzar (inmediatamente o después de un tiempo) a leer el resultado de la conversión AD aplicando una secuencia de pulsos de reloj a la línea SCLK. Para recibirlo, el maestro debe iniciar la transferencia de dos bytes desde el esclavo. Se transmitirán 16 bits, de los cuales los primeros 12 representan el resultado, y los últimos cuatro (ceros) simplemente deberán descartarse. El diagrama muestra que para repetir la medición, el maestro debe eliminar el nivel activo de la señal SS durante un tiempo predeterminado (al menos 0,24 µs), luego de lo cual se puede reiniciar el proceso cambiando la señal SS a un nivel activo (bajo). ) nivel.

En este ejemplo, la señal CS (SS) realiza varias funciones en el esclavo MAX1240/1:

  1. activa el circuito SPI interno y despierta la salida de señal DOUT (MISO) del estado desactivado;
  2. inicia el proceso de conversión de analógico a digital en el ADC. Tenga en cuenta que durante el tiempo en que se produce la conversión AD, la señal SS debe estar activa (baja), pero no debe haber relojes de turno. Esto solo es posible con el control de software de la señal SS en el maestro.

Por separado, debe decirse sobre la señal SHDN en los microcircuitos MAX1240 / MAX1241. Está diseñado para transferir el microcircuito periférico al modo de ahorro de energía. SS podría usarse para este propósito, pero el circuito interno de los convertidores de voltaje (para el ADC) tarda algún tiempo en llegar al modo (alrededor de 4 µs). Los diseñadores del chip podrían haber implementado un retraso interno, pero prefirieron usar una señal de control adicional. Esto se justifica por el hecho de que, si se requiere una conversión continua, SHDN debe encenderse solo una vez y el ADC debe iniciarse muchas veces. Puede utilizar la salida del puerto de propósito general para controlar la señal SHDN.

¿Qué debe hacer el programa en el host (en MK)?

Aquí está la secuencia de acciones realizadas por el microcontrolador en el último ejemplo, si su subsistema SPI tiene una longitud de ráfaga estándar de 8 bits:

  1. Establezca la señal SHDN alta (mediante programación).
  2. Espere al menos 4 µs (acceso al modo convertidor de voltaje para ADC).
  3. Establezca la señal SS baja (por software).
  4. Verifique que la señal DOUT haya tomado el valor de un registro. 0 (software o interrupción).
  5. Verifique el estado de la señal DOUT (una señal del final de la conversión AD) hasta que esta señal cambie a un registro. 1 (software o interrupción).
  6. Inicia la transferencia de un byte desde el chip periférico. La frecuencia del reloj no debe exceder los 2,1 MHz.
  7. Espere hasta el final de recibir el primer byte (por software o por interrupción).
  8. Leer y almacenar el primer byte recibido.
  9. Iniciar la transmisión del segundo byte.
  10. Espere hasta el final de recibir el segundo byte (por software o por interrupción).
  11. Leer y almacenar el segundo byte.
  12. Establezca la señal SS en un nivel alto para que la próxima medición pueda iniciarse sin demora en el futuro.
  13. Si es necesario, realice inmediatamente otra medición, establezca la señal SS en un nivel bajo (el tiempo que la señal SS está en un nivel alto entre dos ciclos de medición debe ser de al menos 0,24 µs).
  14. De los dos bytes recibidos, tome los primeros 12 bits y escríbalos en una variable destinada al resultado.

Como puede ver, la secuencia es bastante larga y la carga en el MC es significativa si desea realizar mediciones a una frecuencia cercana al máximo.

Y finalmente, un ejemplo aún más complejo de un dispositivo esclavo. Atmel fabrica chips de memoria flash SPI. Considere las características de conectar el chip AT45DB161B con una organización de 2M × 8 bits. En la fig. 12 muestra un diagrama de bloques del dispositivo con una indicación de todas las salidas externas.


Arroz. 12 AT45DB161B Estructura IC de memoria Flash y pinouts con interfaz SPI

Las señales SI (MOSI), SO (MISO), SCK (SCK), CS (SS) forman una interfaz compatible con SPI. El intercambio con el arreglo Flash interno se realiza a través de dos buffers con un tamaño de (512+16) bytes. El estado interno "el microcircuito está ocupado realizando la operación" o "la operación se completó, el microcircuito está libre" se refleja en el estado de la señal RDY / BUSY. Cuando se realizan operaciones de ejecución prolongada, el software puede analizar el estado de esta señal o se puede utilizar el mecanismo de interrupción del hardware.

Una característica del chip de memoria Flash es que en el intercambio se utilizan paquetes multibyte de longitud variable. El primer byte de cada paquete es un comando y los bytes subsiguientes contienen parámetros o datos para escribir. La transición de la señal CS al nivel activo (bajo) marca el comienzo del paquete, y el regreso de la señal CS al nivel alto marca el final del paquete. Algunos de los paquetes destinados a leer datos de la memoria Flash son de longitud variable. La estructura del encabezado del comando de lectura/escritura se muestra en la fig. trece.


Arroz. trece. La estructura del encabezado del paquete que contiene el comando y la información de la dirección.

Como se ve en la fig. 13, el primer byte contiene el comando (opcode), y los siguientes tres bytes contienen dos parámetros: la dirección de la página en la matriz Flash y la dirección del byte en la página desde la que desea escribir o leer. Los parámetros no están alineados en los límites de bytes, por lo tanto, el programador debe formar el encabezado por adelantado, antes de que se transmita el paquete.

La interfaz SPI fue desarrollada por Motorola. Hoy es uno de los más populares, por su alta velocidad y excepcional sencillez, de todos los que pertenecen al tipo serial. Además, la interfaz SPI también es un principio de comunicación. Esencialmente, SPI es lógica (maestro-esclavo) entre dos dispositivos diferentes. Se presta mucha menos atención a las propiedades físicas, se implementan, como dicen, "según las circunstancias", y no se proporciona un protocolo de nivel inferior. Cada fabricante puede aportar algo propio.

Interfaz SPI: descripción

La lógica de tal dispositivo consiste en la transferencia de datos en serie (bit a bit). En este caso, la instalación y la lectura están separadas en el tiempo debido a una señal de reloj especial en un bus especial (se denomina "bus de reloj" o "sincronización"). Por separación se entiende que el proceso de configuración y lectura de datos se produce en bordes opuestos del reloj generado en el bus. Gracias a esta alternancia de lecturas y ajustes claramente separados en el tiempo, es posible utilizar el mismo registro para recibir y transmitir información. Fue bajo este principio que se desarrolló la interfaz SPI. Sin embargo, el desarrollo de la tecnología no se detiene, hoy en día grandes cantidades de memoria no plantean ningún problema y la mayoría de los dispositivos tienen registros de entrada y salida separados. Aquí, en pocas palabras, examinamos cómo se organiza la interfaz SPI.

Descripción del dispositivo

El dispositivo que genera pulsos de reloj (control) en el bus de reloj es el "maestro" (master). Dicho dispositivo gestiona todo el proceso de intercambio de datos, es decir, determina cuándo iniciar el intercambio, cuándo finalizar, cuántos bits de información transferir, etc. El segundo dispositivo que participa en el intercambio se denomina "esclavo". Este dispositivo no afecta el bus del reloj de ninguna manera. Para la comunicación dúplex completa (transferencia en ambas direcciones al mismo tiempo), la interfaz SP utiliza cuatro líneas:

- MOSI - salida maestra y entrada esclava. Esta línea va del maestro al receptor.

MISO - entrada maestra y salida "esclava". En este cable, el maestro recibe datos del dispositivo auxiliar.

SCLK - bus de reloj. En esta línea, el dispositivo "maestro" genera pulsos de reloj.

SS - la elección de "esclavo". Con este cable, el maestro gestiona la sesión de intercambio.

Los niveles lógicos cero y uno están codificados por el valor de voltaje en el bus de datos (MISO y MOSI). La señal SS indica el final y el comienzo de una sesión de intercambio de información. La mayoría de las veces está invertida. Esto significa que durante el intercambio de datos, el dispositivo "maestro" debe configurar la señal en la línea SS a un nivel bajo y, al final del intercambio, a uno alto. La presencia del nivel SS le permite organizar la transmisión a través de varios dispositivos "esclavos" utilizando una señal de reloj y un bus de datos sin protocolos adicionales. Es cierto que con tal conexión, es necesario traer una línea SS separada de cada dispositivo receptor.

SPI(Bus de periféricos en serie) - protocolo de intercambio de periféricos en serie. Este pinchazo fue desarrollado por la empresa motorola, pero actualmente es utilizado por muchos fabricantes. Está diseñado para comunicar microcontroladores entre sí, así como con todo tipo de periféricos: sensores, ADC, chips de memoria, relojes. Sin embargo, el uso más común SPI es un programa escrito en la memoria del microcontrolador. en microcontroladores AVR con la ayuda SPI puede flashear el microcontrolador sin soldarlo desde la placa, este método de firmware se llama ISP (en la programación del sistema). Aunque los nombres SPI y ISP muy consonante, no es lo mismo, en SPI AVR utilizado como capa física ISP, es decir, se utilizan las líneas SPI para la transferencia de datos, pero el protocolo en sí (capa de software) es diferente.

Se utilizan tres líneas para transferir datos a SPI:

MISO (salida de esclavo de entrada maestra)- en esta línea, el Maestro (maestro) recibe datos del Esclavo (esclavo).

MOSI (Entrada de esclavo de salida maestra)– en esta línea el Maestro envía datos al Esclavo.

SCK (reloj serie)- sirve para transmitir una señal de reloj al dispositivo esclavo.

También se utiliza la línea SS (Selección de esclavo), que especifica el dispositivo con el que Maestría intercambiará datos.

Debido al hecho de que muchos fabricantes usan SPI en sus dispositivos, los nombres de los pines pueden diferir ligeramente. A continuación se muestra una tabla con nombres alternativos.


SPI viene en dos formas, hardware y software. Al implementar software SPI, debemos configurar manualmente la señal en las patas de la correspondiente MISO, MOSI, SS mientras se tira SCK. Con implementación de hardware SPI transferimos datos a un registro especial, y el microcontrolador mismo realiza las manipulaciones anteriores, de acuerdo con la configuración preliminar.

Implementación física SPI, son dos registros de desplazamiento conectados entre sí.


Dependiendo de qué nivel lógico de la señal SCK, se produce la sincronización Maestría y esclavo y en qué frente se capturan y desplazan los datos, son posibles 4 modos SPI.

  • CPOL = 0: la señal de sincronización comienza desde un nivel bajo;
  • CPOL = 1: la señal de sincronización comienza desde un nivel alto;
  • CPHA = 0: los datos se muestrean en el flanco ascendente de la señal de sincronización;
  • CPHA = 1: los datos se muestrean en el flanco descendente de la señal de sincronización.
Los oscilogramas a continuación muestran cómo se ve el paquete 0x17 en diferentes modos.
CPOL=0 CPHA=0


CPOL = 1 CPHA = 0


CPOL = 0 CPHA = 1


CPOL=1 CPHA=1

SPI- interfaz síncrona, es decir, para recibir algunos datos de esclavo, Maestría debería enviar algo. Todo parece estar claro, pero ¿y si Maestría envía un byte, y esclavo debe devolverle dos? En este caso, el Maestro debe enviarle algo 2 veces, por ejemplo 0x00.
//enviar el comando, deben aparecer dos bytes en respuesta Spi_Master_Transmit(chx); //enviar algo para recibir el primer byte Spi_Master_Transmit(0X00); toque_x = SPDR; toque_x<<= 8; //отправляем что-нибудь для того чтобы принять второй байт Spi_Master_Transmit(0X00); touch_x |= SPDR; touch_x >>= 3;
Eso es todo, arriba hay un ejemplo de código tomado de un borrador de trabajo.

Interfaz periférica de serie o SPI- interfaz de periféricos en serie, utilizada para conectar los periféricos y el microcontrolador. Por ejemplo, los periféricos pueden ser: una pantalla, varios sensores, una memoria FLASH, una tarjeta SD (sí, sí, la tarjeta SD o "unidad flash" que usa en teléfonos y cámaras se comunica con el mundo exterior usando la interfaz SPI), etc.

Desafortunadamente, no hay documentación oficial para la interfaz SPI, por lo que esta publicación se basa en varios artículos en Internet, mi propia experiencia y la documentación del microcontrolador.

Lea sobre lo que es SPI en los artículos de Wikipedia.

EN SPI siempre hay un amo y uno/varios esclavos.

La transmisión de datos siempre la inicia el maestro.

SPI utiliza cuatro líneas de comunicación:

  • MOSI o SI- salida maestra, entrada esclava MaestríaafueraesclavoEn). Se utiliza para transferir datos del maestro al esclavo.
  • MISO o ASI QUE- entrada maestra, salida esclava MaestríaEnesclavoafuera). Sirve para transferir datos del esclavo al maestro.
  • SCLK o SCK- señal de reloj en serie De seriereloj). Sirve para transmitir una señal de reloj para dispositivos esclavos.
  • CS o SS- selección de chip, selección de esclavo (ing. Selección de chip, Selección de esclavo).

PD Para proporcionar comunicación unidireccional con un dispositivo, es suficiente usar SCLK, MOSI(en caso de que el esclavo solo reciba) o SCLK, MISO(si el dispositivo esclavo no recibe nada, solo transmite información). En la entrada CS el esclavo debe establecerse en una lógica cero de lo contrario, el esclavo no funcionará.

PD Si el dispositivo esclavo transmite y recibe, entonces puede limitarse a tres cables: MISO, MOSI, SCLK, en la entrada CS esclavo también necesita establecer la lógica cero.

SPI se puede implementar en un microcontrolador hardware, entonces la tarea de administrar la interfaz se resuelve para cada microcontrolador por separado, porque las implementaciones pueden variar. por ejemplo, para ATmega328P(microcontrolador Atmel) cuando se trabaja con SPI necesitamos instalar programáticamente en SS lógico cero en inicio de recepción/transmisión y establecer la lógica unidad de regreso a fin de transmisión.

Para transferir datos a un dispositivo esclavo, debe registro de turnos MAESTRO (en el registro de desplazamiento de imagen del maestro - " REGISTRO DE DESPLAZAMIENTO DE 8 BITS"") anote bytes de información transmitida. Al mismo tiempo, automáticamente SCK comenzará a generar señal de sincronización. Esta es la implementación del hardware.

Si no hay soporte de hardware para SPI en el microcontrolador, entonces la interfaz SPI siempre se puede implementar en el software, es decir. crear programa que controla las piernas del controlador de acuerdo con el protocolo de intercambio SP.

Diferencias en las implementaciones de SPI

Los microcircuitos esclavos pueden "interpretar" la señal recibida a través de SPI de diferentes maneras, la diferencia puede estar en los siguientes puntos:

  • en la cantidad de transmisión de datos o tamaño del paquete, por lo general esto 8 bits, pero hay más
  • en orden de bits, primero parte más significante o primero poco bajo
  • sobre a qué nivel de reloj se envían los datos(por uno lógico (ALTO) o cero lógico (BAJO))
  • sobre qué borde del pulso está sincronizado(ascenso o descenso), denominada brevemente como la "fase de sincronización"

Combinación " nivel de señal de reloj" y " fase de sincronización» se define en las especificaciones como Modos de funcionamiento SPI. Solo hay 4to:

Modo Nivel de señal (CPOL) Fase (CPHA)
0 0 0
1 0 1
2 1 0
3 1 1

En la columna " Nivel de señal» , significa que bit de datos, aceptado dispositivo esclavo cuando cero se transmite en la línea de sincronización, en otras palabras, el dispositivo esclavo espera y no recibe datos cuando SCK se establece en lógica 1.

En la columna " Fase» , significa que la señal de sincronización está determinada por borde descendente del reloj y lógico 0-l sobre flanco ascendente del reloj.

PD Además, si en la columna " Nivel de señal» instalado , entonces el frente ascendente y descendente, si se representa en el diagrama, será " al revés».

En gráficos, datos 4to modos se puede representar de la siguiente manera:

Puede leer más sobre los principios de funcionamiento de SPI en el artículo.

http://www.kit-e.ru/articles/interface/2009_03_53.php

Implementación de SPI en microcontroladores ATmega de la serie AVR (ATmega328P) y microcontroladores "primeros" de Motorola

en el microcontrolador ATmega328P(microcontrolador de la serie Atmel AVR) puede controlar lo siguiente parámetros SPI:

Se utilizan tres registros para configurar y controlar la interfaz SPI:

  • registro de control - SPCR
  • Registro de estado - SPSR
  • registro de datos - SPDR

Más sobre cada uno de ellos...

registro de control – « SPCR» 0x2C, escribir dirección 0x4C

— Unidad lógica en 7mo tiempo(nombre de bit SPIE) – habilitar interrupciones desde SPI(Se producirá una interrupción si el bit de activación de interrupción global del registro se establece SREG(séptimo bit)). Después del final de la transferencia de bytes, se generará una interrupción.

— Unidad lógica en sexto bit(nombre de bit - SPE) - para conectar SS, MOSI, MISO y SCK a los puertos del microcontrolador ATmega328P - PB2, PB3, PB4, PB5.

— Unidad lógica en 5to tiempo(nombre de bit DORD) determinará que SPI primero transmitido rango junior, un entonces mayor– Modo LSB. Un cero lógico, por el contrario, que el bit más significativo se transmite primero y luego el menos significativo: el modo "MSB".

— Unidad lógica en 4to bit(nombre de bit - MSTR) — habilitar el modo maestro, cero - habilitar el modo esclavo

— Unidad lógica en 3er tiempo(nombre de bit CPOL) (polaridad de la señal de sincronización o nivel de sincronización) – sincronización está debajo falta de impulso(cero lógico) o el reloj inactivo es 1. Cero lógico: la sincronización se realiza mediante la presencia de un pulso (por uno lógico) o la señal del reloj en el estado de espera es igual a 0. En qué frente (decreciente o ascendente) se realiza la sincronización se determina en 2do poco ( CPHA).

— Unidad lógica en 2do bit(nombre de bit CPHA) (fase de sincronización) - determina que la señal de sincronización determinado por el flanco descendente de SCK y cero lógico flanco ascendente SCK. Además, si se establece 1 en CPOL, entonces los frentes ascendentes y descendentes se representan en el diagrama "al revés".

y 0 poco con poco SPI2x en registro SPSR determinar Tasa de baudios SPI(o frecuencia de reloj SCK). Estos bits son significativos solo para el maestro, para el esclavo no tienen sentido, porque. la tasa de recepción depende de la frecuencia SCK del maestro.

Donde Fosc la frecuencia de reloj del oscilador maestro SPI (generalmente es igual a la frecuencia de reloj del procesador).

Registro de estado - "SPSR"(dirección en ATmega328P para leer 0x2D, escribir dirección 0x4D, si tiene un MK diferente, puede encontrar las direcciones en la documentación)

7mo bit de registro" SPIF': Indicador de interrupción SPI

el bit esta puesto unidad, cuando transferencia de bytes datos sobre MOSI terminado. Si se establece el bit de habilitación de interrupción SPI (bit SPIE) en el registro SPCR, al establecer el indicador SPIF se genera una solicitud de interrupción.

6to bit de registro" WCOL': Escribir indicador de colisión

Poco conflicto de registro registrarse SPDR. el bit esta puesto unidad si en tiempo de transmisión se están procesando datos intento de escritura en registro de datos SPDR.

- con 5to sobre bit - bits reservados, su valor es siempre igual a 0-lu

0 poco " SPI2X»: Doble bit de velocidad SPI

Golpear " Doble velocidad de transmisión de datos". Si el bit está escrito unidad, entonces velocidad transmisión datos duplicados. Combinando este bit y y 0 poco ( SPR1, SPR0) Registrarse SPCR, determinar Velocidad de transmisión datos SPI. .

Registro de datos - "SPDR"(dirección en ATmega328P para leer 0x2E, escribir dirección 0x4E, si tiene un MK diferente, puede encontrar las direcciones en la documentación)

Tamaño de registro como arriba - 8 bits. Este registro se utiliza para transmitir y leer datos a través de SPI. Al poner datos en él, comienza el proceso de transferencia.

Considere 3 ejemplos de trabajo con la interfaz SPI en el ATmega328P en los siguientes entornos:

arduino

#incluir byte x=B11000000; //bit byte transmitido y= B00000000; //el bit de recepción se escribirá en la variable y void setup() ( SPI.begin(); /* Inicialización de SPI */ /* inicialización en Arduino esto significa - establecer uno en SS - establecer en salida SS (Slave Select o selección de esclavo) - 10 pines - establezca el 1.º en los siguientes bits del registro de control SPCR: en el 4.º bit (nombre de bit - MSTR) - habilite el modo maestro en el 6.º bit (nombre de bit - SPE) - conecte SS, MOSI , MISO y SCK a los puertos PB4, PB5, PB6, PB7 (10,11,12,13 pines en arduino) - configure los siguientes pines para salida: SCK (Serial Clock o señal de reloj) - MOSI de 13 pines (Master Out Slave In o datos del maestro) - 11 pines Como resultado de la inicialización a través de SPI.begin(), la configuración de la interfaz SPI es la siguiente: - el orden de los bits "MSB", es decir, el bit más significativo se transmite primero, y luego el menos significativo: la sincronización se lleva a cabo por la presencia de un pulso o una señal de reloj en el estado espera es 0-lu: la señal de reloj está determinada por el flanco ascendente de SCK (los dos elementos anteriores indican que el modo SPI en este caso es 0) - baud rate fosc/4 */ // PODEMOS PREINICIALIZAR ALGUNOS PARÁMETROS DE COMUNICACIÓN SPI nosotros mismos // orden de bits //SPI.setBitOrder(MSBFIRST); /* LSBFIRST - primero junior, luego senior MSBFIRST - primero senior, luego junior (por defecto desde SPI.begin) */ // frecuencia de intercambio de datos //SPI.setClockDivider(SPI_CLOCK_DIV4); /* definido como la relación de fosc al coeficiente, cuyos posibles valores son: SPI_CLOCK_DIV2 SPI_CLOCK_DIV4 SPI_CLOCK_DIV8 SPI_CLOCK_DIV16 SPI_CLOCK_DIV32 SPI_CLOCK_DIV64 SPI_CLOCK_DIV128 */ //Modo de operación SPI //SPI.setDataMode(SPI_MODE0); /* SPI_MODE0 - modo cero SPI_MODE1 - primer modo SPI_MODE2 - segundo modo SPI_MODE3 - tercer modo */ ) void loop() ( /* IMPLEMENTACIÓN DE TRANSFERENCIA DE DATOS A TRAVÉS DE SPI */ digitalWrite(10, HIGH); /* requerido de nosotros, instale hágalo usted mismo en SS 1-tsu */ y=SPI.transfer(x);/* transmisión bit a bit de un argumento (byte) y recibiendo una respuesta del dispositivo esclavo, la transferencia se realiza asignando el valor de un byte al registro SPDR, y en este momento automáticamente en el SCK (pin 13) se genera una señal de reloj */ digitalWrite(10, LOW); /* debemos configurar SS a 0 nosotros mismos */ SPI.end (); /* desactiva el bus SPI desde los pines 10,11,12,13 */ /* es decir, establece 0-ol en el sexto bit (SPE) del registro SPCR */ )

#incluir

byte x = B11000000 ; // bit transmitido

byte y = B00000000 ; //el bit de recepción se escribirá en la variable y

configuración vacía()(

S.P.I. comienzo(); /* inicialización SPI */

/* inicialización en Arduino significa

Establecer unidad en SS

Establecer en salida SS (Slave Select o Slave Select) - 10 pines

Establezca los siguientes bits en el registro de control SPCR en 1:

En el cuarto bit (nombre de bit - MSTR) - habilitar el modo maestro

En el sexto bit (nombre de bit - SPE) - conectar

SS, MOSI, MISO y SCK

A los puertos PB4, PB5, PB6, PB7

(10,11,12,13 pines en arduino)

Configure los siguientes pines para la salida:

SCK (Serial Clock o señal de reloj) - 13 pines

MOSI (Master Out Slave In o datos del maestro) - 11 pines

Como resultado de la inicialización a través de SPI.begin()

La configuración de la interfaz SPI es la siguiente:

Orden de bits "MSB", es decir primero se transmite el dígito más significativo y luego el menos significativo

La sincronización se lleva a cabo por la presencia de un pulso.

O la señal del reloj en estado inactivo es 0-lu

La señal del reloj está determinada por el flanco ascendente de SCK

(los dos puntos anteriores indican que el modo SPI en este caso es 0)

Tasa de baudios fosc/4

// PODEMOS PREINICIALIZAR ALGUNOS PARÁMETROS DE COMUNICACIÓN SPI POR PROPIOS

// orden de bits

//SPI.establecer orden de bits (MSBF PRIMERO);

// frecuencia de comunicación

//SPI.setClockDivider(SPI_CLOCK_DIV4);

/* definido como una relación

Fosc a un coeficiente cuyos posibles valores son:

SPI_CLOCK_DIV2

SPI_CLOCK_DIV4

SPI_CLOCK_DIV8

SPI_CLOCK_DIV16

SPI_CLOCK_DIV32

SPI_CLOCK_DIV64

SPI_CLOCK_DIV128

//Modo de operación SPI

//SPI.setDataMode(SPI_MODE0);

SPI_MODE0 - modo nulo

SPI_MODE1 - primer modo

SPI_MODE2 - segundo modo

SPI_MODE3 - tercer modo

bucle vacío ()

/* IMPLEMENTACION DE TRANSFERENCIA DE DATOS SOBRE SPI */

escritura digital (10, ALTA); /* estamos obligados a instalarlo primero en SS */

y=SPI. transferir(x); /* transfiere el argumento bit a bit (byte) y recibe una respuesta del dispositivo esclavo

La transferencia se realiza asignando el registro SPDR al valor del byte

Y en este momento automáticamente en SCK (pin 13)

Se genera una señal de reloj */

escritura digital (10, BAJO); /* estamos obligados a establecer 0-l en SS nosotros mismos */

S.P.I. fin(); /* deshabilita el bus SPI desde los pines 10,11,12,13 */

/* es decir. establece el bit 6 (SPE) del registro SPCR en 0 */

- Estudio Atmel (AVR GCC)

#incluir #incluir void init_spi() ( DDRB=(1<

#incluir

#incluir

vacío init_spi()(

DDRB = (1<< PB0 ) | (1 << PB1 ) | (1 << PB2 ) | (0 << PB3 ) ;

//configura pines para SPI (SS, SCK, MOSI - salida, entrada MOSI)

// inicialización SPI

// Tipo SPI: Maestro

// Tasa de reloj SPI: 2000,000 kHz

// Fase de reloj SPI: inicio de ciclo

// Polaridad del reloj SPI: Baja

// Orden de datos SPI: MSB primero

SPCR = (0<< SPIE ) | (1 << SPE ) | (0 << DORD ) | (1 << MSTR ) | (0 << CPOL ) | (0 << CPHA ) | (1 << SPR1 ) | (1 << SPR0 ) ;