求助:CH376通過STM32串口查詢U盤插入與否,造成芯片死掉。

MarkdownPad Document

用的是stm32的串口與ch376通訊。

  1. 因為需要設備自動判斷U盤插入, 所以根據(jù)例程寫了個查詢函數(shù): u8 Ch376_disk_connect_query(void) (代碼在下面)

  2. 發(fā)現(xiàn)先設置CH376為模式6后,再插入U盤。會造成CH376芯片死掉。(插入U盤進入模式6,可以檢測到U盤插入,拔掉U盤后也可以檢測到拔出。但是再次插入就會造成芯片死掉,串口無響應。)

    ?main
    {
    ?????Ch376_uart2_test();
    ?????Ch376_set_usb_mode();????
    ?????delay_ms(20);
    ????while(1)
    ?????{
    ?????????printf("\r\n-----------------------------------\r\n");
    ?????????delay_ms(1500);
    ?????????//Ch376_set_usb_mode();
    ?????????Ch376_disk_connect_query();
    ?????}
    ?}
  3. 如果把Ch376_set_usb_mode(); 函數(shù)也放到循環(huán)中,則會測試通過。

    ?Ch376_uart2_test();
    ?Ch376_set_usb_mode();????
    ?delay_ms(20);
    while(1)
    ?{
    ?????printf("\r\n-----------------------------------\r\n");
    ?????delay_ms(1500);
    ?????Ch376_set_usb_mode();
    ?????Ch376_disk_connect_query();
    ?}
//---------------------------Ch376_disk_connect_query()函數(shù)-------------------------------------------------------------

u8?Ch376_disk_connect_query(void)
{
????u8?temp;
????//如果先前產(chǎn)生中斷(串口接收到數(shù)據(jù)),查詢并清除
????if(USART_GetFlagStatus(USART2,USART_FLAG_RXNE)?==?SET)
????{?
????????temp?=?USART_ReceiveData(USART2);
????????printf("\r\nCh376_disk_connect_query()函數(shù)?查詢到上次中斷接收到串口數(shù)據(jù)為:%#X\r\n",temp);
????????Ch376_Send_Cmd(CMD01_GET_STATUS);
????????temp?=?Ch376_Read_Data();
????}

????USART_ClearFlag(USART2,USART_FLAG_RXNE);
????USART_ClearFlag(USART2,USART_FLAG_TC);

????//發(fā)送查詢U盤連接的?DISK_CONNECT?命令,會產(chǎn)生中斷。
????Ch376_Send_Cmd(0x30);
????temp?=?Ch376_Read_Data();
????printf("\r\nCh376_disk_connect_query()函數(shù)?第一次接收到串口數(shù)據(jù)為:%#X\r\n",temp);
????//查詢中斷狀態(tài)并取消中斷
????Ch376_Send_Cmd(CMD01_GET_STATUS);
????temp?=?Ch376_Read_Data();
????if(temp?==?0x14)
????{
????????printf("\r\nCh376_disk_connect_query()函數(shù)?查詢到U盤插入。第二次接收到串口數(shù)據(jù)為:%#X\r\n",temp);
????????return?1;
????}
????else?
????????printf("Ch376_disk_connect_query()函數(shù)?未查詢到U盤插入。返回值為:%#X\r\n",temp);
????????return?0;
}


串口盡量用中斷方式收數(shù)據(jù)。


RTX截圖未命名.png

Ch376_Read_Data()必須應該實現(xiàn)串口超時等待接收一個字節(jié)的功能。用以判斷中斷到來的標志。如果有這個中斷標志,才可以去執(zhí)行“Ch376_Send_Cmd(CMD01_GET_STATUS)”。

上電前,插上U盤,設置模式6,然后從串口超時接收一個字節(jié),是否是0x51,這個值要先讀出來。然后查看一下執(zhí)行Ch376_disk_connect_query的剛開始,串口接收的一個字節(jié)數(shù)據(jù)是否是0x15。這個0x15代表U盤插入,如果設置模式6之前U盤沒有插入,此時返回的應該是0x16,你實際操作驗證一下。


?一、 插上U盤設置模式6后,的確會有一個字節(jié)的中斷數(shù)據(jù)產(chǎn)生,數(shù)據(jù)就是0x15。(這個我看手冊,很早就留意到了。)
此時,拔下U盤,發(fā)送查詢U盤連接命令?**Ch376_Send_Cmd(0x30)**得到中斷,返回數(shù)據(jù)為: 0x82, 到現(xiàn)在為止,一切正常。再次插入U盤,發(fā)送查詢U盤連接命令?**Ch376_Send_Cmd(0x30)**,芯片會死掉,對命令無響應。

二、 不插入U盤設置模式6,并沒有產(chǎn)生中斷,也沒數(shù)據(jù)通過串口返回。?
此時發(fā)送查詢U盤連接命令?**Ch376_Send_Cmd(0x30)**得到中斷,返回數(shù)據(jù)為: 0x82. 到現(xiàn)在為止,一切正常。
但是如果這時候 插入U盤,發(fā)送?**Ch376_Send_Cmd(0x30) **U盤查詢命令,則會造成死機,芯片無響應。

三、 再問下,如果在CH376模塊產(chǎn)生中斷,通過產(chǎn)口返回中斷狀態(tài)后,并沒有發(fā)送中斷取消指令。**Ch376_Send_Cmd(CMD01_GET_STATUS)**,會怎樣?當然,我還是每次都發(fā)送了該命令,取消了中斷。

