Autor Tema: Transmición SPI - Dudas  (Leído 5654 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado JCAK

  • PIC18
  • ****
  • Mensajes: 325
Transmición SPI - Dudas
« en: 23 de Diciembre de 2010, 11:14:44 »
Hola colegas !!!


Este es el ejemplo que viene con el ATMEL, el cual me funciona

Código: [Seleccionar]
void SPI_Transmit(char cData)
{
/* Start transmission */
SPDR = cData;
/* Wait for transmission complete */
while(!(SPSR & (1<<SPIF)))
;
}

Este otro es un código que deseo probar pero no se que dato enviar a las variables que pide, no se a que se refiere con len ¿la len de qué?
¿Por favor, alguien me pasa una linea de código para entender como llamar esta rutina?

Código: [Seleccionar]
void SPI_Transmit(uint8_t *data, uint8_t len) {
    SS_LO();
    data += len - 1;
    for (; len > 0; len--) {
        SPDR = *data--;
        while (! (SPSR & _BV(SPIF))) {
         // Busy loop.
        }
    }
    SS_HI();
}


Cuál es la ventaja entre usar un ejemplo o el otro.


Gracias a todos y MUY FELICES FIESTAS !!!!!
Julio - Argentina

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Transmición SPI - Dudas
« Respuesta #1 en: 23 de Diciembre de 2010, 11:24:44 »
Hola, en la primera función solo transmitís de a un byte, en la segunda podes transmitir un buffer, el parámetro len indica el largo del buffer a transmitir.  Se llamaría así:

Código: C
  1. uint8_t Buffer[16];
  2.  
  3.   // Se llena el buffer de alguna manera, podria ser desde el puerto serie
  4.  
  5.   SPI_Transmit( Buffer, sizeof( Buffer ));

Desconectado JCAK

  • PIC18
  • ****
  • Mensajes: 325
Re: Transmición SPI - Dudas
« Respuesta #2 en: 24 de Diciembre de 2010, 01:22:12 »
Hola, en la primera función solo transmitís de a un byte, en la segunda podes transmitir un buffer, el parámetro len indica el largo del buffer a transmitir.  Se llamaría así:

Código: C
  1. uint8_t Buffer[16];
  2.  
  3.   // Se llena el buffer de alguna manera, podria ser desde el puerto serie
  4.  
  5.   SPI_Transmit( Buffer, sizeof( Buffer ));



Hola Richi777
Supongamos que tengo que trasnmitir estos dos byte 0b10000001 0b100000100 ¿cómo debería armar la linea del ejemplo?
Perdón que repregunte pero no entiendo bien la explicación en cuanto a la forma de pasar el valor.

Saludos y gracias por la ayuda.
Julio - Argentina

Desconectado stk500

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 4923
Re: Transmición SPI - Dudas
« Respuesta #3 en: 24 de Diciembre de 2010, 03:28:51 »

Desconectado JCAK

  • PIC18
  • ****
  • Mensajes: 325
Re: Transmición SPI - Dudas
« Respuesta #4 en: 24 de Diciembre de 2010, 20:19:40 »
Hola STK500, gracias por tu ayuda pero no responde puntualmente a lo que yo estoy preguntando.
Entiendo el concepto de SPI pero debido a mi falta de conocimientos en C, se me complican algunas cosas y por eso pido si alguien puede darme un ejemplo similar al de Richi777 pero aplicando esos byte que puse de ejemplo.

Mi problema actual es haber logrado enviar datos via SPI byte por byte pero no logré enviar una cadena de N bytes, lo cual estoy necesitando hacer en este momento.

No necesito leer sobre SPI, necesito ayuda de C aplicado a SPI. Por favor si alguien lee el ejemplo de Richi777 y me dice concretamente como mando por ejemplo estos dos bytes 0b10000001 y 0b10000100, le estaré muy agradecido.

Felices fiestas para todos y mis buenos deseos.

Julio
« Última modificación: 27 de Diciembre de 2010, 13:33:34 por JCAK »
Julio - Argentina

Desconectado JCAK

  • PIC18
  • ****
  • Mensajes: 325
Re: Transmición SPI - Dudas
« Respuesta #5 en: 28 de Diciembre de 2010, 00:41:41 »
Hola Amigos

Después de mucho probar logré leer de a un byte tal como muestra el ejemplo, pero cómo hago si quiero cargar en el buffer N bytes.  :(

¿Alguien me daría una manito con lo que me falta?

Código: [Seleccionar]

    const prog_uint8_t PROGMEM Cadena[3] = {
  0b10000001,
  0b10000100,
  0b10010000,
    };


uint8_t Buffer[1];

for (x=0; x<3; x++) {
*Buffer = pgm_read_byte(&Cadena[x]);
SPI_MasterTransmit(Buffer, sizeof(Buffer));
}


Gracias
« Última modificación: 28 de Diciembre de 2010, 00:52:12 por JCAK »
Julio - Argentina

Desconectado cristian_elect

  • PIC18
  • ****
  • Mensajes: 453
Re: Transmición SPI - Dudas
« Respuesta #6 en: 28 de Diciembre de 2010, 13:45:58 »
no manejo winavr pero algo seria asi:
Código: C
  1. for(char x=0;x<3;x++){
  2.   SPI_Transmit(pgm_read_byte(&cadena[x]);
  3. }
« Última modificación: 28 de Diciembre de 2010, 13:52:24 por cristian_elect »

Desconectado JCAK

  • PIC18
  • ****
  • Mensajes: 325
Re: Transmición SPI - Dudas
« Respuesta #7 en: 28 de Diciembre de 2010, 17:41:46 »
Hola Cris, tal vez me exprese mal.
Hasta el momento tengo lo siguiente, pero de esta manera solo envío byte por byte del array. Yo quiero poder enviar los tres bytes como una sola cadena, todos los bytes en un mismo paquete, por ejemplo 100000011000010010010000

¿Como hago?

Código: [Seleccionar]
const prog_uint8_t PROGMEM Cadena[3] = {
  0b10000001,
  0b10000100,
  0b10010000,
};


uint8_t Buffer[1];

for (x=0; x<3; x++) {
  *Buffer = pgm_read_byte(&Cadena[x]);
  SPI_Transmit(Buffer, sizeof(Buffer));
}


void SPI_Transmit(uint8_t *data, uint8_t len) {
    SS_LO();
    data += len - 1;
    for (; len > 0; len--) {
        SPDR = *data--;
        while (! (SPSR & _BV(SPIF)));
    }
    SS_HI();
}
« Última modificación: 28 de Diciembre de 2010, 19:49:32 por JCAK »
Julio - Argentina

Desconectado cristian_elect

  • PIC18
  • ****
  • Mensajes: 453
Re: Transmición SPI - Dudas
« Respuesta #8 en: 29 de Diciembre de 2010, 15:28:38 »
En SPI atmega solo manda 8bits por paquete. Hay otros micro que tiene parecido al spi pero este es mas flexible que permite enviar de 4bits a 16bits.
ahora tu transmisor envia 3bytes segun tu ejemplo de un array de 3 variales tipo char(8bits).
Para que se entienda que una varible de 24bits el receptor debe unirlas una vez recividas en una de tipo long.

Desconectado JCAK

  • PIC18
  • ****
  • Mensajes: 325
Re: Transmición SPI - Dudas
« Respuesta #9 en: 30 de Diciembre de 2010, 00:45:28 »
En SPI atmega solo manda 8bits por paquete. Hay otros micro que tiene parecido al spi pero este es mas flexible que permite enviar de 4bits a 16bits.
ahora tu transmisor envia 3bytes segun tu ejemplo de un array de 3 variales tipo char(8bits).
Para que se entienda que una varible de 24bits el receptor debe unirlas una vez recividas en una de tipo long.


Ok, gracias Cristian. Tal vez entonces mi problema sea otro, concretamente mi problema es que yo debo poder hacer lo siguiente y no me esta andando:

1- Poner el SS Low
2- Enviar todos los bytes que yo quiera
3- Poner el SS Hi

El problema que tengo actualmente, es que el SS Low y SS Hi lo hace por cada byte en lugar de hacerlo cuando termino de enviar todos los bytes. Debido a que estos bytes los mando a un dispositivo que no es SPI pero funciona parecido, tengo problemas si no recibe todos los bytes juntos y solo cuando termina de enviarlos hace el SS en lugar de hacerlo con cada byte como lo hace ahora.

Esta vez me perdi bastante, porque ya probé de usar otro pin que no sea el SS para controlarlo aparte, pero da la impresiòn como que no sincroniza, ni se entera de lo que mando, es como que no supiera donde empieza y donde termina.

¿Que es lo que hago mal, cómo debería hacerlo?

Gracias
Julio - Argentina

Desconectado cristian_elect

  • PIC18
  • ****
  • Mensajes: 453
Re: Transmición SPI - Dudas
« Respuesta #10 en: 30 de Diciembre de 2010, 15:21:34 »
Yo comunique un atmega32 (SPI) con un ARM CORTEX M3 (SSI) los dos tiene que terner la misma forma de comunicarce
el SSI es flexible se configura como SPI.
Si el SPI del atmega tiene la siguientes configuracion:
Modo 0 tiene sus caracteristica como fase del clock, polaridar del clock y es master (genera los pulsos y determina la frecuencia) entoces el SSI tiene que tener las mismas caracteristicas modo 0 en esclavo.
Depende del tipo de micro que tienes debe tener un manual como configurarel modulo compatible con SPI en Modo0, Modo1,...Modo3.