0

Initializing a SI labs radio, the software develops a header file as well as a patch file. first part is, depending on the patch file it outputs different ways. here is a snippet of each patch:

Rev B patch:

#define SI446X_PATCH_CMDS                   \
{ 0x04,0x11,0xF7,0x76,0x00,0x00,0xA6,0x82 }, \
{ 0x05,0x61,0xE6,0x82,0x5E,0xB7,0xFB,0x93 }, \
{ 0x05,0x1E,0x12,0xBD,0x5A,0xC2,0x52,0x41 }, \
{ 0xE7,0xF4,0xDF,0x6A,0x24,0xD9,0xBA,0x31 }, \

OR

Rev C patch:

    #define SI446X_PATCH_CMDS                   \
0x08,0x04,0x21,0x71,0x4B,0x00,0x00,0xDC,0x95, \
0x08,0x05,0xA6,0x22,0x21,0xF0,0x41,0x5B,0x26, \
0x08,0xE2,0x2F,0x1C,0xBB,0x0A,0xA8,0x94,0x28, \
0x08,0x05,0x87,0x67,0xE2,0x58,0x1A,0x07,0x5B, \

Now this will be hardcoded into the software and either one commented out. but it must have been done this way for a reason and i dont understand it. for initial testing i placed each line of 8 bytes (as it needs to be pushed over SPI this way) into an array and then created a pointer to the array since the length isnt necessary as they are all 8 bytes like i said. iss there a more intelligent way i should cade this based on the way it is presented?

uint8_t array_1[8] = { 0x04, 0x11, 0xF7, 0x76, 0x00, 0x00, 0xA6, 0x82 };
uint8_t array_2[8] = { 0x05, 0x61, 0xE6, 0x82, 0x5E, 0xB7, 0xFB, 0x93 };

uint8_t *theArrays[] = { array_1, array_2, array_3, array_4, array_5, array_6,
        array_7, array_8, array_9, array_10, array_11, array_12, array_13,

I then program the SPI using this code and manually typed in the qty into a for loop as i cant get sizeof from the pointer array.

HAL_SPI_Transmit(&hspi1, theArrays[i], 8, 50);
0

1 Answer 1

2

These macros just make things a bit easier. Assuming the number of (sub)arrays in both macros matches the number of arrays in your array of pointers, your code would look like this in full version:

uint8_t array_1[8] = { 0x04, 0x11, 0xF7, 0x76, 0x00, 0x00, 0xA6, 0x82 };
uint8_t array_2[8] = { 0x05, 0x61, 0xE6, 0x82, 0x5E, 0xB7, 0xFB, 0x93 };
uint8_t array_3[8] = ...
uint8_t array_4[8] = ...
uint8_t array_...
uint8_t array_12[8] = ...
uint8_t array_13[8] = ... 

uint8_t *theArrays[] = { array_1, array_2, array_3, array_4, array_5, array_6,
        array_7, array_8, array_9, array_10, array_11, array_12, array_13,

...
   HAL_SPI_Transmit(&hspi1, theArrays[i], 8, 50);

With these macros (stored in some nice header) you can just do this:

Revision B:

#define SPI_MESSAGE_SIZE 8
const uint8_t theArray[][SPI_MESSAGE_SIZE] = {SI446X_PATCH_CMDS};
_Static_assert(sizeof theArray/sizeof *theArray == SOME_EXPECTED_SIZE, "SI446X_PATCH_CMDS corrupt");
...
HAL_SPI_Transmit(&hspi1, theArrays[i], SPI_MESSAGE_SIZE, 50);

or in case of Revision C

#define SPI_MESSAGE_SIZE 8
const uint8_t theArray[] = {SI446X_PATCH_CMDS};
_Static_assert(sizeof theArray/sizeof *theArray == SOME_EXPECTED_SIZE, "SI446X_PATCH_CMDS corrupt");
...
// For Rev C, the array contains a <length> byte before the SPI data.
// Adjust addressing accordingly
uint8_t len = theArrays[i*(SPI_MESSAGE_SIZE+1)];
HAL_SPI_Transmit(&hspi1, &theArrays[i*(SPI_MESSAGE_SIZE+1)+1], len, 50);

The static assert was suggested by Lundin. I am not aware of the correct value to compare but there should be some useful define somewhere in Silabs Radio's headers.

Sign up to request clarification or add additional context in comments.

10 Comments

I use these Silabs radios too and this answer looks very similar to what I would have done as well. Optionally add _Static_assert(sizeof theArray/sizeof *theArray== SOME_EXPECTED_SIZE, "SI446X_PATCH_CMDS corrupt");
I hand typed this out and am trying to avoid it if possible but in your example it seems this is still neccessary? uint8_t array_1[8] = { 0x04, 0x11, 0xF7, 0x76, 0x00, 0x00, 0xA6, 0x82 }; uint8_t array_2[8] = { 0x05, 0x61, 0xE6, 0x82, 0x5E, 0xB7, 0xFB, 0x93 };
@RyanTC Just use the const uint8_t theArray[][SPI_MESSAGE_SIZE] = {SI446X_PATCH_CMDS};. The hex blob should be in some header.
@RyanTC No, all those arrays are replaced by a single one. That first code is the corresponding part to the snippets belos.
@RyanTC Just keep that in mind when you send it over the SPI. Read the first byte, send the following "size read" number of bytes, repeat.
|

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.