Vector Table에서 CAN1_RX0 핸들러 주소를 찾았다: 0x08003100


수신 핸들러

void CAN1_RX0_IRQHandler(void) {
    uint32_t id, dlc, data[2];
    
    // FIFO에 메시지 있는지 확인
    while ((*(uint32_t *)0x4000640C & 0x03) != 0) {
        // ID 읽기
        id = (*(uint32_t *)0x400065B0 >> 21) & 0x7FF;
        
        // DLC 읽기
        dlc = *(uint32_t *)0x400065B4 & 0x0F;
        
        // 데이터 읽기
        data[0] = *(uint32_t *)0x400065B8;
        data[1] = *(uint32_t *)0x400065BC;
        
        // FIFO 해제
        *(uint32_t *)0x4000640C = 0x20;
        
        // 메시지 처리
        Process_CAN_Message(id, data, dlc);
    }
}

ID 필터링

void Process_CAN_Message(uint32_t id, uint32_t *data, uint8_t dlc) {
    if (id != 0x5FF) return;  // IAP 전용 ID
    
    uint8_t cmd = data[0] & 0xFF;
    
    switch (cmd) {
        case 0x30:  // Connection Request
            Handle_ConnRequest(data);
            break;
        case 0x31:  // Key Calculate
            Handle_KeyCalc(data);
            break;
        case 0x32:  // Size Response
            Handle_SizeRes(data);
            break;
        case 0x33:  // Data Frame
            Handle_DataFrame(data);
            break;
    }
}

헤더 파일에 있던 명령 코드들이 나온다. 0x30, 0x31, 0x32, 0x33.


핵심 발견

  • 수신 ID: 0x5FF
  • 송신 ID: 0x5FE (응답)
  • 명령 코드: 첫 바이트

다음 글에서 IAP 프로토콜 상세 분석.

#14 - IAP 프로토콜 분석