Nice video, and the follow-up is even better.
Note that in the 2nd, the answer from WDC strikes me as a bit of a shell game ... I really don't think the "synchronous" in synchronous serial means synchronous to the system clock of the receiving device, but rather synchronous with the clock signal line in the serial channel itself.
Also note that I think it might be possible to convert from the intrinsically Mode3 VIA serial shift register to Mode0 with a quad 2-input NAND (74x00) and a single GPIO or selection line.
The idea is, suppose you have an Mode3 clock on a line SPI_CLK3, "/Mode0_Reste" as a GPIO or active low select line, an /S /R latch and an AND gate.
Tie the /Mode0_Reset to the /R reset of the latch, and pull it low, then release it, before selecting the Mode0 SPI device. Now the output of the latch is low.
Use the SPI_CLK3 as the /S set of the latch. So the first time that the SPI_CLK3 is pulled low, the output of the latch goes high.
At the AND gate:
AND_1A := SPI_CLK3
AND_1B := SRLATCH_Q
AND_1Y =: SPI_CLK0
... so when the SPI_CLK3 goes low, the SRLATCH_Q goes high, but SPI_CLK0
remains low until the first rise of the SPI_CLK3 clock phase.
So basically this makes the SPI_CLK0 clock cycle start a half clock phase after the SPI_CLK3 cycle.
When the SPI_CLK3 is finished 8 clock cycles, the SPI_CLK0 is halfway through its eighth clock cycle. Pull down the /R reset line of the latch, which pulls the SPI_CLK0 low, completing its last clock phase and placing it in its low idle state, until the next SPI_CLK3 cycle.
Note that an SPI_CLK1 is just an inverted SPI_CLK3 and an SPI_CLK2 is an inverted SPI_CLK0, so with a system SPI_CLK3 and one /Mode0_Reset, you can any or all of the four SPI clock modes on a dedicated CLKn line, and as long as the SPI servant is connected to the clock line that suits it, the software doesn't need to worry about the mode of the device. So you only need an /SPI_SELECT routine, and an SPI_TRX routine for your SPI devices.
However, most of the SPI device datasheets I have seen are Mode0 only, Mode0/Mode3, Mode0/Mode2 with a polarity select, or Mode1/Mode3 with a polarity select, so having both an SPI_CLK0 line and an SPI_CLK3 line may suffice.
As far as implementing it, two gates of a quad NAND can be used to make an /S /R latch. Using a NAND as the "half phase delay" filter generates a high rather than a low during idle and inverts the clock in operation, which is an SPI_CLK2 rather than an SPI_CLK0. However, that is just 3 of the four NAND gates, so the final NAND gate can be used as an inverter.
This is three gates of delay between SPI_CLK3 and SPI_CLK0, so if it was desired to have a choice between Mode3 and Mode0 based on which SPI_CLK line you hook to the SPI "servant" device, a slower NAND like a 74LS00 would require checking whether the clock delay causes an issue, but with a faster NAND, I'm guessing it wouldn't cause an issue.
Inputs:
SPI_CLK3: a source of a Phase 1, Polarity 1 SPI clock.
/Mode0_Reset: a VIA GPIO or an active low select line that triggers at an appropriate time.
Code:
; NAND1 74x00
; VCC 4B 4A 4Y 3B 3A 3Y
; 14 13 12 11 10 9 8
; 1 2 3 4 5 6 7
; 1A 1B 1Y 2A 2B 2Y GND
NAND_1A := SPI_CLK3 ; /S Set latch
NAND_1B := NAND_2Y
NAND_1Y =: NAND_2A =: NAND_3B ; /Idle_CLK0
NAND_2A := NAND_1Y
NAND_2B := /Mode0_Reset ; /R Reset Latch
NAND_2Y =: NAND_1B
NAND_GND := SYS_GND
;
NAND_VCC := SYS_VCC
NAND_4B := SYS_VCC
NAND_4A := NAND_3Y ; SPI_CLK2
NAND_4Y =: SPI_CLK0 ; => Mode0 SPI bus
NAND_3B := NAND_1Y ; /Idle_CLK0
NAND_3A := SPI_CLK3