SPI 결과

Seungyun Lee·2026년 2월 1일

Comm_Accel(UART/SPI/I2C)

목록 보기
9/15

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;
}
profile
Design Verification engineer

0개의 댓글