四、 芯片產(chǎn)生中斷后,在INT引腳產(chǎn)生低電平,發(fā)送命令Ch376_Send_Cmd(CMD01_GET_STATUS) 后,是不是會恢復到高電平?


另,

????1.?Ch376_Read_Data() 指令我是通過循環(huán)查詢的,不會造成主芯片 STM32死機。?

???? ?2. 我同樣寫了?Ch376_Query_Inetrrupt() 函數(shù)(循環(huán)查詢一定次數(shù)的串口狀態(tài))。

???????????用來進行測試。還是同樣的問題。(參照著51的例程源碼進行的。)


對于“芯片會死掉,對命令無響應”,是不是芯片無響應,可以用串口調試助手連接376發(fā)命令來驗證一下。

我看你的代碼是通過串口接收數(shù)據(jù)來作中斷檢測的,所以INT引腳根本就沒用到,所以是否清除INT引腳電平狀態(tài)也就不重要了。清除INT引腳電平是通過執(zhí)行CMD01_GET_STATUS來完成的。

Ch376_Read_Data() 指令我是通過循環(huán)查詢的,不會造成主芯片 STM32死機”一般我們都是串口超時接收,正確的操作一般也不會接收超時。

對于函數(shù)

UINT8?Query376Interrupt( void )
{
?UINT8 TEMP;
#ifdef?CH376_INT_WIRE
?if( CH376_INT_WIRE )??? /* 如果連接了CH376的中斷引腳則直接查詢中斷引腳 */
??return FALSE;
?else
?{
??RI = 0;????????????? //清除中斷標志,丟棄這個數(shù)據(jù)
??return TRUE;
?}?
#else
?if ( RI ) {? /* 如果未連接CH376的中斷引腳則查詢串口中斷狀態(tài)碼 */
??RI = 0;?????? ?//清除中斷標志,丟棄這個數(shù)據(jù)
??return( TRUE );
?}
?else return( FALSE );
#endif
}

其他文件系統(tǒng)應用層操作部分完全使用FILE_SYS.C文件


1. 是的,我是通過串口接收數(shù)據(jù)的標志位來檢測中斷狀態(tài)的。具體函數(shù)如下。

????????u8?Ch376_Query_Inetrrupt(void)??//整個函數(shù)我測試了一下,若沒有檢測到數(shù)據(jù),用時 330ms+。這個時間應該足夠CH376芯片處理了。

????????{

?????????????u32?i=?0;

????????????for(i?=?0;?i?<500000;?i++)

????????????{????if(USART_GetFlagStatus(USART2,USART_FLAG_RXNE)?==?SET)

????????????????{

????????????????????return?1;

????????????????}

????????????}

????????????return?0;

????????}

2. 我也 單純用串口助手試了。就是會出現(xiàn)CH376芯片未響應。

3.”?清除INT引腳電平是通過執(zhí)行CMD01_GET_STATUS來完成的。 ?“ ? ?這個是不是說如果沒用到 INT 引腳,是不是就不用執(zhí)行CMD01_GET_STATUS來清除中斷了。 直接接受中斷數(shù)據(jù)或者查詢中斷數(shù)據(jù)就行?


4. 有沒有技術支持的郵件?或者電話,這樣聯(lián)系速度好慢。


1、Ch376_Query_Inetrrupt()里面如果串口收到數(shù)據(jù),需要先清除串口接收標志,然后返回1。

2、這個你用ch376.exe調試工具測,沒有的話,到官網(wǎng)CH376EVT下載。

3、是的。

4、電話:025-52638376,郵件:gj@wch.cn


OK,問題已找到。不是軟件的問題。 是個硬件的BUG。感謝 jie 的支持。

1. 在用ch376.exe調試工具,測試后,發(fā)現(xiàn)不存在我的問題,拔插U盤都能正常檢測。這就證明CH376芯片本身沒有問題。后來偶然間想到了。

2. 我是直接用的STM32Mini板驅動CH376的轉接板,可能電流驅動不夠。偶然間外接了個電源給板子供電(充電寶........),芯片一下正常了(代碼一點沒改)。去掉外接電源,,之前的bug又復現(xiàn)了。

3. 弱弱的問下,要是給376芯片的驅動電流不夠,會不會造成芯片的休眠之類的。

按道理說,電壓電流不夠,芯片就不會正常工作的,但是明明可以接收到串口的數(shù)據(jù)(通訊正常,設置模式也正常)。 拔插U盤后,再測試連接狀態(tài),芯片就 gg 了。

真是迷一樣的bug。折騰了我整整一周??!我一直以為是我的我寫了bug代碼。。。。在代碼里面找問題。so,這次提醒了我,我的代碼還是可疑的。



那如果是電壓電流的問題,為什么之前用串口調試助手芯片會未響應?

測試命令、模式設置的時候還沒有和U盤有任何通訊呢,插上U盤之后也有可能是U盤電流比較大導致376供電電壓過低產(chǎn)生復位或工作不穩(wěn)定的情況。


之前的串口調不通,可能是因為我串口插在了,一拖四的USB-HUB上(筆記本USB口少的可憐).?后面用CH376DEBUG測試,直接插得USB口。。。。。


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

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