ch375B串口做host读U盘的问题

求助啊! 我用CH375作USB主机方式,以串口方式读取U盘数据。 可是发出去接收到的值总是不对,下面是串口接收的程序,大家帮忙看看,急啊

手册上说是9为数据位,第9位为1时是命令,这样写可以吗?结果不对。 u8 Uart2_PutCMDChar( u8 ch ) { // USART2->DR = ( ch & (u16)0x01FF | (u16)0x0100 ); USART2->DR = ( ch & (u16)0x01FF ) << 1 | (u16)0x0001 ; while (USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET) ;

return ch; }

下面是接收: u8 Uart2_GetChar ( void ) //used to read from CH375 { u8 ch ; //½ÓÊÕÊý¾Ý¼Ä´æÆ÷·Ç¿Õ while(USART_GetFlagStatus(USART2, USART_FLAG_RXNE) == RESET) ; ch = USART_ReceiveData( USART2 ); return ch; }

救命啊,,


你先拿三个读写子函数来进行测试命令的调试,看下测试命令是否正常?如果正常的话那说明你的三个读写子函数没问题,如果不正常的话,那么包括你的硬件连线是否有问题,波特率设置是否有问题(CH375默认波特率是9600)


测试命令不正常,测试0x55收到的数据0x0D.可是不知道是哪的问题。 我想问那标识命令或数据的1为是不是应该这样自己加进去的? 波特率设的是9600,数据位9位。


是的,在写命令的时候把第9位置1,写数据的时候把第9位置0.


void xWriteCH375Cmd( UINT8 mCmd ) { USART2->DR = ( UINT16 )mCmd | (u16)0x0100; while( ( USART2->SR & USART_FLAG_TXE) == RESET ); mDelayuS( 2 ); }

void xWriteCH375Data( UINT8 mData ) { USART2->DR = ( UINT16 )mData & (u16)0x0ff; while( ( USART2->SR & USART_FLAG_TXE) == RESET ); mDelayuS( 1 ); }

u8 xReadCH375Data( void ) { unsigned char dat;

while( USART_GetFlagStatus( USART2, USART_FLAG_RXNE ) == RESET ); dat = USART_ReceiveData( USART2 ); mDelayuS(1); return( dat ); } 试试这个接口函数


还是不对哎,,,是不是第9位的位置不对? 我的平台是stm32,,,默认的字节是大端的,有关系吗? 麻烦你了!!!


谁来帮帮忙,感激不尽啊!


这个接口函数是测试过的,你的串口有没有配置为9位数据方式呢 USART_InitStructure.USART_BaudRate = 9600; USART_InitStructure.USART_WordLength = USART_WordLength_9b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_InitStructure.USART_Clock = USART_Clock_Disable; USART_InitStructure.USART_CPOL = USART_CPOL_Low; USART_InitStructure.USART_CPHA = USART_CPHA_2Edge; USART_InitStructure.USART_LastBit = USART_LastBit_Disable;


配置成了9位的,真的奇怪


而且我收到的数据是9位的


是我写什么过去,就返回同样的数据,写过去个测试命令100000110,就回来个100000110, 怎么回事呢?


ch375上电先延时50ms,测试25,26脚电平,正常25脚为低,26脚为高,可以把原理图贴出来看看


好了,谢谢大家,


我还有个问题: 这个程序中很多地方的延时为什么要加,在什么地方必须要加?我看大家用的是微秒级的,我用的是毫秒级的,都是延时1毫秒。。。。有影响吗?


延时是为了让CH375对收到命令或数据进行处理,命令、数据之后都要加,毫秒太长了,命令后延时1.5us,数据后延时0.6uS


只有登录才能回复,可以选择微信账号登录