#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;
}
Recent Comments