
vitis C code
#include <stdio.h>
#include "platform.h"
#include "xil_printf.h"
#include "xil_io.h"
#include "sleep.h"
// [중요] Address Editor에서 확인한 SPI IP 주소
#define SPI_BASEADDR 0x40000000
// 레지스터 오프셋 정의
#define REG_CTRL (SPI_BASEADDR + 0x00) // Control (Bit 0: Start)
#define REG_STATUS (SPI_BASEADDR + 0x04) // Status (Bit 0: Busy, Bit 1: Done)
#define REG_TX_DATA (SPI_BASEADDR + 0x08) // TX Data (Write Only)
#define REG_RX_DATA (SPI_BASEADDR + 0x0C) // RX Data (Read Only)
int main() {
init_platform();
xil_printf("\n\r=== SPI Master Loopback Test (Address: 0x%08x) ===\n\r", SPI_BASEADDR);
u32 tx_val = 0xAA; // 보낼 데이터 (10101010)
while(1) {
xil_printf("[CPU] Sending Data: 0x%02X ... ", tx_val);
// 1. TX 레지스터에 데이터 쓰기
Xil_Out32(REG_TX_DATA, tx_val);
// 2. Start 신호 주기 (Control 레지스터에 1 쓰기)
Xil_Out32(REG_CTRL, 0x01);
// 3. 끝날 때까지 기다리기 (Polling)
// Status 레지스터의 1번 비트(Done)가 1이 될 때까지 대기
while(1) {
u32 status = Xil_In32(REG_STATUS);
if (status & 0x02) { // Bit 1 is Done
break;
}
}
// 4. Start 신호 끄기 (다음을 위해 0으로 초기화)
Xil_Out32(REG_CTRL, 0x00);
// 5. 받은 데이터 읽기
u32 rx_val = Xil_In32(REG_RX_DATA);
xil_printf("Done! | [CPU] Received: 0x%02X\n\r", rx_val);
// 다음 데이터를 위해 값 변경
tx_val++;
sleep(1);
}
cleanup_platform();
return 0;
}