[原創]dm642_HPI調通並boot成功

一直在折騰前段時間畫好的dm642+lpc4357板子,說明下這個板子的結構:python

  • 主芯片爲DM642,這個片子很老了,但由於對這個片子熟悉,別折騰
  • 沒有給DM642加FLASH,配了一片LPC4357,DM642的代碼須要它HPI來加載,至於爲什麼選這個芯片,
    主要是它帶有USB2.0的PHY,關鍵是以前使用的時候都還算順利(我都使用eclipse+arm gcc)
  • 兩路視頻輸入(不能同時輸入,支持切換)
  • 一路LCD顯示(AT070TN92的屏)
  • DM642上的一路以太網(10M/100M)
  • LPC4357上的USB2.0,RS485以及RS232(這個主要調試時用下)

真是好事多磨,以前由於焊接問題搞了一陣子,後來HPI也遇到問題,終於弄通了,記錄下!eclipse

經過LPC4357的EMC鏈接DM642的HPI16,測試硬件天然力求簡單,超簡單的程序(原本HPI的結構也很簡單):異步

void HPI_test(void)
{
    volatile uint32_t pdat;
    HPI_Init(LPC_EMC_BASE);
    volatile uint32_t *pAddr=(volatile uint32_t*)HPIC_ADDR_RBASE;
    uint32_t x;
    while(1)
    {
        pAddr=(volatile uint32_t*)HPIC_ADDR_RBASE;
        pdat = *pAddr;

        pAddr=(volatile uint32_t*)HPIA_ADDR_RBASE;
        pdat = *pAddr;

        pAddr=(volatile uint32_t*)HPIDI_ADDR_RBASE;
        pdat = *pAddr;

        pAddr=(volatile uint32_t*)HPIDF_ADDR_RBASE;
        pdat = *pAddr;

    HPI_Write(0x22,0x12345678);
    x=HPI_Read(0x22);
    }
}

經過單步調試來查看變量值來驗證正確性。一開始不如所意,偶然發現讀HPIC的值是正確的,但其它的就不行了,
調整EMC的時序,折騰幾晚(晚上弄的,不是公事)都不行,簡單的東西不通真是想破腦殼,分析理順了一下:測試

  1. 讀HPIC的時候值正確,說明OE和CS及部分數據線(HPIC不是每一個位均可以在DSP端寫,不能都測試)沒有問題;
  2. 讀其它寄存器的時候雖然不正確,但不是HPIC的值,說明地址線至少有變化,時序值得懷疑;
  3. 可是寫HPIC不成功,頗有可能HRW或者WE的問題,固然還有多是時序問題;
  4. 仔細看了HPI的線,彷佛都沒有上下拉,說明HRW懸空的可能性不大;

好吧,三個方面:時序問題、焊接問題(以前出過問題總會不那麼信任),WE(嚴重懷疑)。異步讀寫是最簡單的操做,
我把各個寄存器的時間都設置成最長,那麼時序問題的可能性很小了,WE能有什麼問題呢,想不明白。
只好繼續看參考手冊,又去看數據手冊,想找找波形圖,找到了個很簡陋的波形圖,發現PB=0的時候WE沒有動做,而PB=1
的時候WE動做了,那麼問題來了,仔細地把STATICCONFIG中的PB一個單詞不放過地看,終於找到問題了:ui

** Remark: When PB is set to 0, the WE signal is undefined or 0.
You must set PB to 1, to use the WE signal. **調試

坑爹啊,原本看這個位的名稱就是Byte lane state,跟WE又扯上關係了!設置好後,全部問題解決。後來HPI BOOT的問題就一次測試搞定了:code

寫了個小python程序將DM642的代碼(中斷向量須要在0地址)生成的.out文件中須要加載的段轉化成c程序,並組成一個鏈表,而後經過HPI
寫到DSP中並給一個DSPINT(須要設置DM642的啓動方式爲HPI),成功!視頻

相關文章
相關標籤/搜索