Autor Tema: Ejemplo Simulación del módulo spi  (Leído 62297 veces)

0 Usuarios y 5 Visitantes están viendo este tema.

Desconectado isa12345

  • PIC10
  • *
  • Mensajes: 19
Re: Ejemplo Simulación del módulo spi
« Respuesta #15 en: 17 de Febrero de 2011, 17:38:10 »
gracias por los aportes pero quisera tener una comunicacion full udplex entre los pics por el modulo spi. si alguine puede ayudarme lo agradeceria mucho gracias
« Última modificación: 28 de Febrero de 2011, 16:20:54 por isa12345 »

Desconectado Simon21

  • PIC18
  • ****
  • Mensajes: 302
Re: Ejemplo Simulación del módulo spi
« Respuesta #16 en: 31 de Agosto de 2011, 21:08:28 »
Hola a todos, muy bueno el tema que estan llevando a cabo.
Ya con haberlo leido aprendi mucho sobre SPI.

Ahora bien, paso a comentarles mi caso, estoy intentando trabajar con
el integrado ADE7758 de analog devices. A continuacion su hoja de datos.

http://www.analog.com/static/imported-files/data_sheets/ADE7758.pdf

A partir de la pagina 58 explica sobre como acceder a cada uno de sus
registros.

Mi pregunta es la siguiente, vi que ustedes han comunicado dos pics mediante
SPI, uno funcionando como maestro y otro como esclavo.

En este caso, deberia configurar el pic como maestro, ya que el esclavo es
el ADE7758 ??

Como tengo que hacer para poder acceder a cada uno de los parametros que
mide dicho integrado ??

Desde ya gracias por sus respuestas, parece que hace rato que vienen estudiando
SPI  :lol:   :lol: 

Saludos a todos !!
INGENIERIA ELECTRONICA
UNIVERSIDAD TECNOLOGICA NACIONAL

Desconectado Chenao

  • PIC18
  • ****
  • Mensajes: 414
Re: Ejemplo Simulación del módulo spi
« Respuesta #17 en: 01 de Septiembre de 2011, 13:23:04 »


En efecto Simon21, el microcontrolador debe ser el dispositivo maestro. Para medir los parámetros que entrega el integrado debes consultar el datasheet, debe ser parecido al manejo de una microsd, donde el microcontrolador envia la orden (que puede ser escritura, lectura, información acerca de la memoria), "pero igual que cualquier dispositivo que utiliza este tipo de comunicación debe ser inicializado correctamente al principio de la comunicación" Una vez el microntrolador solicitá la orden el dispositivo esclavo responde de acuerdo a los pulsos del reloj.

Para finalizar debes tener en cuenta que la frecuencia con que se están comunicando los dos dispositivo debe ser muy parecidas, de lo contrario, no hay seguridad que funciones correctamente la comunicación.

Saludos.
Un saludo desde Pereira - Colombia

Desconectado Simon21

  • PIC18
  • ****
  • Mensajes: 302
Re: Ejemplo Simulación del módulo spi
« Respuesta #18 en: 01 de Septiembre de 2011, 19:19:00 »
Cito a continuacion tus dos ejemplos chenao...

---------MAESTRO----------

#if defined(__PCM__)
#include <16f877.h>
#use delay(clock = 4000000)

void main()
{
  int i,conversion;
  set_tris_c(16);                                  // Configuración del puerto C para trabajar el spi
  setup_spi(spi_master | spi_l_to_h | spi_clk_div_16);
  setup_adc_ports(RA0_RA1_ANALOG_RA3_REF);         // configuro los pines de la conversion
  setup_adc(adc_clock_div_32);                     // configuro el conversor análogo digital
  conversion = 0;
 
  do
   {
     set_adc_channel(0);                           // escojo el canal a convertir
     delay_ms(1);                                  // esperar mientras se inicializa el módulo A/D
     conversion = read_adc();                      // leer el valor
     delay_ms(1);
     spi_write(conversion);
   }
  while(true);
}

---------ESCLAVO----------

