No se si son validas las declaraciones de los tipos, yo normalmente me manejo con uint8_t, uint16_t, uint32_t, float. Pero bueno por eso aclare en el primer post sobre la converson de las unidades, si es que es eso.
Si a por lo ultimo es a por lo que e ido acavo de probarlo pero le falta ago o me falta algo amy Cuando declaro la estructura (eso a mi me parece lo que es) El compilador me da un monton de errores en lineas que no tienen nada que ver con ella Si cambio 'struct' por 'union' pasa lo mismo.
No puedo olvidarme del "tipo" de variable, cuando justo lo que necesito es este "tipo" es imprescindible Aunque ahora me dedique a hacer pruebas a lo bestia pasando datos descomunales a intencion de hacerlo lo mas rapido posible (Esto no es necesario en proyecto original, pero si el float)
No es una estructura. En una estructura los datos no comparten el mismo espacio de datos, Si fuera una estructura tendrias en memoria algo asi:
Float ( ocupa 4 byte, y supongamos que tiene los valores 0x11223344 ) + el array de 4 que supongo que tiene 0xAA,0xBB,0xCC,0xDD
0x11 22 33 44 AA BB CC DD
Conla union se ocupa el espacio de lo mas grande declarado adentro, PERO comparten la misma memoria Tuvieramos el caso de que el float fuera 0x11 0x22 0x33 0x44
0x11 (igual a bytes[0]) , 0x22 (byets[1]) , 0x33 (bytes[2]) , 0x44(bytes[3])
Por lo demas es igual que una estructura, como definirlo etc. Lo que veo que me falt es un " ; " al final de la declaracion de la union, esta seria la correcta para que compares:
union FloatData {
float data;
int8 bytes[4];
};
Volviendo al principio que es EnviarSPI((shor int *)&datoFloat,sizeof(datoFloat)); ¿fucion,macro,define? EnviarSPI No esta declarado en ningun sitio
¿que es lo que hace darte el tamaño de float?
La funcion Enviar SPI esta escrita justo abajo del main(), incluso agregue la de Enviar y Recibir que son casi lo mismo, lo mas seguro es que le falta el prototipo al comienzo:
void EnviarSPI(short int *ptr,short int largo);
Es lo unico que puede decirte por lo que no esta esta declarado.
Para que se entienda lo que intente hacer con esa funcion. Normalmente un puntero aumenta segun el tipo que sea. Supongamos que tengo un puntero a un int8 y un int16
int8 *ptr8 = &variable8bits; // Supone que la direccion es de 16 bits, pero puedo acceder a la misma hasta en bytes y esta en 0x11223344
int16 *ptr16 = &variable16bits; // y este en 0x22334455
Entonces le asigno la direccion de cada variable asi con *ptr8 , *ptr16 accedo al contenido de esa variable. Pero que ocurre cuando uno hace un
ptr8++;
ptr16++;
Los valores de las direcciones van a quedar:
ptr8 esto es igual a 0x11223345
ptr16 esto es igual a 0x22334457
ptr8 aumento 1 byte, y ptr16 aumento 2 bytes, si hubiera tenido un puntero a un float o un int 32, aumentarian de a 4 bytes.
Entonces lo que hago es:
EnviarSPI(
(shor int *)&datoFloat,sizeof(datoFloat));
Pasarle la direccion de inicio pero forzar a que el puntero sea de 1 byte (y no de 4 como es un float), entonces al aumentar lo hago de a 1 solo byte por ves y no 4 como seria un float, Y como ya perdi el "tamaño" es decir no se exactamente de cuantos bytes es lo que meti dentro ( 16,24,32) entonces envio un sizeof() que basicamente me dice la cantidad de bytes que ocupa ese dato. Finalmente:
short int i;
for(i=0;i<largo;i++)
spi_write(*ptr++);
Procedo a enviarlo, suponete que el float tiene por bytes 0x11 0x22 0x33 0x44 y en la direccion 0x123456
Entonces el primer *ptr++ es 0x11 ubicado en 0x123456 , por el ++ aumenta a 0x12357
Lo cual el segudo *ptr++ es 0x22 y asi en adelante, hasta que se completen los 4 bytes pasados por el sizeof()
Fue lo que se me ocurrio en el momento, todo lo hice desde el gedit de Ubuntu, por decirlo asi el Bloc de notas de Windows, asi que no habia una correccion de sintaxis, ni pruebas, ni nada por el estilo.
Tambien pense en hacer uno con un void pointer para evitar el cast (short int *) fuera de la funcion de recepcion/envio, pero estaba seguro que iba a ser mas problemas.
PD: Deberias probar la solucion de RALF de hacerlo con spi_xfer() tambien