Dshot implementation on Arduino (ESC protocol)
In short, I ended up creating a library capable to drive multiple DShot600 ESCs: 
DShot-Arduino
It still need a lot more polish, but the bit-banging works really well. 



SPI method

I tried the method @dannyf mentioned, which involved combining 3 SPI bytes to form 1 dShot bit and it actually works. 

But there's a few problem with SPI:


It takes up the valuable SPI port, in theory you can still connect other SPI devices, but;
maximum 1 dShot ESC can be connected
During transmission of the packet, the CPU need to wait for the whole task, assume we are sending DShot300, each packet is about 54us long so CPU is halt for that amount of time. If you are doing this in 1000Hz, that is 5% CPU time. 
The timing is not very accurate to the DShot protocol standard


e.g. for DShot300, each bit is 


  1.25us High - 1.25us H/L - 0.83 Low
  
  for a 16MHz Arduino, 1.25us will be 20 CPU cycles which is not accurate to transmit with a SPI byte


I end up with the following codes to send a bit:

inline void dshot_0(){
  SPDR = 0xFF;
  NOP;
  while (!(SPSR &amp; _BV(SPIF))) ;  
  SPDR = 0x60;
  NOP;
  while (!(SPSR &amp; _BV(SPIF))) ;  
  SPDR = 0x00;
  NOP8;
  while (!(SPSR &amp; _BV(SPIF))) ;
}

inline void dshot_1(){
  SPDR = 0xFF;
  NOP;
  while (!(SPSR &amp; _BV(SPIF))) ;  
  SPDR = 0xFF;
  NOP;
  while (!(SPSR &amp; _BV(SPIF))) ;  
  SPDR = 0xF0;
  NOP8;
  while (!(SPSR &amp; _BV(SPIF))) ;  
}


Above code is for DShot150, the SPI was set to 4Mbps, to adhere to the correct timing, I cannot transmit a full DShot byte as all on or all off, here's how the calculation done:


  4Mbit SPI, each bit 0.25us. Thus for 16M clock arduino:
  
  
  DShot 0 sequence: 10 bits of 1, 14 bits of 0
  DShot 1 sequence: 20 bits of 1, 4 bits of 0
  


Those NOPn are just macro for the number of NOPs. I avoided using SPI library code here since the overhead of making library call is quite a lot. 

Pure software bit-banging

This is the method resulted in my library, since using hardware SPI won't give me any advantages of releasing CPU time, and doing some Math gives me that a DShot600 require total 27 CPU cycle on 16MHz UNO. Which the pattern is the following:


  10 Cycle High -> 10 Cycle H/L (depending on bit 1/0) -> 7 cycles low


Which gives total of 1.6875us per bit or 27us per packet. To allow the very tight timing those are coded in assembly. 

Also by applying bit-masking the library is capable of driving at most 8 ESCs on the same hardware port (on UNO, Digital pin 0-7, PORTD). 

Update cycle

One last note about DShot is during my test, I found it is quite strict on the update frequency. It must be updated at exact time interval and I found the slowest update frequency will be around 500Hz. To provide the correct timing for that, the library used Timer 1 and by default update in 1000Hz frequency.