#if defined(__PCM__)
#include <16f877.h>
#use delay(clock = 4000000)
#byte puerto_b=06

void main()
{
  set_tris_a(255);
  set_tris_c(223);
  set_tris_b(0);
  puerto_b = 0;
  setup_spi(spi_slave | spi_l_to_h | spi_clk_div_16| SPI_XMIT_L_TO_H);
  do
   {
     if(spi_data_is_in())
       {
         puerto_b = spi_read();
       }
   }
  while(true);
}

Es muy facil entender ambos programas, en mi caso para acceder a los distintos registros
del ADE7758, como debo hacer, en el caso de tu código MAESTRO ??

Agradeceria que me des una mano en esto.

Saludos !!
INGENIERIA ELECTRONICA
UNIVERSIDAD TECNOLOGICA NACIONAL

Desconectado Simon21

  • PIC18
  • ****
  • Mensajes: 302
Re: Ejemplo Simulación del módulo spi
« Respuesta #19 en: 01 de Septiembre de 2011, 21:02:20 »
Por lo que me parece, debo configurar el pic para q sea esclavo, ya que leera los valores que le envie
el integrado ADE.. El tema es que uno tambien puede escribir en los registros de dicho integrado
para cambiar algunos parametros...
INGENIERIA ELECTRONICA
UNIVERSIDAD TECNOLOGICA NACIONAL

Desconectado Chenao

  • PIC18
  • ****
  • Mensajes: 414
Re: Ejemplo Simulación del módulo spi
« Respuesta #20 en: 02 de Septiembre de 2011, 10:43:27 »

En la memorias microsd el microcntrolador es el encargado de enviar vía SPI los camandos de orden para que la tarjeta responda, es decir, si el controlador envia la orden de escritura la memoria responde a dicha orden.

A continuación muestro una rutina para inicializar una memoria microsd con un pic16f877

Código: [Seleccionar]
///////////////////////////////////////////// Rutina que reinicializa la memoria ////////////////////////////////////////

int init_mmc()
  {
    SETUP_SPI(SPI_MASTER | SPI_H_TO_L | SPI_CLK_DIV_16 | SPI_XMIT_L_TO_H);
    OUTPUT_HIGH(PIN_C2);
    for(i=0; i<20; i++)
      {
        SPI_WRITE(0xFF);             // espero a que se inicialice la memoria que van desde 8 a 10 pulso del reloj
      }
    OUTPUT_LOW(PIN_C2);             // Activo la targeta
    for(i=0; i<20; i++)
      {
        SPI_WRITE(0xFF);             // espero a que se inicialice la memoria que van desde 8 a 10 pulso del reloj
      }
    SPI_WRITE(0x40);
    SPI_WRITE(0x00);
    SPI_WRITE(0x00);
    SPI_WRITE(0x00);
    SPI_WRITE(0x00);
    SPI_WRITE(0x95);                // Comando CMDO datos a enviar
    if(mmc_respuesta(0x01)==1)
      {
        return 1;                    // Error en memoria por que se supero el tiempo
      }
    i = 0;
    do
      {
        SPI_WRITE(0x41);         // Envia comando hasta que de la respuesta y hasta que se cumpla el tiempo
        SPI_WRITE(0x00);
        SPI_WRITE(0x00);
        SPI_WRITE(0x00);
        SPI_WRITE(0x00);
        SPI_WRITE(0xFF);            // Secuencia del comando CMD1
        i= i + 1;
      }
    while((i<250) && (mmc_respuesta(0x00)==0x01));
    if(i>=250)
      {
        return 1;                // si se supera el tiempo de respuesta no se ha inicializado bien la targeta
      }
    SPI_WRITE(0x50);
    SPI_WRITE(0x00);
    SPI_WRITE(0x00);
    SPI_WRITE(0x02);
    SPI_WRITE(0x00);
    SPI_WRITE(0xFF);              // Comando CMD16 para configurarlo de 512 bytes
    delay_ms(2);
    if(mmc_respuesta(0x00)==0x01)
      {
        return 1;                // se ha inicializado incorrectamente
      } 
    OUTPUT_HIGH(PIN_C2);
    return 0;                // se ha inicializado correctamente 
   
  }



