41 lines
988 B
C
Executable File
41 lines
988 B
C
Executable File
#include <stdarg.h>
|
|
#include <stdio.h>
|
|
|
|
#include "FreeRTOS.h"
|
|
#include "task.h"
|
|
|
|
#include "project.h"
|
|
|
|
#define NUM_BITS_ADDR (UTIL_ADDR + 0x100)
|
|
#define DEV_SEL_ADDR (UTIL_ADDR + 0x104)
|
|
#define SPI_DATA_ADDR (UTIL_ADDR + 0x108)
|
|
#define SPI_CLK_DIV_ADDR (UTIL_ADDR + 0x10C)
|
|
#define SPI_ACTIVE_ADDR (UTIL_ADDR + 0x110)
|
|
#define SPI_CLK_DIV 16
|
|
|
|
uint32_t reverse_bits(int num_bits, uint32_t data) {
|
|
uint32_t result = 0;
|
|
for (int i = 0; i < num_bits; i++) {
|
|
result |= ((data >> i) & 1) << (num_bits - 1 - i);
|
|
}
|
|
return result;
|
|
}
|
|
|
|
int32_t rf_spi_write(int dev_sel, int num_bits, int data) {
|
|
|
|
uint32_t bit_reversed = reverse_bits(num_bits, data);
|
|
|
|
Xil_Out32(DEV_SEL_ADDR, dev_sel);
|
|
Xil_Out32(SPI_CLK_DIV_ADDR, SPI_CLK_DIV);
|
|
Xil_Out32(SPI_DATA_ADDR, bit_reversed);
|
|
// Writing this reg starts the transaction
|
|
Xil_Out32(NUM_BITS_ADDR, num_bits - 1);
|
|
|
|
// Poll to wait for transcation to complete
|
|
while (Xil_In32(SPI_ACTIVE_ADDR)) {
|
|
// Wait
|
|
}
|
|
|
|
return 0;
|
|
}
|