我使用MSP430F1611控制CH376T讀寫U盤,采用默認(rèn)的9600bps控制CH376讀寫U盤正常,但是設(shè)置UART_WORK_BAUDRATE后,一直初始化錯誤。現(xiàn)在電壓為3.3V,一直查不出問題來,請大家?guī)兔ΑO旅媸俏倚薷暮蟮腢ART_HW.C文件的代碼。程序中設(shè)置的工作波特率為100000bps。
/* CH376芯片 硬件標(biāo)準(zhǔn)異步串口連接的硬件抽象層 V1.0 */
/* 提供I/O接口子程序 */
#include "msp430x14x.h"
#include"HAL.H"
#define CPU_F ((double)8000000)?
#define mDelayuS(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))?
#define mDelaymS(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))?
#define CH376_INT_WIRE ?(P4IN&BIT1) ? ?/* 假定CH376的INT#引腳,如果未連接那么也可以通過查詢串口中斷狀態(tài)碼實現(xiàn) */
#defineUART_INIT_BAUDRATE9600/* 默認(rèn)通訊波特率9600bps,建議通過硬件引腳設(shè)定直接選擇更高的CH376的默認(rèn)通訊波特率 */
#defineUART_WORK_BAUDRATE100000 ?//57600/* 正式通訊波特率57600bps */
voidCH376_PORT_INIT( void ) ?/* 由于使用異步串口讀寫時序,所以進(jìn)行初始化 */
{
/* 如果單片機只有一個串口,那么必須禁止通過串口輸出監(jiān)控信息 */
? ? ? ? ??
? P3SEL|=BIT6+BIT7; ? ?//采用UART1作為工作串口,P3.6為TXD,P3.7為RXD
? ME2|=UTXE1+URXE1;
? UCTL1|=CHAR;
? UTCTL1|=SSEL0+SSEL1;
? UBR01=0x41; ? ?//9600bps
? UBR11=0x03;
? UMCTL1=0x00;
? UCTL1&=~SWRST; ?
}
#ifdefUART_WORK_BAUDRATE
voidSET_WORK_BAUDRATE( void ) ?/* 將單片機切換到正式通訊波特率 */
{
? P3SEL|=BIT6+BIT7; ? ?//采用UART1作為工作串口,P3.6為TXD,P3.7為RXD
? ME2|=UTXE1+URXE1;
? UCTL1|=CHAR;
? UTCTL1|=SSEL0+SSEL1;
? UBR01=0x50; ? ? //100000bps
? UBR11=0x00; ?
? UMCTL1=0x00;?
? UCTL1&=~SWRST;?
}
#endif
voidxWriteCH376Cmd( UINT8 mCmd ) ?/* 向CH376寫命令 */
{
? ? while(!(IFG2&UTXIFG1));
? ? TXBUF1=SER_SYNC_CODE1; ?/* 啟動操作的第1個串口同步碼 */ ? ?
? ? while(!(IFG2&UTXIFG1));
? ? TXBUF1=SER_SYNC_CODE2; ?/* 啟動操作的第2個串口同步碼 */ ? ?
? ? while(!(IFG2&UTXIFG1));
? ? TXBUF1=mCmd; ?/* 串口輸出 */
}
voidxWriteCH376Data( UINT8 mData ) ?/* 向CH376寫數(shù)據(jù) */
{
? ? while(!(IFG2&UTXIFG1));
? ? TXBUF1=mData; ? /* 串口輸出 */
}
UINT8xReadCH376Data( void ) ?/* 從CH376讀數(shù)據(jù) */
{
UINT32i;
for ( i = 0; i < 500000; i ++ ) { ?/* 計數(shù)防止超時 */
? ? ? ? ? if(IFG2&URXIFG1)
? ? ? ? ? {
? ? ? ? ? ? return(RXBUF1);
? ? ? ? ? }
}
return( 0 ); ?/* 不應(yīng)該發(fā)生的情況 */
}
/* 查詢CH376中斷(INT#低電平) */
UINT8Query376Interrupt( void )
{
? ? UINT8 itemp;
#ifdefCH376_INT_WIRE
return( CH376_INT_WIRE ? FALSE : TRUE ); ?/* 如果連接了CH376的中斷引腳則直接查詢中斷引腳 ,如果輸入非零,返回FALSE,輸入為零,返回TRUE*/
#else
if ( IFG2&URXIFG1 ) {?
?itemp=RXBUF1;
? ? ? ? ? return( TRUE );
}
else return( FALSE );
#endif
}
UINT8mInitCH376Host( void ) ?/* 初始化CH376 */
{
UINT8res;
CH376_PORT_INIT( ); ?/* 接口硬件初始化 */
xWriteCH376Cmd( CMD11_CHECK_EXIST ); ?/* 測試單片機與CH376之間的通訊接口 */
xWriteCH376Data( 0x65 );
res = xReadCH376Data( );
if ( res != 0x9A ) return( ERR_USB_UNKNOWN ); ?/* 通訊接口不正常,可能原因有:接口連接異常,其它設(shè)備影響(片選不唯一),串口波特率,一直在復(fù)位,晶振不工作 */
? ? ? ??
#ifdefUART_WORK_BAUDRATE
xWriteCH376Cmd( CMD21_SET_BAUDRATE ); ?/* 設(shè)置串口通訊波特率 */
? ? ? ? xWriteCH376Data( 0x03 );
xWriteCH376Data( 0xc4 );
? ? ? ??
SET_WORK_BAUDRATE( ); ?/* 將單片機切換到正式通訊波特率 */
res = xReadCH376Data( );
if ( res != CMD_RET_SUCCESS ) return( ERR_USB_UNKNOWN ); ?/* 通訊波特率切換失敗,建議通過硬件復(fù)位CH376后重試 */
#endif
xWriteCH376Cmd( CMD11_SET_USB_MODE ); ?/* 設(shè)備USB工作模式 */
xWriteCH376Data( 0x06 );
res = xReadCH376Data( );
if ( res == CMD_RET_SUCCESS ) return( USB_INT_SUCCESS );
else return( ERR_USB_UNKNOWN ); ?/* 設(shè)置模式錯誤 */
}