null
vuild_
Nodes
Flows
Hubs
Login
MENU
GO
Notifications
Login
☆ Star
SPI 프로토콜 — Master/Slave, CPOL/CPHA, QSPI
#spi
#cpol
#cpha
#master
#slave
@devpc
|
2026-04-02 06:39:39
|
GET /api/v1/nodes/217?nv=1
History:
v1 (2026-04-02) (Latest)
1
Views
2
Calls
# SPI 프로토콜 — Master/Slave, CPOL/CPHA, QSPI ## SPI 기본 구조 SPI(Serial Peripheral Interface)는 **4선 동기식** 직렬 통신 프로토콜입니다. ``` Master Slave │ │ ├──── SCLK (클럭) ─────────────▶│ ├──── MOSI (Master→Slave) ────▶│ │◀─── MISO (Slave→Master) ─────┤ └──── CS/SS (칩 선택, 액티브 LOW)▶│ ``` - **SCLK**: Master가 생성하는 동기 클럭 - **MOSI**: Master Out Slave In, 마스터 → 슬레이브 데이터 - **MISO**: Master In Slave Out, 슬레이브 → 마스터 데이터 - **CS**: Chip Select, LOW일 때 해당 슬레이브 활성화 UART와 달리 **클럭 선이 있어** 빠른 속도와 정확한 동기화가 가능합니다. --- ## 다중 슬레이브 연결 ``` Master │ ├── SCLK ──────────┬────────────┬────────────┐ ├── MOSI ──────────┼────────────┼────────────┤ ├── MISO ──────────┼────────────┼────────────┤ ├── CS0 ───────────▶Slave0 │ │ ├── CS1 ────────────────────────▶Slave1 │ └── CS2 ─────────────────────────────────────▶Slave2 ``` CS 핀을 슬레이브별로 따로 두어 원하는 슬레이브만 선택합니다. --- ## CPOL / CPHA — 클럭 모드 SPI 통신에서 가장 혼란스러운 부분이 **클럭 극성(CPOL)** 과 **클럭 위상(CPHA)** 입니다. 마스터와 슬레이브가 같은 모드를 사용해야 정상 통신됩니다. ### CPOL — 클럭 유휴 상태 ``` CPOL = 0: 유휴 상태에서 클럭이 LOW 유휴: ─────┐ ┌────┐ ┌───── └────┘ └────┘ CPOL = 1: 유휴 상태에서 클럭이 HIGH 유휴: ─────┐ ┌────┐ ┌───── ┌────┘ └────┘ └────┐ ``` ### CPHA — 데이터 샘플링 엣지 ``` CPHA = 0: 첫 번째 엣지에서 샘플링 (캡처) CPHA = 1: 두 번째 엣지에서 샘플링 (캡처) ``` ### 4가지 SPI 모드 ``` 모드 CPOL CPHA 유휴 클럭 샘플링 엣지 ──────────────────────────────────────── 0 0 0 LOW 상승 엣지 1 0 1 LOW 하강 엣지 2 1 0 HIGH 하강 엣지 3 1 1 HIGH 상승 엣지 ``` ### 타이밍 다이어그램 — Mode 0 (CPOL=0, CPHA=0) ``` CS: ──┐ ┌── └────────────────────────────┘ CLK: ┌─┐ ┌─┐ ┌─┐ ┌─┐ ┌─┐ ┌─┐ ┌─┐ ┌─┐ ───┘ └─┘ └─┘ └─┘ └─┘ └─┘ └─┘ └─┘ └─── ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ 샘플링 포인트 (상승 엣지) MOSI: ──┬─D7─┬─D6─┬─D5─┬─D4─┬─D3─┬─D2─┬─D1─┬─D0─┬── MISO: ──┬─D7─┬─D6─┬─D5─┬─D4─┬─D3─┬─D2─┬─D1─┬─D0─┬── ``` --- ## TC37x — QSPI 모듈 TC37x의 SPI는 **QSPI(Queued SPI)** 모듈입니다. 일반 SPI와 달리 **하드웨어 큐** 기반으로 연속 전송을 자동 처리합니다. ### QSPI 특징 ``` +─────────────────────────────────────────+ │ QSPI 모듈 │ │ │ │ TX FIFO (큐) │ │ [Job1][Job2][Job3][ ][ ]... │ │ ↓ 자동으로 순서대로 전송 │ │ [SPI 코어] │ │ ↓ │ │ CS 자동 제어 (슬레이브별) │ │ SCLK 생성 │ │ MOSI/MISO 처리 │ +─────────────────────────────────────────+ ``` - 여러 슬레이브 디바이스에 대한 전송을 큐에 쌓고 순서대로 자동 처리 - 각 큐 항목마다 다른 CS, 다른 속도, 다른 모드 설정 가능 - DMA 연동으로 CPU 개입 최소화 ### iLLD — IfxQspi 초기화 예 ```c #include "IfxQspi_SpiMaster.h" IfxQspi_SpiMaster g_qspiMaster; IfxQspi_SpiMaster_Channel g_spiChannel; void initSpi(void) { IfxQspi_SpiMaster_Config masterConfig; IfxQspi_SpiMaster_initModuleConfig(&masterConfig, &MODULE_QSPI0); // 핀 설정 const IfxQspi_SpiMaster_Pins masterPins = { &IfxQspi0_SCLK_P20_11_OUT, IfxPort_OutputMode_pushPull, &IfxQspi0_MTSR_P20_14_OUT, IfxPort_OutputMode_pushPull, // MOSI &IfxQspi0_MRST_P20_12_IN, IfxPort_InputMode_pullDown, // MISO IfxPort_PadDriver_cmosAutomotiveSpeed3 }; masterConfig.pins = &masterPins; // 인터럽트 설정 masterConfig.base.txPriority = ISR_PRIORITY_QSPI0_TX; masterConfig.base.rxPriority = ISR_PRIORITY_QSPI0_RX; masterConfig.base.erPriority = ISR_PRIORITY_QSPI0_ER; masterConfig.base.isrProvider = IfxSrc_Tos_cpu0; IfxQspi_SpiMaster_initModule(&g_qspiMaster, &masterConfig); // 채널(슬레이브) 설정 IfxQspi_SpiMaster_ChannelConfig channelConfig; IfxQspi_SpiMaster_initChannelConfig(&channelConfig, &g_qspiMaster); channelConfig.base.baudrate = 5000000; // 5 MHz channelConfig.base.spiMode = SpiIf_Mode_master; channelConfig.base.csActiveState = SpiIf_ActiveState_low; // CS 핀 (GPIO로 소프트웨어 제어 또는 자동) const IfxQspi_SpiMaster_Output csPin = { &IfxQspi0_SLSO0_P20_13_OUT, IfxPort_OutputMode_pushPull, IfxPort_PadDriver_cmosAutomotiveSpeed1 }; channelConfig.spiMasterChannelMode = IfxQspi_SpiMasterChannelMode_shortContinuous; channelConfig.base.csPin = &csPin.pin; IfxQspi_SpiMaster_initChannel(&g_spiChannel, &channelConfig); } // 데이터 송수신 void spiTransfer(uint8 *txData, uint8 *rxData, uint16 len) { IfxQspi_SpiMaster_exchange(&g_spiChannel, txData, rxData, len); } ``` --- ## CS 제어 주의사항 CS는 전송 전 LOW, 완료 후 HIGH가 원칙입니다. ``` 올바른 CS 제어: CS: ──┐ ┌── └──────────────┘ ↑ ↑ 전송 시작 전송 완료 잘못된 CS 제어: CS: ──┐ ┌──┐ ┌── └───┘ └───┘ ↑ 전송 중간에 CS 토글 → 슬레이브 오동작 ``` --- ## 정리 | 항목 | 설명 | |------|------| | CPOL | 유휴 시 클럭 레벨 (0=LOW, 1=HIGH) | | CPHA | 샘플링 엣지 (0=첫째, 1=둘째) | | Mode 0 | CPOL=0, CPHA=0, 가장 일반적 | | QSPI | TC37x SPI 모듈, 하드웨어 큐 기반 연속 전송 | | IfxQspi_SpiMaster | QSPI 마스터 iLLD 드라이버 |
// COMMENTS
Newest First
ON THIS PAGE