Bit re-mapping / re-arranging
SPI write actually supports any number of bits in the format.
see for http://mbed.org/forum/mbed/topic/1630/ for ref to my original query.
For my own sake, here is some hashing out for a remapping routine, might come in useful at some point or another.
#include "mbed.h" short InputArray [23]; //24 elements char OutputArray [35]; //3 elements char swapnibbles(char myChar) { char swapped = ((myChar >> 4) & 0x0f) | ((myChar << 4) & 0xf0); return swapped; } ///can these be refactored in to a single routine which accepts //input value //number of bits to mask (as a value) //offset (to push to maskup or down against the value) //and still return a byte //use the offset to calculate how much to push resulting masked off section back down to fit into a char? char botnibble(short Input) { char OutputByte = 0; short BitMask = 0x000F; //Mask off the bottom nibble only short Temp = 0; Temp = (Input & BitMask); //Logical AND Mask and Input to get the lower nibble only OutputByte = OutputByte + Temp; return OutputByte; } char midnibble(short Input) { char OutputByte = 0; short BitMask = 0x00F0; //Mask off the middle nibble only short Temp = 0; Temp = (Input & BitMask); //Logical AND Mask and Input to get the lower nibble only OutputByte = OutputByte + (Temp >> 4); //shift all the bits in the result right 4 places such that value is in the bottom of the byte return OutputByte; } char topnibble(short Input) { char OutputByte = 0; short BitMask = 0x0F00; //Mask off the top nibble only short Temp = 0; Temp = (Input & BitMask); //Logical AND Mask and Input to get the lower nibble only OutputByte = OutputByte + (Temp >> 8); //shift all the bits in the result right 8 places such that value is in the bottom of the byte return OutputByte; } main() { int i = 0 ; char a,b,c,d,e,f = 0; for (i=0; i<=23;i++) { a = botnibble(InputArray[(2*i)]); b = midnibble(InputArray[(2*i)]); c = topnibble(InputArray[(2*i)]); d = botnibble(InputArray[((2*i)+1)]); e = midnibble(InputArray[((2*i)+1)]); f = topnibble(InputArray[((2*i)+1)]); OutputArray[(3*i)] = a + swapnibbles(b); OutputArray[((3*i)+1)] = c + swapnibbles(d); OutputArray[((3*i)+2)] = e + swapnibbles(f); }; }
0 comments
You need to log in to post a comment