<em id="vxn3k"></em>
  • <div id="vxn3k"></div>
    <em id="vxn3k"></em>
    1. <div id="vxn3k"><tr id="vxn3k"></tr></div>

          <div id="vxn3k"></div>
          
          
          <em id="vxn3k"></em>
          1. <optgroup id="vxn3k"><small id="vxn3k"><track id="vxn3k"></track></small></optgroup>
          2. <button id="vxn3k"><menu id="vxn3k"></menu></button>
          3. <delect id="vxn3k"></delect>

            轉換精簡ISA總線為16bit總線接口

             2020/11/6    

              為了減少精簡ISA總線的信號管腳數量,英創工控主板(ESM335x、ESM7000、ESM6802等)的精簡ISA總線采取了地址數據時分復用的方式,總線的寬度為8-bit,總線周期在200ns內,這樣支持10MB/s的數據率。在客戶的某些應用場合,總線接口是獨立的地址總線和數據總線,總線寬度則為16-bit。為了支持客戶已有設計保持不變,需要把精簡ISA總線轉換為16-bit的總線格式,本文將介紹相應的轉換電路及對應的操作代碼。


              轉換的基本思路是使用兩個寄存器做地址寄存器,提供16-bit的地址總線,另外再使用兩個寄存器作為數據寄存器。軟件對轉換過程的數據緩存是完全透明的。


            轉換電路


              在下面的電路中,精簡ISA總線的地址A0高低分別表示16-bit地址或數據的高位字節和低位字節,譯碼信號為BHE;而精簡ISA總線的地址A1的高低分別表示16-bit數據讀寫周期和16-bit地址寫周期,譯碼信號為D_A_FLG。


              采用74‘s系列經典器件來實現總線的轉換,可幫組理解轉換的技術要點。在實際應用中,把這部分電路用FPGA或CPLD來實現會更加簡便。


              電路圖中信號名稱帶“#”或“_B”后綴的,表示信號是低電平有效。


            轉換精簡ISA總線為16bit總線接口.png


              放大各個部分電路。


              譯碼部分:


            轉換精簡ISA總線為16bit總線接口.png


              延時展寬部分。在FPGA或CPLD中,也可采用其它電路獲得更好的效果:


            轉換精簡ISA總線為16bit總線接口.png


              總線多路切換:


            轉換精簡ISA總線為16bit總線接口.png


              上面的電路導出的16bit接口信號包括:

              ● BUS16_A[0..15]:16-bit地址總線;總線周期時有效,非總線周期保持原狀態。

              ● BUS16_D[0..15]:雙向16-bit數據總線;總線周期時有效,非總線周期為高阻態。

              ● BUS16_RD_B:讀脈沖,低電平有效。

              ● BUS16_WE_B:寫脈沖,低電平有效,上升沿鎖存總線數據。


            代碼實例


              在WEC7平臺ESM335x上的ISA總線操作函數如下:


            // open "ISA1:"
            HANDLE  hISA = CreateFile(_T("ISA1:"),                         // name of device
                                        GENERIC_READ|GENERIC_WRITE,         // desired access
                                        FILE_SHARE_READ|FILE_SHARE_WRITE,      // sharing mode
                                        NULL,                                                      // security attributes
                                        OPEN_EXISTING,                                    // creation disposition
                                        FILE_FLAG_RANDOM_ACCESS,                    // flags/attributes
                                        NULL);


            // open "ISA1:"
            HANDLE  hISA = CreateFile(_T("ISA1:"),                         // name of device
                                        GENERIC_READ|GENERIC_WRITE,         // desired access
                                        FILE_SHARE_READ|FILE_SHARE_WRITE,      // sharing mode
                                        NULL,                                                      // security attributes
                                        OPEN_EXISTING,                                    // creation disposition
                                        FILE_FLAG_RANDOM_ACCESS,                    // flags/attributes
                                        NULL);


              打開設備文件獲得HANDLE后,就可以對總線進行讀寫操作了。


            // convert ISA to 16-bit width for both address and data
            #define BUS16_ADDR_REG_INDEX             ((DWORD)0) // ISA_A1 = 0: address registers
            #define BUS16_DATA_REG_INDEX              ((DWORD)2) // ISA_A1 = 1: data register
             
            BOOL Isa_Read16(HANDLE hISA, WORD wPortOffset, WORD* pBuf)
            {
                   DWORD dwValue;
                   DWORD dwNbBytesReturn = 0;
             
                   // write 16-bit address
                   dwValue = (BUS16_ADDR_REG_INDEX << 16) | wPortOffset;
                   WriteFile(hISA, &dwValue, sizeof(DWORD), &dwNbBytesReturn, NULL);
             
                   // read 16-bit data
                   *pBuf = (WORD)(BUS16_DATA_REG_INDEX & 0xFE);
                   ReadFile(hISA, pBuf, sizeof(WORD), &dwNbBytesReturn, NULL);
             
                   return TRUE;
            }
             
            BOOL Isa_Write16(HANDLE hISA, WORD wPortOffset, WORD wValue)
            {
                   DWORD dwValue;
                   DWORD dwNbBytesReturn = 0;
             
                   // write 16-bit address
                   dwValue = (BUS16_ADDR_REG_INDEX << 16) | wPortOffset;
                   WriteFile(hISA, &dwValue, sizeof(DWORD), &dwNbBytesReturn, NULL);
             
                   // write 16-bit data
                   dwValue = (BUS16_DATA_REG_INDEX << 16) | wValue;
                   WriteFile(hISA, &dwValue, sizeof(DWORD), &dwNbBytesReturn, NULL);
             
                   return TRUE;
            }


              以上代碼也可在ESM7000 WEC7平臺上使用。在Linux平臺,客戶可編寫類似的代碼,也可請英創的技術編寫相應的代碼。

            日本亚洲欧美国产日韩ay-欧洲亚洲色视频综合在线-午夜少妇性开放影院-蜜芽国内精品视频在线观看