[求助]關(guān)于CH365的中斷請求信號INT_REQ

我正在用CH365評估板實(shí)現(xiàn)讀寫IO端口的功能,用的是CH365芯片中文手冊中提供的“I/O端口應(yīng)用(上圖右邊的電路)”方案。其中74LS245的輸入端接8個開關(guān),74LS374的輸出端接8個LED燈,現(xiàn)在的想法是只要按下8個開關(guān)中的任意一個,就馬上產(chǎn)生中斷,而后中斷服務(wù)程序讀取開關(guān)數(shù)據(jù),輸出到LED燈上?,F(xiàn)在的問題是低電平的中斷請求信號INT_REQ如何在按下開關(guān)時產(chǎn)生??請賜教

電路圖已上傳[Emot]8[/Emot]

圖沒傳上


UploadImages/20106142215290.doc


UploadImages/20106131812414.doc


斑竹幫我分析下好嗎?我很急


看到了 這個圖和中斷沒關(guān)系 這個圖的原理是IOP_RD 和IOP_WR 控制74LS139 的譯碼使能,74LS139將地址譯碼輸出2 路讀控制和2 路寫控制,經(jīng)過74LS245 輸入緩沖和74LS374 鎖存輸出,獲得2組每組8位緩沖輸入和2 組每組8 位鎖存輸出。也就是按下開關(guān)等 是不同的輸入輸出的讀寫操作。


我的驅(qū)動程序中讀寫IO端口操作時機(jī)是在接收到CH365的中斷之后立即進(jìn)行(也就是以中斷方式進(jìn)行IO與主機(jī)的數(shù)據(jù)交換),是一個循環(huán)不斷的過程,只要按下開關(guān),就產(chǎn)生一個中斷,而后中斷程序就讀開關(guān)狀態(tài),再輸出到LED上,我的問題是給CH365的這個中斷信號怎么產(chǎn)生?不能通過開關(guān)的按下產(chǎn)生中斷嗎??


中斷有軟件和硬件中斷,過程和實(shí)現(xiàn)可以參考《CH365 中斷功能使用說明》CH365INT.PDF 文檔, 在CH365EVT/PUB 中 可從在線下載中 下載CH365EVT.ZIP


《CH365 中斷功能使用說明》我也看了,我要產(chǎn)生的是硬件中斷,就是給CH365的這個低電平的INT_REQ信號我不知道該如何產(chǎn)生


首先,D3下拉復(fù)用引腳59的功能為INT_REQ, 然后根據(jù)I/O 空間偏移0F8H,位2設(shè)定INTA 中斷激活狀態(tài),為0無中斷,為1有中斷。


硬件中斷信號現(xiàn)已解決,不知斑竹是否了解winDriver,我用我winDriver寫了評估板的驅(qū)動程序,但是中斷就是不好使啊,程序如下,編譯沒有錯誤,不知道有什么其他問題? #include #include #include #include #include "windrvr.h"

/**-----------全局變量---------------*/ HANDLE hWD;//windriver內(nèi)核句柄 KPTR IO_Base_Addr;//IO空間基地址 int IntCount = 0;//中斷次數(shù) WD_INTERRUPT Intrp;//記錄中斷信息

