?? speed365.c
字號:
/* 該程序用于測試CH365的讀寫速度
CH365的I/O和MEM讀寫速度是完全相同的,計算機程序是以字節,字(16位),雙字(32位)為單位讀寫,而實際上CH365總是將其轉換為字節讀寫,
所以速度由以下幾個因素決定:
CH365讀寫脈沖的寬度,可以是30nS到240nS,由CH365讀寫速度控制寄存器位3-位0決定,也就是CH365輸出RD和WR的低電平的寬度,
CH365讀寫脈沖之間的間隔,也就是CH365輸出RD和WR的高電平的寬度,分為兩種:
一種是兩次操作之間的間隔,也就是計算機程序發出的兩次讀寫操作之間的間隔,通常為300nS以上,與計算機本身硬件有關(最小能到240nS),
另一種是單次操作之間的間隔,也就是CH365將字或雙字轉換為多個字節之間的間隔,可以是30nS或60nS,由CH365讀寫速度控制寄存器位4決定,
1.最快的速度情形是:(設置CH365讀寫速度控制寄存器為0x00)
讀寫脈沖寬度為30nS,單次操作之間的間隔為30nS,
計算機程序以雙字(32位)為單位進行讀寫操作,實測速度可以達到7.5MB,理論值=4*1000/(300nS+30nS*4+30nS*3),乘4是因為雙字操作,
在這種情形下外部電路的速度必須在25nS之內才能可靠工作,例如:25nS的高速雙口RAM,或者是CPLD/FPGA可編程器件
2.較快的速度情形是:(設置CH365讀寫速度控制寄存器為0x12)
讀寫脈沖寬度為60nS,單次操作之間的間隔為60nS,
計算機程序以雙字(32位)為單位進行讀寫操作,實測速度可以達到5.3MB,理論值=4*1000/(300nS+60nS*4+60nS*3),乘4是因為雙字操作,
在這種情形下外部電路的速度必須在55nS之內才能可靠工作,例如:35nS-55nS的雙口RAM,或者是CPLD/FPGA可編程器件,大多數TTL接口電路等
3.最慢的速度情形是:(設置CH365讀寫速度控制寄存器為0x07)
讀寫脈沖寬度為240nS,由于總是以字節為單位讀寫,所以單次操作之間的間隔沒有用到,可以設為30nS,
計算機程序以字節(8位)為單位進行讀寫操作,實測速度可以達到1.7MB,理論值=1*1000/(300nS+240nS*1),字節操作,
在這種情形下外部電路的速度可以在230nS之內,例如:各種RAM,各種ROM,各種FLASH,各種TTL接口電路,CH421,CMOS工藝8255A/8155A/8253A等
*/
/* VC5.0編譯 */
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
//#include <setupapi.h>
#include <winioctl.h>
#include "CH365DLL.H"
mPCH365_IO_REG mIoBase; // I/O基址
mPCH365_MEM_REG mMemBase; //存儲器基地址
int Device_Number=0; //選擇設備號
void TestSpeed( ULONG mode, PUCHAR str )
{
ULONG i, time;
double speed;
UCHAR Buffer[0x8000];
printf( "*** call CH365mAccessBlock, %s\n", str );
time=GetTickCount();
for ( i = 0; i < 512 ; i ++ ) {
if ( CH365mAccessBlock( Device_Number,mode,0,Buffer,0x8000 ) == FALSE ) { printf( " ERROR " ); break; }
}
time = (ULONG)(GetTickCount()) - time;
speed=1000;
if ( time !=0 ) speed=speed*0x8000*512/time;
else speed=9999999;
printf( "*** Speed = %7.1f Bytes/Sec, total=%ld bytes, time=%ld mS\n", speed, 0x8000*512, time);
}
void main()
{
printf("*****Copyright (C) W.ch 2004.08 ");
// 需要使用DLL則需要先加載
printf( "*** Load DLL: CH365DLL.DLL \n" );
if ( LoadLibrary( "CH365DLL.DLL" ) == NULL ) return; // 加載DLL失敗,可能未安裝到系統中
//選擇打開365設備
//OPEN DEVICE 使能存儲器和禁止中斷
printf( "*** CH365mOpenDevice: I/O port, Memory\n" );
if ( CH365mOpenDevice(Device_Number, TRUE, FALSE ) == INVALID_HANDLE_VALUE ) return;
// 通過DLL來調用系統自動分配的I/O基地址
printf( "*** CH365mGetIoBaseAddr " );
if ( CH365mGetIoBaseAddr( Device_Number,&mIoBase ) == FALSE ) printf( " ERROR " );
printf( "= %08X \n", mIoBase );
// 通過DLL來調用系統自動分配的存儲器基地址
printf( "***CH365mGetMemBaseAddr ");
if (CH365mGetMemBaseAddr(Device_Number,&mMemBase) ==FALSE) printf("ERROR");
printf("=%08X\n",mMemBase);
// 顯示LED
printf( "*** CH365mSetA15_A8: data=0x00 \n" );
if ( CH365mSetA15_A8(Device_Number, 0 ) == FALSE ) printf( " ERROR " );
printf( "*** Default CH365 speed is 240nS/30nS, access pulse width is 240nS, \n" );
printf( "*** To modify call: CH365mWriteIoByte(index, &mIoBase->mCh365Speed, value) \n" );
printf( "*** Step1: Set 30nS/30nS, value = 0x00, for fast CPLD/FPGA or DualPortSRAM \n" );
if ( CH365mWriteIoByte(Device_Number, &mIoBase -> mCh365Speed, 0x00 ) == FALSE ) printf( " ERROR " );
TestSpeed( mFuncReadIoDword, "mFuncReadIoDword: Read I/O, DWORD" );
TestSpeed( mFuncReadMemDword, "mFuncReadMemDword: Read Mem, DWORD" );
TestSpeed( mFuncReadIoByte, "mFuncReadIoByte: Read I/O, BYTE" );
TestSpeed( mFuncReadMemByte, "mFuncReadMemByte: Read Mem, BYTE" );
printf( "Press any key to continue\n" );
if ( getch() != 0x1B ) {
printf( "*** Step2: Set 60nS/60nS, value = 0x12, for CPLD/FPGA or DualPortSRAM\n" );
if ( CH365mWriteIoByte(Device_Number, &mIoBase -> mCh365Speed, 0x12 ) == FALSE ) printf( " ERROR " );
TestSpeed( mFuncReadIoDword, "mFuncReadIoDword" );
TestSpeed( mFuncReadMemDword, "mFuncReadMemDword" );
TestSpeed( mFuncReadIoByte, "mFuncReadIoByte" );
TestSpeed( mFuncReadMemByte, "mFuncReadMemByte" );
TestSpeed( mFuncReadMemDword, "mFuncWriteMemDword: Write Mem, DWORD" );
printf( "*** Step3: Set 210nS/60nS, value = 0x17, only for access by Byte unit \n" );
if ( CH365mWriteIoByte(Device_Number, &mIoBase -> mCh365Speed, 0x17 ) == FALSE ) printf( " ERROR " );
TestSpeed( mFuncReadIoByte, "mFuncReadIoByte" );
TestSpeed( mFuncReadMemByte, "mFuncReadMemByte" );
printf( "*** Step4: Set default: 240nS/30nS, value = 0x07, only for access by Byte unit \n" );
printf( "*** CH365mWriteIoByte( index, &mIoBase->mCh365Speed, 0x07 ) \n" );
if ( CH365mWriteIoByte(Device_Number, &mIoBase -> mCh365Speed, 0x07 ) == FALSE ) printf( " ERROR " );
}
// 關閉LED
printf( "*** CH365mSetA15_A8: data=0x80 \n" );
if ( CH365mSetA15_A8(Device_Number, 0x80 ) == FALSE ) printf( " ERROR " );
printf( "*** CH365mCloseDevice \n" );
CH365mCloseDevice(Device_Number);
getch( );
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -