我使用MSP430F1611控制CH376T读写U盘,采用默认的9600bps控制CH376读写U盘正常,但是设置UART_WORK_BAUDRATE后,一直初始化错误。现在电压为3.3V,一直查不出问题来,请大家帮忙。下面是我修改后的UART_HW.C文件的代码。程序中设置的工作波特率为100000bps。
/* CH376芯片 硬件标准异步串口连接的硬件抽象层 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#引脚,如果未连接那么也可以通过查询串口中断状态码实现 */
#defineUART_INIT_BAUDRATE9600/* 默认通讯波特率9600bps,建议通过硬件引脚设定直接选择更高的CH376的默认通讯波特率 */
#defineUART_WORK_BAUDRATE100000 //57600/* 正式通讯波特率57600bps */
voidCH376_PORT_INIT( void ) /* 由于使用异步串口读写时序,所以进行初始化 */
{
/* 如果单片机只有一个串口,那么必须禁止通过串口输出监控信息 */
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写数据 */
{
while(!(IFG2&UTXIFG1));
TXBUF1=mData; /* 串口输出 */
}
UINT8xReadCH376Data( void ) /* 从CH376读数据 */
{
UINT32i;
for ( i = 0; i < 500000; i ++ ) { /* 计数防止超时 */
if(IFG2&URXIFG1)
{
return(RXBUF1);
}
}
return( 0 ); /* 不应该发生的情况 */
}
/* 查询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 ); /* 通讯接口不正常,可能原因有:接口连接异常,其它设备影响(片选不唯一),串口波特率,一直在复位,晶振不工作 */
#ifdefUART_WORK_BAUDRATE
xWriteCH376Cmd( CMD21_SET_BAUDRATE ); /* 设置串口通讯波特率 */
xWriteCH376Data( 0x03 );
xWriteCH376Data( 0xc4 );
SET_WORK_BAUDRATE( ); /* 将单片机切换到正式通讯波特率 */
res = xReadCH376Data( );
if ( res != CMD_RET_SUCCESS ) return( ERR_USB_UNKNOWN ); /* 通讯波特率切换失败,建议通过硬件复位CH376后重试 */
#endif
xWriteCH376Cmd( CMD11_SET_USB_MODE ); /* 设备USB工作模式 */
xWriteCH376Data( 0x06 );
res = xReadCH376Data( );
if ( res == CMD_RET_SUCCESS ) return( USB_INT_SUCCESS );
else return( ERR_USB_UNKNOWN ); /* 设置模式错误 */
}