?? dataload.c
字號:
/* 計算機應用程序將某個文件的數據通過USB下傳到單片機的RAM中,本程序中單片機再將數據從串口輸出,相當于USB轉串口,供參考 */
/*
; CH375/CH372 Bulk Data Download
; U2(AT89C51) Program
; 本程序測試收大數據塊
; 本程序適用于時鐘頻率不高于24MHz的標準MCS-51單片機
;
; Website: http://winchiphead.com
; Email: tech@winchiphead.com
; Author: W.ch 2003.09
*/
/* MCS-51單片機C語言的示例程序 */
#include <reg52.h>
#include "CH375INC.H"
unsigned char volatile xdata CH375_CMD_PORT _at_ 0xBDF1; /* CH375命令端口的I/O地址 */
unsigned char volatile xdata CH375_DAT_PORT _at_ 0xBCF0; /* CH375數據端口的I/O地址 */
unsigned char xdata data_buffer[0x8000] _at_ 0x0000;
unsigned char xdata *p_xram;
unsigned char xdata *p_ser;
/* 延時2微秒,不精確 */
void Delay2us( )
{
unsigned char i;
#define DELAY_START_VALUE 1 /* 根據單片機的時鐘選擇初值,20MHz以下為0,30MHz以上為2 */
for ( i=DELAY_START_VALUE; i!=0; i-- );
}
/* 延時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;
/* 設置USB工作模式, 必要操作 */
CH375_CMD_PORT = CMD_SET_USB_MODE;
Delay2us( ); /* 如果時鐘頻率低于16MHz則無需該指令延時 */
CH375_DAT_PORT = 2; /* 設置為使用內置固件的USB設備方式 */
for ( i=100; i!=0; i-- ) { /* 等待操作成功,通常需要等待10uS-20uS */
if ( CH375_DAT_PORT==CMD_RET_SUCCESS ) break;
}
/* if ( i==0 ) { CH372/CH375存在硬件錯誤 }; */
/* 下述啟用中斷,假定CH375連接在INT0 */
IT0 = 0; /* 置外部信號為低電平觸發 */
IE0 = 0; /* 清中斷標志 */
EX0 = 1; /* 允許CH375中斷 */
}
/* CH375中斷服務程序,使用寄存器組1 */
void mCh375Interrupt( ) interrupt 0 using 1
{
unsigned char InterruptStatus;
unsigned char length;
CH375_CMD_PORT = CMD_GET_STATUS; /* 獲取中斷狀態并取消中斷請求 */
Delay2us( ); /* 如果時鐘頻率低于16MHz則無需該指令延時 */
InterruptStatus = CH375_DAT_PORT; /* 獲取中斷狀態 */
if ( InterruptStatus == USB_INT_EP2_OUT ) { /* 批量端點下傳成功 */
CH375_CMD_PORT = CMD_RD_USB_DATA; /* 從當前USB中斷的端點緩沖區讀取數據塊,并釋放緩沖區 */
Delay2us( ); /* 如果時鐘頻率低于16MHz則無需該指令延時 */
length = CH375_DAT_PORT; /* 首先讀取后續數據長度 */
if ( length == 0 ) /* 如果長度為0說明計算機將要開始下傳一個新的文件 */
{
p_xram=data_buffer; /* 將指針初始化以便接收 */
p_ser=data_buffer;
}
else /* 長度不為0則說明是下傳文件數據,接收到緩沖區中,再由主程序處理串口發送 */
{
do {
*p_xram = CH375_DAT_PORT;
p_xram++;
} while ( --length);
if ( p_xram >= 0x7f80 ) p_xram=data_buffer; /* 防止XRAM溢出,這是簡單處理,實際產品應該處理嚴密些 */
}
}
else CH375_CMD_PORT = CMD_UNLOCK_USB; /* 釋放當前USB緩沖區 */
}
main( ) {
Delay50ms( ); /* 延時等待CH375初始化完成,如果單片機由CH375提供復位信號則不必延時 */
CH375_Init( ); /* 初始化CH375 */
// Init serial baudrate
PCON = 0x80;
SCON = 0x50; /* 8位串行數據 */
TL2 = RCAP2L = 0xf6;//0 - RetLen; /* 18.432MHz, 57600bps */
TH2 = RCAP2H = 0xFF;
T2CON = 0x34; /* 定時器2用于串口的波特率發生器 */
TI = 0; RI = 0; /* 清除中斷標志 */
// ?
EA = 1; /* 允許中斷 */
p_xram=data_buffer;
p_ser=data_buffer;
while ( 1 ) { /* 以下指令開始工作循環,等待PC機命令進行操作 */
if(p_ser<p_xram)
{
SBUF=*p_ser;
while(!TI);
TI=0;
p_ser++;
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -