[求助]CH376始終無法識別U盤

用msp430與CH376通過SPI通信來讀取U盤文件,但是始終無法識別U盤,而且初始化老出錯。 請哪位大大幫忙看看程序。 下面是主程序。。。。 #include "in430.h" #include "CH376INC.h" #include "msp430x14x.h" #include "functions.h" #include "Boardconfig.h" uchar buf[20]; void int_usart(); void sent_byte(unsigned char data);

void main( void ) { // Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD; uchar s; uchar i; BoardConfig(0xf0); initsys(); initspi(); initport(); int_usart(); CH376_SPI_RST_1; Delayms( 20 ); CH376_SPI_RST_0; Delayms( 100 ); s=mInitCH376Host(); mStopIfError(s); while(1) { while ( CH376_DiskConnect()!= USB_INT_SUCCESS ) /* 檢查U盤是否連接,等待U盤插入,對于SD卡,可以由單片機直接查詢SD卡座的插拔狀態(tài)引腳 */ { Delayms( 100 ); } //Delayms( 200 ); for ( i = 0; i < 100; i ++ ) { Delayms( 50 ); s = CH376_DiskMount( ); /* 初始化磁盤并測試磁盤是否就緒 */ if ( s == USB_INT_SUCCESS ) /* 準備好 */ { P2OUT&=~BIT4;//成功亮D5 break; } else if ( s == ERR_DISK_DISCON ) /* 檢測到斷開,重新檢測并計時 */ { break; } if ( CH376_GetDiskStatus( ) >= DEF_DISK_MOUNTED && i >= 5 ) /* 有的U盤總是返回未準備好,不過可以忽略,只要其建立連接MOUNTED且嘗試5*50mS */ { break; } } if ( s == ERR_DISK_DISCON ) /* 檢測到斷開,重新檢測并計時 */ { continue; } if ( CH376_GetDiskStatus( ) < DEF_DISK_MOUNTED ) /* 未知USB設備,例如USB鍵盤、打印機等 */ { goto UnknownUsbDevice; } UnknownUsbDevice: while ( CH376_DiskConnect( )==USB_INT_SUCCESS ) /* 檢查U盤是否連接,等待U盤拔出 */ { Delayms( 100 ); } } } void int_usart() { U0CTL|=SWRST;//復位串口 U0CTL|=CHAR; //8位數(shù)據(jù) U0TCTL|=SSEL1;//select SMCLK AS CLK //U0BR0=0Xa0; //U0BR1=0X01; //UMCTL0=0Xc0;//19200 U0BR0 = 0x45; U0BR1 = 0x00; U0MCTL = 0x00; //115200 ME1|=UTXE0;//使能接收和發(fā)送 U0CTL&=~SWRST;// //IE1|=URXIE0;//使能接收中斷 //P3SEL|=BIT4; //P3SEL|=BIT5;//選擇I/O口使用擴展功能 P3SEL |= 0x30; P3DIR |= BIT4; } void sent_byte(unsigned char data) { while((IFG1&UTXIFG0)==0);//判斷發(fā)送緩沖區(qū)是否結束 U0TXBUF=data; } #include "functions.h" #include "msp430x14x.h" #include "CH376INC.h" void initsys(void)//system clock { uchar i; BCSCTL1&=~XT2OFF; do { IFG1 &= ~OFIFG; for (i = 0xFF; i > 0; i--); } while ((IFG1 & OFIFG) != 0); BCSCTL2|=SELM1+SELS; } void initspi(void) { U1CTL = SWRST; // 8-bit SPI Master **SWRST** U1CTL = CHAR | SYNC | MM; // 8-bit SPI Master **SWRST** U1TCTL = SSEL1 | SSEL0 | STC; // SMCLK, 3-pin mode, clock idle low, data valid on rising edge, UCLK delayed U1TCTL &= ~CKPH;//UCLK延時半個周期作為SPI時鐘,時鐘低電平為無效信號,上升沿鎖存數(shù)據(jù) U1TCTL &= ~CKPL; U1BR0 = 0x04; // 0x02: UCLK/2 (4 MHz), works also with 3 and 4 U1BR1 = 0x00; U1MCTL = 0x00; U1CTL &= ~SWRST; // clear SWRST IE2 &=~UTXIE1; IE2 &=~URXIE1; ME2|= USPIE1; // Enable USART1 SPI mode } void initport(void) { //spi P5DIR|=BIT0+BIT1+BIT3; //設置端口方向 P5SEL|=BIT1+BIT2+BIT3; //設置功能 //others P2DIR|=0xff; P2DIR&=~BIT7; P2DIR&=~BIT1; P2IE|=BIT7; P2IES|=0x00; P2OUT|=BIT0+BIT2+BIT3+BIT4+BIT5+BIT6; _EINT(); } uchar mInitCH376Host( void ) { //_DINT(); uchar res; //CH376_SPI_SCS_1; SPI_Write_CMD( CMD_CHECK_EXIST ); /* 測試單片機與CH376之間的通訊接口 */ SPI_Write_Byte( 0x55 ); res=SPI_Read_Byte( ); CH376_SPI_SCS_1; //Delayus(100); if ( res != 0xAA ) // P2OUT&=~BIT5; return( ERR_USB_UNKNOWN );/* 通訊接口不正常,可能原因有:接口連接異常,其它設備影響(片選不唯一),串口波特率,一直在復位,晶振不工作 */ SPI_Write_CMD( CMD11_SET_USB_MODE ); // P2OUT&=~BIT4; /* while(1); {P2OUT&=~BIT5; Delayms(1000); P2OUT|=BIT5; Delayms(1000);}*//* 設備USB工作模式 */ SPI_Write_Byte( 0x06 ); //P2OUT&=~BIT4; Delayus( 20 ); res = SPI_Read_Byte( ); CH376_SPI_SCS_1; #ifndef CH376_SPI_INT #ifdef //CH376_SPI_SDO //SPI_Write_CMD( CMD20_SET_SDO_INT ); /* 設置SPI的SDO引腳的中斷方式 */ SPI_Write_Byte( 0x16 ); SPI_Write_Byte( 0x90 ); /* SDO引腳在SCS片選無效時兼做中斷請求輸出 */ CH376_SPI_SCS_1; #endif #endif if ( res == CMD_RET_SUCCESS ) { return( USB_INT_SUCCESS ); } else { return( ERR_USB_UNKNOWN ); /* 設置模式錯誤 */ } } void Delayus(uint US) { uint i; US=US*5/4; // 5/4是在8MHz晶振下,通過軟件仿真反復實驗得到的數(shù)值 for( i=0;i} void Delayms(uint MS) { uint i,j; for(i=0;i for(j=0;j<1141;j++); // 1141是在8MHz晶振下,通過軟件仿真反復實驗得到的數(shù)值 } uchar SPI_Read_Byte() { uchar rByte; while((IFG2&URXIFG1)==0); rByte=U1RXBUF; return rByte; } void SPI_Write_Byte(uchar wByte) { U1TXBUF=wByte; while((IFG2&UTXIFG1)==0); // 等待發(fā)送完成 } void SPI_Write_CMD( uchar mCmd ) { #ifdef CH376_SPI_BZ uchar i; #endif CH376_SPI_SCS_1; /* 防止之前未通過xEndCH376Cmd禁止SPI片選 */ Delayus(5); CH376_SPI_SCS_0; /* SPI片選有效 */ SPI_Write_Byte( mCmd ); /* 發(fā)出命令碼 */ #ifdef CH376_SPI_BZ // if for ( i = 30; i != 0 && CH376_SPI_BZ; -- i ); /* SPI忙狀態(tài)查詢,等待CH376不忙,或者下面一行的延時1.5uS代替 */ #else // else //{ Delayus(5); Delayus(5); Delayus(5); // ) #endif } /******************************************************************************* * 函 數(shù) 名 : CH376_Read_Var8 * 描 述 : 讀CH376芯片內部的8位變量. *******************************************************************************/ uchar CH376_Read_Var8( uchar var ) { uchar c0; SPI_Write_CMD( CMD11_READ_VAR8 ); /* 讀取指定的8位文件系統(tǒng)變量 */ SPI_Write_Byte( var ); c0 = SPI_Read_Byte( ); CH376_SPI_SCS_1; return( c0 ); } /******************************************************************************* * 函 數(shù) 名 : CH376_Read_Block * 描 述 : 從當前主機端點的接收緩沖區(qū)讀取數(shù)據(jù)塊,. *******************************************************************************/ uchar CH376_Read_Block(uchar *buf) {

uchar status, len; SPI_Write_CMD( CMD01_RD_USB_DATA0 ); status = len = SPI_Read_Byte( ); // 長度 if ( len ) { do { *buf = SPI_Read_Byte( ); buf ++; } while ( -- len ); } CH376_SPI_SCS_1; return( status ); } ///////////////////////////////////////////// uchar CH376_DiskMount( void ) { return( CH376_SendCmd_WaitInt( CMD0H_DISK_MOUNT ) );/* 初始化磁盤并測試磁盤是否就緒 */ } uchar Query376Interrupt( void ) { #ifdef CH376_SPI_INT return( CH376_SPI_INT ? FALSE : TRUE ); /* 如果連接了CH376的中斷引腳則直

s = CH376_DiskMount( ); 這個函數(shù)返回什么錯誤?


uchar mInitCH376Host( void )函數(shù) 中 res=SPI_Read_Byte( )=0X06


在初始化376的函數(shù)中的寫入0x55讀回來的值是0x06


又做了幾次試驗初始化中的res讀回來的值很不穩(wěn)定一直在變---'? (0xAA)類似于這個格式的。。。這是什么情況啊。。。。[Emot]1[/Emot][Emot]1[/Emot]


uchar SPI_Read_Byte() { uchar rByte; while((IFG2&URXIFG1)==0); rByte=U1RXBUF; return rByte; }

這是我SPI讀數(shù)據(jù)函數(shù),我用的是msp430硬件SPI高人看看有沒有什么問題, void SPI_Write_Byte(uchar wByte) { U1TXBUF=wByte; while((IFG2&UTXIFG1)==0); // 等待發(fā)送完成 } 這是寫函數(shù) void SPI_Write_CMD( uchar mCmd ) { CH376_SPI_SCS_1; /* 防止之前未通過xEndCH376Cmd禁止SPI片選 */ Delayus(5); CH376_SPI_SCS_0; /* SPI片選有效 */ SPI_Write_Byte( mCmd ); Delayus(5); Delayus(5); Delayus(5); } 這是寫命令的函數(shù)。。。現(xiàn)在SPI_Write_CMD( CMD_CHECK_EXIST ); 后讀回來的值前面一直有''或是'?這種東西。。。是不是我上面三個函數(shù)有問題啊。。。


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

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