?? usb.c
字號:
#include "usb.h"
#define USBCS PORTD |=_BV(PD7) |_BV(PD6) |_BV(PD5) ; PORTB |=_BV(PB7)//(PORTD |=_BV(PD7) |_BV(PD6) |_BV(PD5) )//; ( PORTB |=_BV(PB7)))
uchar i;
//***************************************************************************
/*
下面是USB移動存儲設備的簡單應用參考。在單片機應用程序中,
可以定義USB存儲設備的4種狀態:已斷開、已連接、初始化、可讀寫。其中"已連接"狀態可選。
● 已斷開是指USB存儲設備已經斷開(從USB插座中拔出),完全不可用;
● 已連接是指USB存儲設備已經連接(插入USB插座中),但是尚未初始化;
● 初始化是指USB存儲設備正在初始化或者初始化失敗,所以不可以進行讀寫;
● 可讀寫是指USB存儲設備初始化成功,可以進行數據讀寫。
單片機處理CH375中斷的一般步驟如下:
㈠ CH375將INT#引腳設置為低電平,向單片機請求中斷;
㈡ 單片機進入中斷服務程序,首先執行GET_STATUS命令獲取中斷狀態;
㈢ CH375在GET_STATUS命令完成后將INT#引腳恢復為高電平,取消中斷請求;
㈣ 單片機可以參考下面的順序分析GET_STATUS命令獲取的中斷狀態:
⑴ 如果中斷狀態是USB_INT_DISCONNECT,則說明USB設備已經斷開,置USB存儲設備狀態為"已斷開",
如果在此之前USB存儲設備有讀寫操作尚未完成,則放棄操作并按操作失敗處理,然后退出中斷,必要時可以通知單片機主程序。
⑵ 如果中斷狀態是USB_INT_CONNECT,則說明USB設備已經連接,置USB存儲設備狀態為"已連接",
接著發出DISK_INIT命令,并置USB存儲設備狀態為初始化,然后退出中斷,必要時可以通知單片機主程序。
⑶ 如果當前的USB存儲設備狀態是"初始化":
① 如果中斷狀態是USB_INT_SUCCESS,則說明USB存儲設備初始化成功,置USB存儲設備狀態為"可讀寫",
然后退出中斷,必要時可以通知單片機主程序。
② 如果中斷狀態是其它狀態,則說明USB存儲設備初始化失敗,應該通知單片機主程序,
提示該USB設備不是存儲設備或者該USB設備不支持,然后退出中斷。或者,單片機通過其它命令自行處理該USB存儲設備的通訊協議。
⑷ 如果當前的USB存儲設備狀態是"可讀寫",則可以保存中斷狀態并通知單片機主程序處理,
然后直接退出中斷;或者,在中斷服務程序中繼續處理:
① 如果中斷狀態是USB_INT_DISK_READ,則說明正在進行USB存儲設備的讀操作,需要取走64個字節的數據,
可以發出RD_USB_DATA命令取走數據,接著再發出DISK_RD_GO命令使CH375繼續讀,然后退出中斷。
② 如果中斷狀態是USB_INT_DISK_WRITE,則說明正在進行USB存儲設備的寫操作,需要提供64個字節的數據,
可以發出WR_USB_DATA7命令提供數據,接著再發出DISK_WR_GO命令使CH375繼續寫,然后退出中斷。
③ 如果中斷狀態是USB_INT_SUCCESS,則說明讀寫操作成功,直接退出中斷并通知主程序該操作成功;
④ 如果中斷狀態是USB_INT_DISK_ERR,則說明讀寫操作失敗,直接退出中斷并通知主程序該操作失敗;
⑤ 通常不會返回其它中斷狀態,如果有,則說明出現錯誤。
⑸ 通常不會在其它USB存儲設備狀態下返回其它中斷狀態,如果有,則說明出現錯誤,可以參照USB設備斷開的狀態處理。
當單片機主程序需要從USB存儲設備中讀寫數據時,可以查詢USB存儲設備狀態,
如果是"可讀寫"狀態,則可以發出DISK_READ命令讀數據,或者發出DISK_WRITE命令寫數據。
后續的數據讀寫過程可以在單片機的中斷服務程序中完成,也可以由中斷程序置標志通知等待中的主程序,
由主程序分析中斷狀態再完成數據讀寫過程。
*/
//
void Usb_Initzx(void)
{
MCUCR |=_BV(SRE) |_BV(SRW10); //外部SRAM可用 SRW10高段WAIT
XMCRA |= _BV(SRW11);
DDRD = 0XFF;
DDRB = 0XFF;
PORTB |=_BV(PB7);
USBCS;
}
void RestUSBzx(uchar i)
{
PORTB |=_BV(PB7);
USBCommandWrite = i;
PORTB &=!_BV(PB7);
}
uchar CheckUSBzx(uchar i)
{
uchar a;
PORTB |=_BV(PB7);
USBCommandWrite = i;
PORTB &=!_BV(PB7);
PORTB |=_BV(PB7);
USBCommandWrite = 0x57;
PORTB &=!_BV(PB7);
PORTB |=_BV(PB7);
a = USBDataRead;
PORTB &=!_BV(PB7);
return a;
}
uchar Get_IC_VERzx(uchar i)
{
uchar a;
PORTB |=_BV(PB7);
USBCommandWrite = i;
PORTB &=!_BV(PB7);
PORTB |=_BV(PB7);
//USBCommandWrite = 0x05;
//PORTB &=!_BV(PB7);
//PORTB |=_BV(PB7);
a = USBDataRead;
PORTB &=!_BV(PB7);
return a;
}
uchar CH375Initzx(uchar i)
{
uchar a;
PORTB |=_BV(PB7);
USBCommandWrite = i;
PORTB &=!_BV(PB7);
PORTB |=_BV(PB7);
USBCommandWrite = 0x06;
PORTB &=!_BV(PB7);
PORTB |=_BV(PB7);
for(a = 0xff;a !=0;a --)
{
if(USBDataRead == CMD_RET_SUCCESS ) break;
}
PORTB &=!_BV(PB7);
if(a != 0)
return (TRUE);
else
return (FALSE);
}
/* 基本操作 */
void CH375_WR_CMD_PORT( unsigned char cmd ) { /* 向CH375的命令端口寫入命令,周期不小于4uS,如果單片機較快則延時 */
//delay2us();
// uchar a;
PORTB |=_BV(PB7);
CH375_CMD_PORT=cmd;
PORTB &=!_BV(PB7);
//delay2us();
}
void CH375_WR_DAT_PORT( unsigned char dat ) { /* 向CH375的數據端口寫入數據,周期不小于1.5uS,如果單片機較快則延時 */
// uchar a;
PORTB |=_BV(PB7);
CH375_DAT_PORT=dat;
//delay1us(); /* 因為MCS51單片機較慢所以實際上無需延時 */
PORTB &= !_BV(PB7);
}
unsigned char CH375_RD_DAT_PORT() { /* 從CH375的數據端口讀出數據,周期不小于1.5uS,如果單片機較快則延時 */
//delay1us(); /* 因為MCS51單片機較慢所以實際上無需延時 */
uchar a;
PORTB |=_BV(PB7);
a = CH375_DAT_PORT;
PORTB |=_BV(PB7);
return(a);
}
/* CH375的INT#引腳連接51單片機的INT0引腳, 采用中斷方式 */
/* CH375中斷服務程序,使用寄存器組1 */
//中斷0
SIGNAL(SIG_INTERRUPT4)
//*******************************************
//void CH375Interrupt( ) interrupt 0 using 1
{
unsigned char i, s, len;
CH375_WR_CMD_PORT( CMD_GET_STATUS ); /* 獲取中斷狀態并取消中斷請求 */
for ( i = 2; i != 0; i -- ); /* 至少延時2uS */
s = CH375_RD_DAT_PORT( ); /* 獲取中斷狀態 */
if ( s == USB_INT_SUCCESS )
{
UdiskStatus = STATUS_READY; /* 操作成功 */
//****************************************************
CH375_WR_CMD_PORT( CMD_DISK_READ ); /* 從USB存儲器讀數據塊 */
CH375_WR_DAT_PORT(0); //(unsigned char) iLbaStart ); /* LBA的最低8位 */
CH375_WR_DAT_PORT(0);// (unsigned char)( iLbaStart >> 8 ) );
CH375_WR_DAT_PORT(0);// (unsigned char)( iLbaStart >> 16 ) );
CH375_WR_DAT_PORT(0);// (unsigned char)( iLbaStart >> 24 ) ); /* LBA的最高8位 */
CH375_WR_DAT_PORT(1);// iSectorCount ); /* 扇區數 */
//****************************************************
}
else
if ( s == USB_INT_DISCONNECT )
{
UdiskStatus = STATUS_DISCONNECT; /* 檢測到USB設備斷開事件 */
// LED_OUT_INACT( );
}
else
if ( s == USB_INT_CONNECT )
{
UdiskStatus = STATUS_CONNECT; /* 檢測到USB設備連接事件 */
// LED_OUT_ACT( );
//****************************
CH375_WR_CMD_PORT( CMD_DISK_INIT ); /* 初始化USB存儲器 */
//****************************
}
else
if ( s == USB_INT_DISK_READ )
{ /* USB存儲器讀數據塊,請求數據讀出 */
CH375_WR_CMD_PORT( CMD_RD_USB_DATA ); /* 從CH375緩沖區讀取數據塊 */
for ( i = 2; i != 0; i -- ); /* 至少延時2uS */
len = CH375_RD_DAT_PORT( ); /* 后續數據的長度 */
while ( len )
{ /* 根據長度讀取數據 */
*mBufferPoint = CH375_RD_DAT_PORT( ); /* 讀出數據并保存 */
mBufferPoint ++;
len --;
}
CH375_WR_CMD_PORT( CMD_DISK_RD_GO ); /* 繼續執行USB存儲器的讀操作 */
}
else
if ( s == USB_INT_DISK_WRITE )
{ /* USB存儲器寫數據塊,請求數據寫入 */
CH375_WR_CMD_PORT( CMD_WR_USB_DATA7 ); /* 向CH375緩沖區寫入數據塊 */
for ( i = 2; i != 0; i -- ); /* 至少延時2uS */
len = CH375_MAX_DATA_LEN;
CH375_WR_DAT_PORT( len ); /* 后續數據的長度 */
do { /* 對于C51,這個DO+WHILE結構比上面的WHILE效率高,速度快 */
CH375_WR_DAT_PORT( *mBufferPoint );
mBufferPoint ++;
} while ( -- len );
CH375_WR_CMD_PORT( CMD_DISK_WR_GO ); /* 繼續執行USB存儲器的寫操作 */
}
else
{ /* 操作失敗 */
UdiskStatus = STATUS_ERROR;
}
/* CH375_INT_FLAG = 0; 清中斷標志 */
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -