Autor Tema: Variable 64bits y cast a 4 int de 16 bits  (Leído 3427 veces)

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

Desconectado elgarbe

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2178
Variable 64bits y cast a 4 int de 16 bits
« en: 12 de Octubre de 2014, 11:48:12 »
Tengo una duda, en un LPC1347 tengo el SPI con un frame de 16bits, o sea que le debo pasar de a 16 bits. Pero los datos los tengo organizados en un array de, por ejemplo, 200 uint64_t. Para el manejo de datos me sirve que sean datos completos de 64 bits, pero para sacarlos por el SPI necesito pasarlos a 16 bits.
Tengo 2 formas de hacerlo (creo), la tradicional, sería tomar los 16 LSB y guardarlos en data16[0], luego enmascarar y rotar los siguientes 16 bits y guardarlos en data16[1] y así susecivamente. Estaba pensando en la segunda opcion, podría funcionar declarar un array de 4 int16 y apuntarlo al dato de 64 bits?

sería algo así:

Código: [Seleccionar]
uint64_t Fila;
uint16_t DatosFila[4];

DatosFila = &Fila;

por supuesto que eso no compila, el tema sería si se puede con logica de punteros y como...

Saludos!
-
Leonardo Garberoglio

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7918
Re: Variable 64bits y cast a 4 int de 16 bits
« Respuesta #1 en: 12 de Octubre de 2014, 14:22:48 »
Declaralo como una estructura de datos, donde podrás usarlo como dos de 32 o 4 de 16 bits...
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado elgarbe

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2178
Re: Variable 64bits y cast a 4 int de 16 bits
« Respuesta #2 en: 12 de Octubre de 2014, 14:25:30 »
Declaralo como una estructura de datos, donde podrás usarlo como dos de 32 o 4 de 16 bits...

el dia que dieron estructura de datos en la facu falte a la clase  :oops:
como sería el tema?

sds.
-
Leonardo Garberoglio

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Variable 64bits y cast a 4 int de 16 bits
« Respuesta #3 en: 12 de Octubre de 2014, 19:57:25 »
Hola Leo,

si lo que necesitás es trabajarlos de a 64 bits y enviarlos de a 16, no necesitas mucho.

Código: C#
  1. uint64_t Datos[200]; //tus datos de  a 64 bits cada uno

y para enviar los datos por el SPI:  

Código: C#
  1. void enviarChunk16bitsSPI(uint16_t offset, uint32_t length)
  2. {
  3.     uint16_t * ptrDatosSPI = (uint16_t *)Datos;  //apuntar a principio del array
  4.     ptrDatosSPI+= offset;                     //desplazar hasta el primer elemento del array a enviar (notese que cada elemento desplazado por offset es de 16 bits)
  5.    SSPSend16( ptrDatosSPI, length);                //enviar por SPI
  6. }

y en la librería del SSP, agregar una funcion que permita enviar de a 16 bits por vez (la original permite solo de hasta 8 bits por vez)

Código: C#
  1. void SSPSend16( uint16_t *buf, uint32_t Length )
  2. {
  3.   uint32_t i;
  4.   uint16_t Dummy = Dummy;
  5.    
  6.   for ( i = 0; i < Length; i++ )
  7.   {
  8.         /* Move on only if NOT busy and TX FIFO not full. */
  9.         while ( (LPC_SSP->SR & (SSPSR_TNF|SSPSR_BSY)) != SSPSR_TNF );
  10.         LPC_SSP->DR = *buf;
  11.         buf++;
  12. #if !LOOPBACK_MODE
  13.         while ( (LPC_SSP->SR & (SSPSR_BSY|SSPSR_RNE)) != SSPSR_RNE );
  14.         /* Whenever a byte is written, MISO FIFO counter increments, Clear FIFO
  15.         on MISO. Otherwise, when SSP0Receive() is called, previous data byte
  16.         is left in the FIFO. */
  17.         Dummy = LPC_SSP->DR;
  18. #else
  19.         /* Wait until the Busy bit is cleared. */
  20.         while ( LPC_SSP->SR & SSPSR_BSY );
  21. #endif
  22.   }
  23.   return;
  24. }

Es la idea al menos. No lo he testeado. Tene en cuenta que si el FIFO de salida del SSP se satura porque intentas enviar en cada chunk mas datos de los que entran en el FIFO, la funcion SSPSend16 va a bloquear el procesador hasta que se haga lugar para poder encolar todo lo pedido. Administrá bien el FIFO, los tiempos entre envíos y tiempos de liberación del FIFO (o usa la interr de medio FIFO TX vacío).

Acordate también de modificar el SSPInit() para que envie tramas de 16 bits c/u!

Saludos!
« Última modificación: 12 de Octubre de 2014, 20:08:41 por BrunoF »
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado elgarbe

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2178
Re: Variable 64bits y cast a 4 int de 16 bits
« Respuesta #4 en: 12 de Octubre de 2014, 20:41:33 »
Joya, el segundo código era lo que me faltaba, al spi ya lo tengo trabajando con 16bits.

Gracias!
-
Leonardo Garberoglio


 

anything