A bit further today with my understanding.
The writes from the VB to the RAM is as follows:
WRITE_ADDR is reset to 0 an a LOW to HIGH transition of the chip select (CS) input.
WRITE_ADDR is incremented an a LOW to HIGH transition of the SHIFT input.
If the CS input is HIGH and SHIFT transitions from LOW to HIGH, this initiates a write of D15..D0 into the RAM at the WRITE_ADDR. There will be some additional timing constraints on exactly when WRITE_ADDR is incremented and the WRITE to the RAM is performed. I am not too bothered with this detail at the moment.
As a result, the 16-bit data bus (from the VB) is stored into RAM starting at address 0 (when the CS is activated) and incrementing by 1 for each shift pulse.
28 shift pulses gives us a complete LED vertical strip of LED pixels and further pulses gives us each horizontal 'fame'.
However, when the 16-bit data word is read from the RAM - it is split up as follows into eight (8) pixel values of two (2) bits each
Code:
Data bit: D15 D14 D13 D12 D11 D10 D09 D08 D07 D06 D05 D04 D03 D02 D01 D00
PIXEL_OUT: D0 D1 D0 D1 D0 D1 D0 D1 D1 D0 D1 D0 D1 D0 D1 D0
------ ------ ------ ------ ------ ------ ------ ------
PAIR_INDEX: 1 3 5 7 6 4 2 0
Note how the D0 and D1 (two bit brightness for each pixel) are swapped between the high byte of the word and the low byte of the word.
This accounts for why the 2/3 and 1/3 brightness equates to 0x55AA and 0xAA55 respectively.
Now to work on the how the data is read out of the RAM and displayed on the screen. This is for another day... Hopefully, this will identify the order of the pixels/data bits in the shift registers.
Dave