Diferencia entre revisiones de «Ejemplo de comunicación por SPI»
(→Código de Configuración inicial del Microcontrolador) |
|||
(No se muestran 19 ediciones intermedias del mismo usuario) | |||
Línea 1: | Línea 1: | ||
− | + | La comunicación por SPI para el microcontrolador [[MC9S08QE128]] se encuentra descrita en el artículo [[SPI: Interfaz de Serial Periferico para el microcontrolador QE - MC9S08QE128]]. En este caso se quiere realizar la comunicación con un giróscopo digital [[Medio:L3G4200D.pdf | L3G4200D]]. Este sensor provee información sobre los 3 ejes de movimiento y adicionalmente un sensor de temperatura. La comunicación puede ser a través de I2C o de de SPI tal como se va a describir a continuación. | |
− | + | == Descripción de los pines del L3G4200D == | |
− | + | ||
− | + | ||
− | La comunicación por SPI para el microcontrolador [[MC9S08QE128]] se encuentra descrita en el artículo [[SPI: | + | |
− | + | ||
− | + | ||
+ | [[Archivo:Pines_L3G4200D.jpg|3000px|thumb|derecha|Pines del L3G4200D]] | ||
{| class="wikitable" | {| class="wikitable" | ||
Línea 20: | Línea 16: | ||
|- | |- | ||
− | |GND || | + | |GND || Conexión a Tierra 0V |
|- | |- | ||
Línea 36: | Línea 32: | ||
|- | |- | ||
− | |SDO|| | + | |SDO|| Bus del SPI para la salida de datos, donde ALTO es VDD y BAJO es 0V / También es usado para la salida de las direccion en modo Maestro para la comunicación por I²C. |
|- | |- | ||
− | |CS|| | + | |CS|| SPI enable (chip select), este debe estar en BAJO (0V) para comenzar la comunicación / Debe estar en VDD para permitir comunicación por I²C. |
|- | |- | ||
− | |DRDY/INT2|| | + | |DRDY/INT2|| Indicador de datos listos, es decir señala que los datos ya pueden ser leídos,este tiene una salida de 3.3 V (ALTO). También se puede configurar como una interrupción FIFO. |
|- | |- | ||
− | |INT1|| | + | |INT1|| Interrupciones programables con una salida de 3.3 V |
|} | |} | ||
+ | == Descripción del Reloj de L3G4200D == | ||
+ | Para la comunicación por SPI el sensor L3G4200D requiere que se configure el reloj SPI a 10Mhz, sin embargo esta no es una limitante, pues las pruebas realizadas, se realizaron con un reloj de 1Mhz, lo que si no se puede modificar son las configuraciones de las polaridades que se describen a continuación: | ||
+ | La polaridad de reloj en estado alto cuando se encuentra inactivo (CPOL = 1) y con la fase de reloj con flanco de bajada sincronizado con el inicio del primer bit (CPHA = 1), ver la configuración de los registros del microcontrolador [[MC9S08QE128]] para la comunicación por SPI. | ||
− | + | [[Archivo:Tiempos_Reloj_giro.jpg|500px|thumb|centro|Tiempos del Reloj para la comunicación por SPI del L3G4200D]] | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
La selección del sensor para iniciar la transmisión se consigue colocando el pin CS del dispositivo en estado digital bajo (0v), es necesario regresarlo al estado alto (3v) una vez que se ha terminado la transmisión. | La selección del sensor para iniciar la transmisión se consigue colocando el pin CS del dispositivo en estado digital bajo (0v), es necesario regresarlo al estado alto (3v) una vez que se ha terminado la transmisión. | ||
+ | == Descripciones adicionales de los recursos del L3G4200D == | ||
El sensor cuenta con una cola FIFO de 32 posiciones (cada una de 16 bits) para cada uno de los 3 canales del giróscopo. Esto quiere decir que cada canal puede guardar un histórico de los 32 datos mas recientes. Esto puede ayudar al micro a ahorrar potencia ya que no tiene que hacer encuesta continua al sensor para obtener los datos. En el momento que el microcontrolador lo requiera puede solicitar los datos desde la cola FIFO. '''Esta cola FIFO se puede deshabilitar colocando el sensor en modo BYPASS.''' | El sensor cuenta con una cola FIFO de 32 posiciones (cada una de 16 bits) para cada uno de los 3 canales del giróscopo. Esto quiere decir que cada canal puede guardar un histórico de los 32 datos mas recientes. Esto puede ayudar al micro a ahorrar potencia ya que no tiene que hacer encuesta continua al sensor para obtener los datos. En el momento que el microcontrolador lo requiera puede solicitar los datos desde la cola FIFO. '''Esta cola FIFO se puede deshabilitar colocando el sensor en modo BYPASS.''' | ||
''NOTA DESCRIBIR CON DETALLE: El SPI del micro manda/recibe bloques de 8bits, mientras que el SPI del sensor manda/recibe bloques de 16bits. Por lo tanto, para cada transmisión es necesario enviar desde el micro dos bytes consecutivos y leer dos bytes consecutivos.'' | ''NOTA DESCRIBIR CON DETALLE: El SPI del micro manda/recibe bloques de 8bits, mientras que el SPI del sensor manda/recibe bloques de 16bits. Por lo tanto, para cada transmisión es necesario enviar desde el micro dos bytes consecutivos y leer dos bytes consecutivos.'' | ||
− | + | [[Archivo:Diagrama_bloques_giro.jpg|500px|thumb|derecha|Diagrama de Bloques del L3G4200D]] | |
+ | |||
+ | ==Configuración inicial del Microcontrolador== | ||
Configuración inicial del SPI | Configuración inicial del SPI | ||
Línea 93: | Línea 78: | ||
=== Código de Configuración inicial del Microcontrolador=== | === Código de Configuración inicial del Microcontrolador=== | ||
− | Configuración para empezar a utilizar el modulo del SPI en MODO MAESTRO | + | *Configuración para empezar a utilizar el modulo del SPI en MODO MAESTRO |
<syntaxhighlight lang="c"> | <syntaxhighlight lang="c"> | ||
void SPI_Init(void){ | void SPI_Init(void){ | ||
Línea 102: | Línea 87: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
+ | |||
+ | === Código de Ejemplo para el manejo del Sensor L3G4200D === | ||
+ | |||
+ | ====Rutinas de lectura y escritura del Sensor L3G4200D usando el protocolo de comunicación SPI en MODO MAESTRO ==== | ||
+ | *Configuración para la lectura del datos de un registro | ||
+ | <syntaxhighlight lang="c"> | ||
+ | |||
+ | byte Leer_Giro (byte direccion) { | ||
+ | PTCD_PTCD7 = 0; //Se coloca el Chip Select en bajo para empezar la lectura o escritura en el giro | ||
+ | temp = SPI2S; //Se limpia la bandera del registro del SPI | ||
+ | SPI2D = direccion; //Colocar la direccion del registro WHO_AM_I | ||
+ | while (SPI2S_SPRF==0); //Pregunto si recibi el valor | ||
+ | PrimerByte = SPI2D; //Se coloca el primer dato en la variable PrimerByte | ||
+ | return PrimerByte; | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | *Configuración para la escritura del datos de un registro | ||
+ | |||
+ | <syntaxhighlight lang="c"> | ||
+ | |||
+ | void Escribir_Giro (byte direccion, byte dato){ | ||
+ | PTCD_PTCD7 = 0; //Se coloca el Chip Select en bajo para empezar la lectura o escritura en el giro | ||
+ | temp = SPI2S; //Se limpia la bandera del registro del SPI | ||
+ | SPI2D = direccion; //Colocar la direccion del registro WHO_AM_I | ||
+ | while (SPI2S_SPRF==0); //Pregunto si recibi el valor | ||
+ | PrimerByte = SPI2D; //Se coloca el primer dato en la variable PrimerByte | ||
+ | temp = SPI2S; //Se limpia la bandera del registro del SPI | ||
+ | SPI2D= dato; //Se escribe el dato deseado en la direccion | ||
+ | temp=PrimerByte; //Se limpia la variable | ||
+ | } | ||
+ | |||
+ | </syntaxhighlight> | ||
+ | |||
+ | == Referencias == | ||
+ | |||
+ | *[http://www.freescale.com/files/microcontrollers/doc/ref_manual/MC9S08QE128RM.pdf '''Reference Manual.''' ''Freescale''] | ||
+ | |||
+ | *[http://www.freescale.com/files/microcontrollers/doc/user_guide/DEMOQE128UM.pdf ''DEMOQE128 User Manual'' DEMOQE rev A] | ||
+ | |||
+ | *[[ Medio:L3G4200D.pdf |'''Datasheet L3G4200D.''']] |
Revisión actual del 15:21 19 abr 2013
La comunicación por SPI para el microcontrolador MC9S08QE128 se encuentra descrita en el artículo SPI: Interfaz de Serial Periferico para el microcontrolador QE - MC9S08QE128. En este caso se quiere realizar la comunicación con un giróscopo digital L3G4200D. Este sensor provee información sobre los 3 ejes de movimiento y adicionalmente un sensor de temperatura. La comunicación puede ser a través de I2C o de de SPI tal como se va a describir a continuación.
Contenido
Descripción de los pines del L3G4200D
PIN | Descripción |
---|---|
VIN | Esta es la principal fuente de energía que va de 2.5V a 5.5 V |
GND | Conexión a Tierra 0V |
VDD | Salida del Regulador 3.3 V |
SCL/SPC | Nivel del shifted del I²C /SPI Clock: ALTO si VIN, BAJO si 0 V |
SDA/SDI | Nivel del shifted del I²C (Linea de Datos) / SPI (Linea de Datos) ALTO si VIN, BAJO si 0 V |
SDO | Bus del SPI para la salida de datos, donde ALTO es VDD y BAJO es 0V / También es usado para la salida de las direccion en modo Maestro para la comunicación por I²C. |
CS | SPI enable (chip select), este debe estar en BAJO (0V) para comenzar la comunicación / Debe estar en VDD para permitir comunicación por I²C. |
DRDY/INT2 | Indicador de datos listos, es decir señala que los datos ya pueden ser leídos,este tiene una salida de 3.3 V (ALTO). También se puede configurar como una interrupción FIFO. |
INT1 | Interrupciones programables con una salida de 3.3 V |
Descripción del Reloj de L3G4200D
Para la comunicación por SPI el sensor L3G4200D requiere que se configure el reloj SPI a 10Mhz, sin embargo esta no es una limitante, pues las pruebas realizadas, se realizaron con un reloj de 1Mhz, lo que si no se puede modificar son las configuraciones de las polaridades que se describen a continuación:
La polaridad de reloj en estado alto cuando se encuentra inactivo (CPOL = 1) y con la fase de reloj con flanco de bajada sincronizado con el inicio del primer bit (CPHA = 1), ver la configuración de los registros del microcontrolador MC9S08QE128 para la comunicación por SPI.
La selección del sensor para iniciar la transmisión se consigue colocando el pin CS del dispositivo en estado digital bajo (0v), es necesario regresarlo al estado alto (3v) una vez que se ha terminado la transmisión.
Descripciones adicionales de los recursos del L3G4200D
El sensor cuenta con una cola FIFO de 32 posiciones (cada una de 16 bits) para cada uno de los 3 canales del giróscopo. Esto quiere decir que cada canal puede guardar un histórico de los 32 datos mas recientes. Esto puede ayudar al micro a ahorrar potencia ya que no tiene que hacer encuesta continua al sensor para obtener los datos. En el momento que el microcontrolador lo requiera puede solicitar los datos desde la cola FIFO. Esta cola FIFO se puede deshabilitar colocando el sensor en modo BYPASS. NOTA DESCRIBIR CON DETALLE: El SPI del micro manda/recibe bloques de 8bits, mientras que el SPI del sensor manda/recibe bloques de 16bits. Por lo tanto, para cada transmisión es necesario enviar desde el micro dos bytes consecutivos y leer dos bytes consecutivos.
Configuración inicial del Microcontrolador
Configuración inicial del SPI
- Configuración de la Fase del reloj SPI (CPHA = 1)
- Configuración de la polaridad del reloj SPI (CPOL = 1)
- Configuración de la frecuencia del reloj SPI
- Configurar el pre-escalador a 10MHZ
- Habilitar interrupciones del SPI en Recepción
- Escribir en el Registro SPI1D la dirección de WHOAMI
- Esperar bandera de buffer de transmision empty.
- Mando cualquier cosas al SPID
- Espero la bandera de Receiver buffer Full
- Leo el SPI1D y comparo si es igual a lo que dice WHOAMI
Código de Configuración inicial del Microcontrolador
- Configuración para empezar a utilizar el modulo del SPI en MODO MAESTRO
void SPI_Init(void){
SPI2C1=0x7E; /*Configuracion del registro del control*/
/*Configuracion Modo Master, con todas las interrupciones deshabilitadas
y con la direccion del shifter con el bit mas significactivo */
SPI2BR=0x77; /*Configura el prescaler configurado a 1MHz*/
}
Código de Ejemplo para el manejo del Sensor L3G4200D
Rutinas de lectura y escritura del Sensor L3G4200D usando el protocolo de comunicación SPI en MODO MAESTRO
- Configuración para la lectura del datos de un registro
byte Leer_Giro (byte direccion) {
PTCD_PTCD7 = 0; //Se coloca el Chip Select en bajo para empezar la lectura o escritura en el giro
temp = SPI2S; //Se limpia la bandera del registro del SPI
SPI2D = direccion; //Colocar la direccion del registro WHO_AM_I
while (SPI2S_SPRF==0); //Pregunto si recibi el valor
PrimerByte = SPI2D; //Se coloca el primer dato en la variable PrimerByte
return PrimerByte;
}
- Configuración para la escritura del datos de un registro
void Escribir_Giro (byte direccion, byte dato){
PTCD_PTCD7 = 0; //Se coloca el Chip Select en bajo para empezar la lectura o escritura en el giro
temp = SPI2S; //Se limpia la bandera del registro del SPI
SPI2D = direccion; //Colocar la direccion del registro WHO_AM_I
while (SPI2S_SPRF==0); //Pregunto si recibi el valor
PrimerByte = SPI2D; //Se coloca el primer dato en la variable PrimerByte
temp = SPI2S; //Se limpia la bandera del registro del SPI
SPI2D= dato; //Se escribe el dato deseado en la direccion
temp=PrimerByte; //Se limpia la variable
}