Nota como el microcontrolador envía los comandos y espera a que el dispositivo responda, lo mismo se debe hacer para tu dispositivo, debes enviar el comando y esperar respuesta del dispositivo esclavo.

Saludos




















Un saludo desde Pereira - Colombia

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Ejemplo Simulación del módulo spi
« Respuesta #21 en: 02 de Septiembre de 2011, 12:23:47 »
  Mas allá que el PIC reciba los datos del integrado, es casi seguro (no digo 100% porque nunca usé dicho integrado) que el PIC tiene que estar configurado como maestro. Por ejemplo, para leer una memoria también recibe los datos de dicha memoria y sin embargo está configurado como maestro.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado Simon21

  • PIC18
  • ****
  • Mensajes: 302
Re: Ejemplo Simulación del módulo spi
« Respuesta #22 en: 06 de Septiembre de 2011, 17:24:17 »
Muy buena explicacion Chenao, en estos dias voy a armar el circuito en una proto para
empezar a hacer pruebas, ya que no puedo simularlo  :?

Respecto a la sincronizacion de ambos dispositivos, hay que configurar algo en especial ?
Digo esto ya que el 16F877A que voy a usar va a ser con un cristal de 4 MHz, y
el ADE7758 lleva uno de 10 MHz, por eso tengo la duda si hay que configurar algo para
ponerlos en sincronismo.

Saludos a todos, gracias por sus aportes !!
INGENIERIA ELECTRONICA
UNIVERSIDAD TECNOLOGICA NACIONAL

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Ejemplo Simulación del módulo spi
« Respuesta #23 en: 06 de Septiembre de 2011, 18:04:14 »
  Más allá de los cristales, tenés que tener en cuenta la velocidad del módulo SPI. Debés asegurarte de configurar una velocidad que no sea superior a la máxima soportada por el dispositivo.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado Simon21

  • PIC18
  • ****
  • Mensajes: 302
Re: Ejemplo Simulación del módulo spi
« Respuesta #24 en: 06 de Septiembre de 2011, 18:58:49 »
Buena respuesta AngelGris.
Se supone que la velocidad del modulo spi la configuro en la siguiente linea ?

SPI_CLK_DIV_16

Otra pregunta q se me hizo al ver el código es que funcion cumplen todas estas
lineas ?

    SPI_WRITE(0x40);
    SPI_WRITE(0x00);
    SPI_WRITE(0x00);
    SPI_WRITE(0x00);
    SPI_WRITE(0x00);
    SPI_WRITE(0x95);                // Comando CMDO datos a enviar

Saludos !!
INGENIERIA ELECTRONICA
UNIVERSIDAD TECNOLOGICA NACIONAL

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Ejemplo Simulación del módulo spi
« Respuesta #25 en: 06 de Septiembre de 2011, 21:30:51 »
Buena respuesta AngelGris.
Se supone que la velocidad del modulo spi la configuro en la siguiente linea ?

SPI_CLK_DIV_16



  Sí, esa es la opción para configurar la velocidad... Fijate en la ayuda del compilador que debería haber otras opciones, dependiendo del PIC.



Otra pregunta q se me hizo al ver el código es que funcion cumplen todas estas
lineas ?

    SPI_WRITE(0x40);
    SPI_WRITE(0x00);
    SPI_WRITE(0x00);
    SPI_WRITE(0x00);
    SPI_WRITE(0x00);
    SPI_WRITE(0x95);                // Comando CMDO datos a enviar

Saludos !!

  Imagino que esos son comando que se envían a la memoria microsd que comenta Chenao.

  En tu caso, habría que ver que comandos hay que enviarles al dispositivo (si es que es necesario enviar alguno), y ver como sería la lecutra.... Yo no utilizo CCS, así que no estoy del todo seguro como son sus funciones.

  En todo caso, voy a ver si me hago un tiempo para leer el datasheet del dispositivo y ver si puedo aportar algo.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado Simon21

  • PIC18
  • ****
  • Mensajes: 302
