#include <xs1.h>
#include <platform.h>
#include <xclib.h>

#define LED_PERIOD 20000000

on stdcore[1]: out buffered port:32 sclk = PORT_SPI_CLK;
on stdcore[1]: out buffered port:32 mosi = PORT_SPI_MOSI;

on stdcore[1]: clock blk1 = XS1_CLKBLK_1;
on stdcore[1]: clock blk2 = XS1_CLKBLK_2;

void send_word(unsigned int data) {
	//check MSB of data and set MOSI line accordingly
	//skip check if you need SPI mode 3, and set clock pattern to 0xFFFFFFFF

	if (data & 0x80000000)
		configure_out_port(mosi, blk2, 1);
	else
		configure_out_port(mosi, blk2, 0);

	//reverse data to big endian order
	mosi <: (bitrev(data) >> 1);

	//clock pattern
	sclk <: 0x55555555;
	sclk <: 0x55555555;
	// wait until clocked output operation is finalized.
	sync(sclk);
}

void gogo() {
	unsigned int data = 0;
	unsigned int i = 0;

	// configure clocked output
	// SCLK data rate is 50MHz/4 = 12.5MHz
	configure_clock_rate(blk1, 100, 4);
	configure_out_port(sclk, blk1, 0);
	configure_clock_src(blk2, sclk);
	configure_out_port(mosi, blk2, 0);

	clearbuf(mosi);

	start_clock(blk1);
	start_clock(blk2);

	while (1) {
		send_word(data);

		data = 0;

		i++;

		if (i >= 108) {
			i = 0;
			data = 1;
		}
	}
}

int main() {
	par {
		on stdcore[1]: gogo();
	}
	return 0;
}