8x8 LED Matrix with MAX7219 - Control with software SPI
Try replacing your transmitData() function, as follows:

// Assume CS=1, to start. Leave with CS=1, as well.
void transmitData( uint16_t reg, uint16_t data ) {
    transmitByte( reg );
    transmitByte( data );
    GPIOA-&gt;ODR &amp;= ~( 1 &lt;&lt; CS );
    delay(10);
    GPIOA-&gt;ODR |= (1 &lt;&lt; CS );
}

// Assume SCK=1, to start. Leave with SCK=1, as well.
// (MOSI is left in the last state of the data bit.)
void transmitByte( uint16_t data ) {
    for ( uint16_t m= 0x80; m != 0; ) {
        delay(10);
        GPIOA-&gt;ODR &amp;= ~( 1 &lt;&lt; SCK );
        if ( (data &amp; m) == 0 ) GPIOA-&gt;ODR &amp;= ~( 1 &lt;&lt; MOSI );
        else GPIOA-&gt;ODR |= ( 1 &lt;&lt; MOSI );
        m &gt;&gt;= 1;
        delay(10);
        GPIOA-&gt;ODR |= ( 1 &lt;&lt; SCK );
    }
}


Now, I don't have a compiler to check for stupid typing errors or forgetting to declare a needed variable. But it should get across the idea, anyway.

I've created an intermediate function to transmit a byte, since the communication appears to break down this way. The transmitByte() function handles the transmission of one byte. Each send-packet to the MAX7219 requires two bytes: one for the register and one for the data used to modify that register value.

You can change that uint16_t to a uint8_t, if you have such a thing available, in transmitByte(). I couldn't tell if you had one (though I expect you do.)

The code I wrote assumes that CLK and LOAD (your SCK and CS) lines are all '1' to start. So you'd need to initialize those according to this new plan. Something like this:

void initMAX7219( ) {
    GPIOA-&gt;ODR |= ( 1 &lt;&lt; SCK );
    GPIOA-&gt;ODR |= (1 &lt;&lt; CS );
    transmitData( 0x0B, 0x07 ); //Scan Limit
    delay( 50000 );
    transmitData( 0x09, 0x00 ); //Decode Mode
    delay( 50000 );
    transmitData( 0x0C, 0x01 ); //Shutdown Mode
    delay( 50000 );
    transmitData( 0x0F, 0x00 ); //Display Test
    delay( 50000 );
    transmitData( 0x0A, 0x0F ); //Intensity to max value
    delay( 50000 );
    transmitData( 0x01, 0x01 ); //Display '1'
    delay( 50000 );
}


Note that I've added an intensity register change?

Use the above to consider your code, or try it out. One thing I think is important is that you may have missed adjusting the intensity register value. So perhaps just change your code on that point and see if it gets you there. But, if it doesn't, try out the above changes and see if that makes a difference.