Re: Ejemplo Simulación del módulo spi
« Respuesta #26 en: 06 de Septiembre de 2011, 22:08:42 »
Si, en realidad son los comandos que se le envian al dispositivo, pero no entiendo para que pone la linea
 SPI_WRITE(0x40); y luego repite 4 veces SPI_WRITE(0x00);
Supongo que es por si el micro no la recibe en la primera, lo va a recibir en alguna de las siguientes..

Gracias por tu aporte Angel Gris, abrazo !!
INGENIERIA ELECTRONICA
UNIVERSIDAD TECNOLOGICA NACIONAL

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Ejemplo Simulación del módulo spi
« Respuesta #27 en: 07 de Septiembre de 2011, 12:06:21 »
  Hola Simon, no encuentro en Proteus el ADE como para poder simularlo.

  Por otro lado, leyendo el datasheet de dicho integrado, veo que se puede acceder a varios registros tanto para escribir en ellos como para leerlos. Básicamente la comunicación consta de enviar un primer byte con la dirección de registro a acceder (con el bit 7 en 1 o 0 según se quiera leer o escribir dicho registro). Luego enviar la cantidad de bytes necesaria, si la operación era de escritura, y si la operación es de lectura recibir los bytes. necesarios. La cantidad de bytes de cada registro está indicada en la tabla 17 del datasheet

  A modo de mnemónico sería

Código: C
  1. pin_cs = 0; //comienzo comunicación con el dispositivo
  2. write_spi (0x0e); //registro 0E para lectura (supuestamente leere el valor V RMS  de la fase B)
  3. parte_alta = read_spi(); // leo el byte de mayor peso
  4. parte_media = read_spi(); // leo la parte media del registro
  5. parte_baja = read_spi(); // leo el byte de menor peso
  6. pin_cs = 1; // termino la comunicación con el dispositivo
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado Chenao

  • PIC18
  • ****
  • Mensajes: 414
Re: Ejemplo Simulación del módulo spi
« Respuesta #28 en: 07 de Septiembre de 2011, 15:58:16 »
Que pena por noresponde antes. En lo refetente a la siguiente pregunta

Citar
Otra pregunta q se me hizo al ver el código es que funcion cumplen todas estas
lineas ?

    SPI_WRITE(0x40);
    SPI_WRITE(0x00);
    SPI_WRITE(0x00);
    SPI_WRITE(0x00);
    SPI_WRITE(0x00);
    SPI_WRITE(0x95);                // Comando CMDO datos a enviar


La memoria microsd tiene un registro de 6 bytes los cuales hay que direcionar, por ejemplo el comando al cual hago referencia es para activar la memoria, figate que dependiendo el comando que debe enviar el microcontrolador cambia los datos a envia por el bus SPI.

Tengo que sacar algo de tiempo para leer el datasheet y poder contribuir en algo, espero seguir ayudando.

Nota: Los ejemplos que he puesto a lo largo del presente hilo se pueden simular en proteus 7.0 sin problema, incluyendo el de la microsd.

Saludos.
« Última modificación: 07 de Septiembre de 2011, 16:02:02 por Chenao »
Un saludo desde Pereira - Colombia

Desconectado Simon21

  • PIC18
  • ****
  • Mensajes: 302
Re: Ejemplo Simulación del módulo spi
« Respuesta #29 en: 08 de Septiembre de 2011, 18:32:38 »
Gracias por las respuestas, me esta sirviendo muchisimo.
Finalmente voy a ir probando en el micro ya que no puedo
simularlo.
Para conectarlo fisicamente, a que pines del pic 16F877A
debo conectar cada uno de estos pines de mi dispositivo?

DOUT
SCLK
CS
DIN
IRQ

CS e IRQ son negados.

Saludos !!

INGENIERIA ELECTRONICA
UNIVERSIDAD TECNOLOGICA NACIONAL


 

anything