Realmente BitShift simple no funciona en AVR32

S

sebmaster

Guest
Hola,

Tengo una AVR32 que necesita enviar 21 palabras poco (mínimo) a un CPLD.

Tengo la intención de utilizar el bus SPI para esto y han conseguido crear todo para arriba, con un tamaño de palabra de 11 bits.

La idea es que tome un entero, tome la parte superior 11 bits, el cambio que dejó a 11 lugares, tome la parte superior 11 bits de nuevo, a continuación, enviar los dos valores en el orden inverso llegué (a los SPI envía datos LSB primero).

Sin embargo, mi programa no funciona y no puedo entender por qué no, mirando a la salida de SPI en un ámbito de aplicación de la LSB (los primeros 21 bits enviados) son siempre cero.

Mi valor de la prueba es 0xFFFFFFFF así que tendríamos que hacer un poco de desplazamiento de 16 antes de que el valor de la palabra menor puede bajar por debajo de su máximo ¿no?

Aquí está mi código:
Código:

spi_status_t respuesta;

word_high unsigned short = (datos y 0xFFE0);

data = datos <<11; / / desviación a la izquierda por 11 lugares para conseguir palabra próximos 11 bits.

word_low unsigned short = (datos y 0xFFE0);respuesta = spi_write (spi, word_low);if (respuesta == SPI_OK)

(While (spi_writeEndCheck (spi) == 0) ()

volver spi_write (spi, word_high);

)

más

retorno de respuesta;
 
Supongo que 'unsigned short' es de 16-bits?

Si los datos se 0xffffffff, (64 bits)
Entonces
word_high = (unsigned short) (datos y 0xffe00000);

datos <<= 11;

word_low = (unsigned short) (datos y 0xffe00000);

 
Hola btbass,

Hice los cambios que usted ha manifestado (mientras doy patadas difícil para el error 0xffe0/0xffe00000), pero ahora los dos cortos muestran un valor de 0 en el depurador.

Cuando altera la máscara de leer 0xFFE0000F el corto tiene un valor de 15.

Estoy seguro de que mi dispositivo es big-endian, página 5 de este documento de Atmel sin duda lo dice: http://www.atmel.com/dyn/resources/prod_documents/doc32000.pdf, pero lo que con el bus SPI que enviar datos a LSB primero (cuando yo estaba seguro de que los diagramas datasheet mostró MSB primero) Estoy empezando a dudar de ella.

¿Es posible que el dispositivo podría ser grande-endian, aún cuando el tipo de fundición a presión a un tipo más pequeño sea el dispositivo (compilador /?) Se inicia en la dirección más alta (LSB)?

EDIT: Bueno, acabo de pensar lo que sería el resultado si cada lenguaje de programación en el mundo truncó el lugar de la LSB MSB cuando se hace una conversión de tipos reducción (para empezar la mitad de todo lo que he escrito wouldnt de trabajo!) Así que pienso ir mal alterar mi programa antes de hacerme ver más estúpido!

¡Gracias!

 
Estoy seguro que el compilador debe tener cuidado de la endiness?
Otro enfoque es

word_high = (uint16_t) (0xffe0 & (los datos>> 16));
word_low = (uint16_t) (0xffe0 y datos);

 
Hola btbass,

Creo que debemos hacer.Yo estaba confundido porque yo estaba imaginando el encasillado truncar los 16 LSB (yo todavía no sé de dónde saqué esa idea).

Ahora máscara todos menos ellos, que cambio de valor, desplazamiento a la derecha 11 lugares y hacer lo mismo otra vez, mirando a la posibilidad que parece que funciona.

El otro punto de confusión fue la orden del bus SPI utiliza, es MSB primera diferencia que se reunieron antes debido a mi error anterior.

Al parecer, para enviar datos MSB primero, pero trunca el MSB del valor, por lo que se corta la parte superior 5 bits, pero envía el resto MSB por primera vez cuando tienen un tamaño de palabra de 11.

Ahora sólo deseo que no había modificado mi programa CPLD aceptar primero .... LSB

Gracias por tu ayuda, no sé cuánto tiempo habría estado en torno a flote!

 

Welcome to EDABoard.com

Sponsor

Back
Top