/**------------------中斷處理程序---------------------*/ void ProcessInterrupt(void) { WD_TRANSFER Trans;//傳遞讀寫命令的結(jié)構(gòu)體 IntCount++; printf("第%d次中斷到來,進(jìn)入中斷處理程序\n",IntCount); /**清除CH365芯片控制寄存器的中斷激活狀態(tài)位*/ Trans.cmdTrans = RP_BYTE; Trans.dwPort = (IO_Base_Addr + 0xf8); WD_Transfer(hWD, &Trans); Trans.Data.Byte &= 0xfb; Trans.cmdTrans = WP_BYTE; WD_Transfer(hWD, &Trans);

/**從開關(guān)讀入一個字節(jié),輸出到LED燈*/ Trans.cmdTrans = RP_BYTE; //從開關(guān)讀入一個字節(jié) Trans.dwPort = IO_Base_Addr; WD_Transfer(hWD, &Trans); Trans.cmdTrans = WP_BYTE; //輸出到LED燈 WD_Transfer(hWD, &Trans); }

DWORD WINAPI wait_interrupt (PVOID pData) { printf ("Waiting for interrupt\n"); for (;;) { WD_IntWait (hWD, &Intrp); if (Intrp.fStopped) break; // WD_IntDisable called by parent ProcessInterrupt();//自定義的中斷處理程序 } return 0; } int main() { HANDLE thread_handle; DWORD thread_id; DWORD i=0,IntItem,dwStatus; WD_PCI_SCAN_CARDS pciScan;//記錄pci設(shè)備掃描信息 WD_PCI_SLOT pciSlot;//記錄pci設(shè)備插槽信息 WD_PCI_CARD_INFO pciCardInfo;//記錄pci板卡信息 WD_PCI_CONFIG_DUMP pciConfig; WD_CARD Card;//記錄pci板卡資源信息 WD_CARD_REGISTER cardReg;//登記板卡的結(jié)構(gòu)體 WD_TRANSFER Trans[2];//傳遞讀寫命令的結(jié)構(gòu)體

/**-------------初始化-----------------*/ BZERO(pciScan); BZERO(pciCardInfo); BZERO(pciConfig); BZERO(Card); BZERO(cardReg); BZERO(Intrp);

/**-------------WD_Open()--------------*/ hWD=WD_Open(); //打開windriver設(shè)備,返回的句柄會被所有的windriver APIs所使用 if (hWD == INVALID_HANDLE_VALUE) { printf("Cannot open WinDriver device\n"); }

/**-----------WD_PciScanCards()-------*/ pciScan.searchId.dwVendorId = 0x4348;//南京沁恒公司提供的Vendor ID pciScan.searchId.dwDeviceId = 0x5049;//南京沁恒公司提供的Device ID WD_PciScanCards(hWD,&pciScan);//查找要訪問的PCI插槽上的設(shè)備 if (pciScan.dwCards>0) //找到至少一個設(shè)備 { pciSlot = pciScan.cardSlot[0]; //使用第一個設(shè)備 } else { printf("No matching PCI devices found\n"); } /**------------WD_PciGetCardInfo()----*/ pciCardInfo.pciSlot = pciSlot; WD_PciGetCardInfo(hWD, &pciCardInfo);//枚舉該設(shè)備的資源 if (pciCardInfo.Card.dwItems!=0) //找到該卡的至少一項(xiàng)資源 { Card = pciCardInfo.Card; } else { printf("Failed fetching PCI card information\n"); }

/**---------------WD_PciConfigDump()---------*/ pciConfig.pciSlot = pciSlot; pciConfig.pBuffer = (&IO_Base_Addr); pciConfig.dwOffset = 0x10;//從配置空間讀取IO基地址 pciConfig.dwBytes = sizeof(IO_Base_Addr); pciConfig.fIsRead = TRUE; dwStatus = WD_PciConfigDump(hWD, &pciConfig); if (dwStatus) { printf("WD_PciConfigDump failed\n"); } IO_Base_Addr &= 0xfffffff0;//低四位是無用信息,需要屏蔽

/**-WD_CardRegister() & WD_IntEnable()---------------*/ cardReg.Card = Card; cardReg.fCheckLockOnly = FALSE; for (i=0;i < cardReg.Card.dwItems;i++) { cardReg.Card.Item[i].fNotSharable = TRUE; if (cardReg.Card.Item[i].item == ITEM_INTERRUPT) { IntItem = i; cardReg.Card.Item[i].I.Int.dwOptions =INTERRUPT_LEVEL_SENSITIVE; } } WD_CardRegister(hWD,&cardReg);//向winDriver核心登記硬件板卡,鎖定板卡資源 if (cardReg.hCard == 0) { printf("Failed locking device\n"); return FALSE; } else { Intrp.hInterrupt = cardReg.Card.Item[IntItem].I.Int.hInterrupt;//獲取板卡中斷句柄 Intrp.Cmd = Trans; Intrp.dwCmds = 2; Trans[0].cmdTrans = RP_BYTE; Trans[0].dwPort = (IO_Base_Addr + 0xf8); Trans[1].cmdTrans = WP_BYTE; Trans[1].dwPort = Trans[0].dwPort; Trans[1].Data.Byte = Trans[0].Data.Byte; Intrp.dwOptions = INTERRUPT_LEVEL_SENSITIVE|INTERRUPT_CMD_COPY; WD_IntEnable(hWD, &Intrp); if (!Intrp.fEnableOk) { printf("Failed enabling interrupt\n");//無法開啟中斷 } printf ("starting interrupt thread\n"); thread_handle = CreateThread (0, 0x1000, wait_interrupt, NULL, 0, &thread_id); WD_IntDisable (hWD, &Intrp); WaitForSingleObject(thread_handle, INFINITE); }

/**-------------WD_CardUnregister()---------------*/ WD_CardUnregister(hWD,&cardReg);//注銷板卡

/**------------WD_close()-----------*/ WD_Close(hWD);//關(guān)閉winDriver設(shè)備

return 0; }


只有登錄才能回復(fù),可以選擇微信賬號登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频