This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

DLP2021-Q1: Interrupt & HOST_IRQ

Part Number: DLP2021-Q1

Dear

我想讓 HOST_IRQ 腳位在每次影片撥放結束的時候有所動作,

依照 FPGA User's Guide  4.4 Host IRQ Interrupt Signal 所述,以及 4.1.6 Example 5: Display 3+ Videos/Images Seamlessly 的步驟嘗試:

但都沒有效果,只要Interrupt Enable 有任何一個被設置,HOST_IRQ 就都維持是High,無埨我如何設置 FPGA Interrupt Set or Clear......

請問是不是只要將FPGA Interrupt Clear設置為1或0,應該就可以清除FPGA Interrupt Set的狀態,HOST_IRQ也就會再下一次中斷響應時改變狀態呢?還是我理解錯誤呢?

還是此動作無法藉由DLP Control Program 15.1.0.26來模擬達成,一定要使用MCU呢?

請問是否有更詳細有關中斷操作與HOST_IRQ的使用說明呢?

謝謝。

  • 需要MCU读FPGA状态配置,因为速度很快.

  • Hi Jeremy

    感謝回覆,

    請問您指的"速度很快"是指HOST_IRQ反應很快,還是FPGA Interrupt Set的值變化很快呢?

    因為我使用示波器紀錄HOST_IRQ變化,但接無法看到HOST_IRQ有任何變化,在我設定FPGA Interrupt Cler為0的值後。

    能否更詳細說明下這部份的操作呢?

    需要MCU怎樣的讀取(0x04 or 0x00)?速度很快是多快?

    謝謝。

  • 参考中断和处理:

    while(1)
    {
    if(isHostMuted() == false)
    {
    enableSPIPins();
    if(isfpgainterrupt)
    {
    isfpgainterrupt = false;
    uint32_t interrupts;
    bool success = false;
    //interrupt register read must have valid checksum
    while(!success)
    {
    success = spiread(FPGA_ADDR_INTSET, &interrupts);
    }
    spiwrite(FPGA_ADDR_INTCLR, interrupts); //Clear interrupts that are set so host irq goes low
    if(interrupts & INT_INIT_DONE)
    {
    __delay_cycles(800000); //50ms delay
    fpgaInitTemp();
    initTimer();
    //if(!eeprom_data_valid)
    //{
    redpwm = RED_DEFAULT_PWM & 0x3FF;
    greenpwm = GREEN_DEFAULT_PWM & 0x3FF;
    bluepwm = BLUE_DEFAULT_PWM & 0x3FF;
    //}
    enableFPGAInterupts(INT_BROWNOUT | INT_LOOP_COMP);
    fpgaStopVideo(); //Must stop video prior to trying to access flash via registers
    getVideoCount(&videoCount);
    getAllVideoInfo(videos, videoCount);
    fpgaSetFramerate(VIDEO_FRAMERATE);
    // If there is a video in flash play the first video found, if not then load the first image found
    for(uint8_t i = 0; i < videoCount; i++){
    if(videos[i].frameCount > 1){
    fpgaSetVideo1(videos[i].address, VIDEO1_1_LOOPS, videos[i].frameCount);
    fpgaSetVideo2(videos[i].address, VIDEO1_2_LOOPS, videos[i].frameCount);
    break;
    }
    else{
    fpgaSetVideo1(videos[0].address, VIDEO1_1_LOOPS, videos[0].frameCount);
    fpgaSetVideo2(videos[0].address, VIDEO1_2_LOOPS, videos[0].frameCount);
    }
    }
    fpgaPlayVideo(VIDEO_AUTOSTOP, 0, VIDEO_LOOPCONFIGS, VIDEO_TOGGLECONFIGS);


    }
    if(interrupts & INT_BROWNOUT)
    {
    //delay 1ms to give time to complete DMD park
    __delay_cycles(PARK_DELAY1);
    disableFPGAPower();
    }
    if(interrupts & INT_VID_COMP)
    {
    //Do something when each video is complete
    }
    if(interrupts & INT_LOOP_COMP)
    {
    //Do something when each video loop is complete
    }
    }
    if(istimerinterrupt)
    {
    istimerinterrupt = false;
    int16_t dmdtemp;
    fpgaReadDMDTemp(&dmdtemp);
    checkParkDMD(dmdtemp);
    }
    if(isuartinterrupt)
    {
    isuartinterrupt = false;
    uartProcessByte();
    }

  • Hi Jeremy

    以下動作與您確認,請問我這樣認知是否正確呢?謝謝。

    1. MCU 的 MOSI 送出讀取 FPGA Interrupt SET 的指令:{0x01 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x00}。

    2. MCU 的 MISO 接收 FPGA 回送的 FPGA Interrupt SET資料:{0x00 0x01 0x04 0x00 0x00 0x00 0x00 0x00 0x05}。

    3. MCU 的 MOSI 送出清除 FPGA Interrupt CLR 的指令:{0x00 0x00 0x00 0x01 0x00 0x00 0x00 0x01}。

    4. 此時 HOST_IRQ 會被拉 Low,直到 Interrupt Enable (0x08) 所設定的條件達成後,HOST_IRQ會恢復 High。

    假設 FPGA Interrupt Enable (0x08) 的 VID LOP COMP IRQ 為 High ,然後反覆上述 1~3 動作,

    那在每部影片撥放完畢的時候 HOST_IRQ 就會被拉回 High。

    請問這樣理解是否正確呢?

    謝謝。

  • 对的,您也可以联系Eliza直接讨论