?? test.c
字號:
/*
; CH375/CH372 Bulk Data Test
; U2(AT89C51) Program
; 本程序測試數(shù)據(jù)傳輸?shù)恼_性,可以用于長時間連續(xù)測試,對應(yīng)的計算機(jī)端的測試程序為TEST.EXE
; 方法: 下傳隨機(jī)長度的隨機(jī)數(shù)據(jù)包,被單片機(jī)接收并將數(shù)據(jù)按位取反后返回,最終由計算機(jī)程序接收后比較數(shù)據(jù)是否正確
;
; Website: http://winchiphead.com
; Email: tech@winchiphead.com
; Author: W.ch 2003.09
*/
/* MCS-51單片機(jī)C語言的示例程序,用于其它單片機(jī)時一般只要修改前面幾個接口子程序及硬件定義 */
#pragma NOAREGS
#include <reg52.h>
#include <string.h>
#include "CH375INC.H" /* 頭文件,在網(wǎng)上下載的CH372或者CH375評估板資料中有 */
unsigned char volatile xdata CH375_CMD_PORT _at_ 0xBDF1; /* CH375命令端口的I/O地址 */
unsigned char volatile xdata CH375_DAT_PORT _at_ 0xBCF0; /* CH375數(shù)據(jù)端口的I/O地址 */
/* 延時2微秒,不精確 */
void delay2us( )
{
unsigned char i;
for ( i = 2; i != 0; i -- ); /* 根據(jù)單片機(jī)的時鐘選擇初值 */
}
/* 延時1微秒,不精確,因為MCS51單片機(jī)較慢所以實際上無需延時 */
//void delay1us( )
//{
// unsigned char i;
// for ( i = 1; i != 0; i -- );
//}
/* 基本操作 */
void CH375_WR_CMD_PORT( unsigned char cmd ) { /* 向CH375的命令端口寫入命令,周期不小于4uS,如果單片機(jī)較快則延時 */
delay2us();
CH375_CMD_PORT=cmd;
/* ******************** 注釋中是用普通I/O引腳模擬8位并口的時序,CH375_CS引腳是可選的,可以一直接GND強制片選
CH375_D0_D7 = cmd;
CH375_A0 = 1; 選擇CH375的命令口
// CH375_D0_D7_DIR = output; 對于標(biāo)準(zhǔn)雙向I/O,請在此設(shè)置為輸出方向
CH375_RD = 1; 如果I/O默認(rèn)電平是高電平,那么這是可選操作
CH375_CS = 0;
CH375_WR = 0;
// CH375_CS = 0; 對于高速單片機(jī),該指令用于延時,以便向CH375_WR產(chǎn)生寬度至少為80nS的低電平脈沖
CH375_WR = 1;
CH375_CS = 1;
CH375_A0 = 0;
// CH375_D0_D7_DIR = input; 對于標(biāo)準(zhǔn)雙向I/O,請在此設(shè)置為輸入方向
CH375_D0_D7 = 0xFF; 對于準(zhǔn)雙向I/O,請在此設(shè)置輸出全高電平
******************** */
delay2us();
}
void CH375_WR_DAT_PORT( unsigned char dat ) { /* 向CH375的數(shù)據(jù)端口寫入數(shù)據(jù),周期不小于1.5uS,如果單片機(jī)較快則延時 */
CH375_DAT_PORT=dat;
/* ******************** 注釋中是用普通I/O引腳模擬8位并口的時序
CH375_D0_D7 = dat;
// CH375_D0_D7_DIR = output; 對于標(biāo)準(zhǔn)雙向I/O,請在此設(shè)置為輸出方向
CH375_CS = 0;
CH375_WR = 0;
// CH375_CS = 0; 對于高速單片機(jī),該指令用于延時,以便向CH375_WR產(chǎn)生寬度至少為80nS的低電平脈沖
CH375_WR = 1;
CH375_CS = 1;
// CH375_D0_D7_DIR = input; 對于標(biāo)準(zhǔn)雙向I/O,請在此設(shè)置為輸入方向
CH375_D0_D7 = 0xFF; 對于準(zhǔn)雙向I/O,請在此設(shè)置輸出全高電平
******************** */
// delay1us(); /* 因為MCS51單片機(jī)較慢所以實際上無需延時 */
}
unsigned char CH375_RD_DAT_PORT( void ) { /* 從CH375的數(shù)據(jù)端口讀出數(shù)據(jù),周期不小于1.5uS,如果單片機(jī)較快則延時 */
// delay1us(); /* 因為MCS51單片機(jī)較慢所以實際上無需延時 */
/* ******************** 注釋中是用普通I/O引腳模擬8位并口的時序
// CH375_D0_D7_DIR = input; 對于標(biāo)準(zhǔn)雙向I/O,請在此設(shè)置為輸入方向
CH375_D0_D7 = 0xFF; 對于準(zhǔn)雙向I/O,請在此設(shè)置輸出全高電平,便于輸入
CH375_CS = 0;
CH375_RD = 0;
// CH375_CS = 0; 對于高速單片機(jī),該指令用于延時,以便向CH375_RD產(chǎn)生寬度至少為80nS的低電平脈沖
unsigned char dat = CH375_D0_D7;
CH375_RD = 1;
CH375_CS = 1;
CH375_D0_D7 = 0xFF; 對于準(zhǔn)雙向I/O,請在此設(shè)置輸出全高電平
return( dat );
******************** */
return( CH375_DAT_PORT );
}
/* 延時50毫秒,不精確 */
void Delay50ms( )
{
unsigned char i, j;
for ( i=200; i!=0; i-- ) for ( j=250; j!=0; j-- );
}
/* CH375初始化子程序 */
void CH375_Init( )
{
unsigned char i;
/* 測試CH375是否正常工作,可選操作,通常不需要 */
CH375_WR_CMD_PORT( CMD_CHECK_EXIST ); /* 測試CH375是否正常工作 */
CH375_WR_DAT_PORT( 0x55 ); /* 寫入測試數(shù)據(jù) */
i = ~ 0x55; /* 返回數(shù)據(jù)應(yīng)該是測試數(shù)據(jù)取反 */
if ( CH375_RD_DAT_PORT( ) != i ) { /* CH375不正常 */
for ( i=80; i!=0; i-- ) {
CH375_WR_CMD_PORT( CMD_RESET_ALL ); /* 多次重復(fù)發(fā)命令,執(zhí)行硬件復(fù)位 */
CH375_RD_DAT_PORT( );
}
CH375_WR_CMD_PORT( 0 );
Delay50ms( ); /* 延時50ms */
}
/* 設(shè)置USB工作模式, 必要操作 */
CH375_WR_CMD_PORT( CMD_SET_USB_MODE );
CH375_WR_DAT_PORT( 2 ); /* 設(shè)置為使用內(nèi)置固件的USB設(shè)備方式 */
for ( i=100; i!=0; i-- ) { /* 等待操作成功,通常需要等待10uS-20uS */
if ( CH375_RD_DAT_PORT( ) == CMD_RET_SUCCESS ) break;
}
/* if ( i==0 ) { CH372/CH375存在硬件錯誤 }; */
/* 下述啟用中斷,假定CH375連接在INT0 */
IT0 = 0; /* 置外部信號為低電平觸發(fā) */
IE0 = 0; /* 清中斷標(biāo)志 */
EX0 = 1; /* 允許CH375中斷 */
}
/* CH375中斷服務(wù)程序,使用寄存器組1 */
void mCh375Interrupt( ) interrupt 0 using 1
{
unsigned char InterruptStatus;
unsigned char i, length;
unsigned char data buffer[ 64 ];
CH375_WR_CMD_PORT( CMD_GET_STATUS ); /* 獲取中斷狀態(tài)并取消中斷請求 */
InterruptStatus = CH375_RD_DAT_PORT( ); /* 獲取中斷狀態(tài) */
switch ( InterruptStatus ) { /* 分析中斷狀態(tài)處理 */
case USB_INT_EP2_OUT: { /* 批量端點下傳成功 */
CH375_WR_CMD_PORT( CMD_RD_USB_DATA ); /* 從當(dāng)前USB中斷的端點緩沖區(qū)讀取數(shù)據(jù)塊,并釋放緩沖區(qū) */
length = CH375_RD_DAT_PORT( ); /* 首先讀取后續(xù)數(shù)據(jù)長度 */
for ( i = 0; i < length; i ++ ) buffer[ i ] = CH375_RD_DAT_PORT( ); /* 接收數(shù)據(jù)包 */
/* 測試數(shù)據(jù)正確性,將接收到的命令包數(shù)據(jù)取反后返回給PC機(jī) */
CH375_WR_CMD_PORT( CMD_WR_USB_DATA7 ); /* 向USB端點2的發(fā)送緩沖區(qū)寫入數(shù)據(jù)塊 */
CH375_WR_DAT_PORT( length ); /* 首先寫入后續(xù)數(shù)據(jù)長度,回傳剛接收到的數(shù)據(jù)長度 */
for ( i = 0; i < length; i ++ ) CH375_WR_DAT_PORT( ~ buffer[ i ] ); /* 數(shù)據(jù)取反后返回,由計算機(jī)應(yīng)用程序測試數(shù)據(jù)是否正確 */
break;
}
case USB_INT_EP2_IN: { /* 批量數(shù)據(jù)發(fā)送成功 */
CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); /* 釋放當(dāng)前USB緩沖區(qū) */
break;
}
default: { /* 其它中斷,未用到,解鎖后退出即可 */
CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); /* 釋放當(dāng)前USB緩沖區(qū) */
break;
}
}
}
main( ) {
Delay50ms( ); /* 延時等待CH375初始化完成,如果單片機(jī)由CH375提供復(fù)位信號則不必延時 */
CH375_Init( ); /* 初始化CH375 */
EA = 1; /* 允許中斷 */
while ( 1 ); /* 以下指令開始工作循環(huán),等待PC機(jī)命令進(jìn)行操作 */
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -