找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 15244|回復(fù): 19
打印 上一主題 下一主題
收起左側(cè)

51單片機+CH375讀寫U盤例程+電路原理圖

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:485624 發(fā)表于 2019-4-11 10:27 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
運行環(huán)境:STC51 1T單片機 22.1184M晶振 (建議使用STC12C5A60S2 或 STC89C58)
代碼介紹:

一:此程序首先將CH375程序庫及CH375芯片進行初始化,隨后開始檢測U盤是否已經(jīng)插入,U盤插入后,讀取U盤的物理總?cè)萘,單位為扇區(qū),即一共有多少個扇區(qū)。然后獲取U盤的格式化容量、剩余容量及文件系統(tǒng)類型。

二:此程序進行一些初始化的操作及基本參數(shù)的獲取。后面在根目錄下創(chuàng)建一個TEST.TXT文件,創(chuàng)建成功后,獲取此文件的相關(guān)信息并輸出。

三:此程序進行一些初始化的操作及基本參數(shù)的獲取。后面對根目錄下的所有文件進行列舉。然后更改test.txt的一些信息,如創(chuàng)建時間,文件屬性等。

四:此程序進行一些初始化的操作及基本參數(shù)的獲取。后面先定位文件的偏移量,然后讀取根目錄下的test.txt的從偏移量開始的40個字節(jié)(如果實際長度小于40,就讀取實際長度),最后向文件中寫入數(shù)據(jù)。

五:CH375對U盤的扇區(qū)級文件操作。

電路原理圖如下:


單片機源程序如下:
  1. #include "ch375.h"
  2. #include "myfun.h"

  3. /***********************************************************
  4.         +-----------------------------------------------+
  5.         | 振南電子 高級外設(shè)程序模塊 CH375 部分 [IO方式] |
  6.                 | 【此程序與視頻教程中有出入,主要是為了程序兼容|
  7.                 |     性與穩(wěn)定性,有些代碼借鑒沁恒官方源碼】        |
  8.         +-----------------------------------------------+
  9.   此源碼版權(quán)屬 振南 全權(quán)享有,如欲引用,敬請署名并告知
  10.         嚴禁隨意用于商業(yè)目的
  11.          振南電子
  12.                             WW:yzn07
  13.   注:本程序為IO方式,即使用單片機的IO模擬時序來驅(qū)動CH375
  14.       IO方式便于移植。其實IO在模擬外部總線的時序,對于沒有
  15.           外部總線的單片機,可以參考此程序。模擬時序,在速度上
  16.           不及硬件的外部總線。在操作U盤的時候,對操作速度有一定
  17.           要求。
  18.           這是振南在長期對CH375的研究中,得到的經(jīng)驗,請借鑒!                                  
  19. ***********************************************************/

  20. /******************************************************************
  21. - 功能描述:向CH375寫入命令
  22. - 隸屬模塊:CH375模塊
  23. - 函數(shù)屬性:內(nèi)部
  24. - 參數(shù)說明:cmd:要寫入的命令碼
  25. - 返回說明:無返回
  26. ******************************************************************/

  27. void CH375_Write_Cmd(unsigned char cmd)        //寫命令
  28. {
  29. delay(DELAYTIME); //稍作延時
  30. CH375_CS=0; //打開片選
  31. CH375_A0=1; //命令模式
  32. DATA_PORT=cmd;        //輸出命令碼
  33. CH375_WR=0; //打開寫使能
  34. delay(DELAYTIME); //稍作延時
  35. CH375_WR=1; //關(guān)閉寫使能
  36. CH375_CS=1; //關(guān)閉片選
  37. CH375_A0=1; //恢復(fù)A0為高電平
  38. delay(DELAYTIME); //稍作延時
  39. }

  40. /******************************************************************
  41. - 功能描述:向CH375寫入數(shù)據(jù)
  42. - 隸屬模塊:CH375模塊
  43. - 函數(shù)屬性:內(nèi)部
  44. - 參數(shù)說明:dat:是要寫入到CH375中的一個字節(jié)的數(shù)據(jù)
  45. - 返回說明:無返回
  46. ******************************************************************/

  47. void CH375_Write_Dat(unsigned char dat)        //寫數(shù)據(jù)
  48. {
  49. delay(DELAYTIME); //稍作延時
  50. CH375_CS=0; //打開片選
  51. CH375_A0=0; //數(shù)據(jù)模式
  52. DATA_PORT=dat;        //輸出數(shù)據(jù)
  53. CH375_WR=0; //打開寫使能
  54. delay(DELAYTIME); //稍作延時
  55. CH375_WR=1; //關(guān)閉寫使能
  56. CH375_CS=1; //關(guān)閉片選
  57. CH375_A0=1; //恢復(fù)A0為高電平
  58. delay(DELAYTIME);  //稍作延時
  59. }

  60. /******************************************************************
  61. - 功能描述:從CH375讀取一個字節(jié)
  62. - 隸屬模塊:CH375模塊
  63. - 函數(shù)屬性:內(nèi)部
  64. - 參數(shù)說明:無
  65. - 返回說明:讀到的字節(jié)
  66. ******************************************************************/

  67. unsigned char CH375_Read_Dat() //讀數(shù)據(jù)
  68. {
  69. unsigned char temp;
  70. CH375_CS=0; //打開片選
  71. CH375_A0=0; //數(shù)據(jù)模式
  72. CH375_RD=0; //打開讀使能
  73. DATA_PORT=0xff; //51單片機IO作輸入,先置高
  74. delay(DELAYTIME); //稍作延時
  75. temp=DATA_PORT; //讀取端口上的數(shù)據(jù)
  76. CH375_RD=1;  //關(guān)閉讀使能
  77. CH375_CS=1;  //關(guān)閉片選
  78. CH375_A0=1;  //恢復(fù)A0為高電平
  79. return temp; //返回讀到的值
  80. }

  81. /******************************************************************
  82. - 功能描述:等待CH375的中斷,并獲取中斷狀態(tài)
  83. - 隸屬模塊:CH375模塊
  84. - 函數(shù)屬性:內(nèi)部
  85. - 參數(shù)說明:無
  86. - 返回說明:中斷狀態(tài)碼 返回0說明操作成功
  87. ******************************************************************/

  88. unsigned char CH375_Wait_Int() //等待中斷信號,即INT引腳上產(chǎn)生低電平,并獲取中斷狀態(tài)碼,獲取后INT恢復(fù)高電平,以產(chǎn)生下一次中斷信號
  89. {
  90. CH375_INT=1;  //IO作輸入先置高
  91. while(CH375_INT); //等待中斷
  92. CH375_Write_Cmd(CMD_GET_STATUS); //產(chǎn)生操作完成中斷,獲取中斷狀態(tài)
  93. return CH375_Read_Dat();
  94. }

  95. /******************************************************************
  96. - 功能描述:初始化CH375芯片
  97. - 隸屬模塊:CH375模塊
  98. - 函數(shù)屬性:外部,供用戶調(diào)用
  99. - 參數(shù)說明:無
  100. - 返回說明:執(zhí)行結(jié)果
  101. ******************************************************************/

  102. unsigned char CH375_Init()
  103. {
  104. unsigned char i=0;
  105. CH375_Write_Cmd(CMD_GET_IC_VER);  /* 獲取芯片及固件版本 */
  106. i=CH375_Read_Dat();  /* 版本 */
  107. if(i<0xA2) return 1;  /* 不支持該芯片 */

  108. CH375_Write_Cmd(CMD_SET_USB_MODE);  /* 設(shè)置USB工作模式 */
  109. CH375_Write_Dat(6);  /* 模式代碼,自動檢測USB設(shè)備連接 */

  110. for(i=0;i<250;i++)
  111. {  /* 等待操作成功,通常需要等待10uS-20uS */
  112.   delay(10);
  113.   if(CH375_Read_Dat()==CMD_RET_SUCCESS )
  114.    return 0;  /* 操作成功 */
  115. }

  116. return 1;  /* CH375出錯,例如芯片型號錯或者處于串口方式或者不支持 */
  117. }


  118. /******************************************************************
  119. - 功能描述:初始化磁盤
  120. - 隸屬模塊:CH375模塊
  121. - 函數(shù)屬性:外部,供用戶調(diào)用
  122. - 參數(shù)說明:無
  123. - 返回說明:操作結(jié)果,0表示初始化磁盤成功
  124.                        1表示初始化磁盤失敗
  125. - 注:在使用U盤之前,先要調(diào)用此函數(shù),此函數(shù)將進行判斷
  126.             磁盤是否連接,初始化是否成功等操作
  127. ******************************************************************/

  128. unsigned char CH375_InitDisk()
  129. {
  130. unsigned char status,i,j=0;

  131. status=CH375_Wait_Int();
  132. if(status==USB_INT_DISCONNECT) return 1;  /* USB設(shè)備斷開 */

  133. while(1)
  134. {
  135.   CH375_Write_Cmd(CMD_DISK_INIT);  /* 初始化USB存儲器 */
  136.   status=CH375_Wait_Int();             /* 等待中斷并獲取狀態(tài) */
  137.   if(status==USB_INT_SUCCESS)
  138.    break;
  139. }

  140. while(1)         //以下代碼均源自沁恒的官方U盤初始化函數(shù),借用它可以提高對U盤的兼容性!
  141. {   
  142.   j++;
  143.   CH375_Write_Cmd(CMD_DISK_SIZE);  /* 獲取USB存儲器的容量 */
  144.   status=CH375_Wait_Int();             /* 等待中斷并獲取狀態(tài) */
  145.   if(status==USB_INT_SUCCESS)
  146.    break;
  147.   else
  148.   {
  149.    delay(1000);
  150.    CH375_Write_Cmd(CMD_DISK_R_SENSE); /* 獲取USB存儲器的容量 */
  151.    status=CH375_Wait_Int();                 /* 等待中斷并獲取狀態(tài) */
  152.    if(status==USB_INT_SUCCESS)            /* 出現(xiàn)錯誤 */
  153.         continue;
  154.    else
  155.     return 1;
  156.   }
  157.   if(j==5)
  158.    return 1;
  159. }
  160. for(i=0;i!=5;i++)
  161. {
  162.   CH375_Write_Cmd( CMD_DISK_READY );     /* 獲取USB存儲器的容量 */
  163.   status=CH375_Wait_Int();                 /* 等待中斷并獲取狀態(tài) */
  164.   if(status==USB_INT_SUCCESS)
  165.    return 0;                           /* U盤已經(jīng)成功初始化 */
  166. }
  167. return 1;
  168. }

  169. /******************************************************************
  170. - 功能描述:讀取U盤的扇區(qū)
  171. - 隸屬模塊:CH375模塊
  172. - 函數(shù)屬性:外部,供用戶調(diào)用
  173. - 參數(shù)說明:addr:扇區(qū)地址
  174.              pbuf:指向數(shù)據(jù)緩沖區(qū)的指針
  175. - 返回說明:返回操作結(jié)果,如果為0說明操作成功,
  176.                            如果為1說明操作失敗
  177. ******************************************************************/

  178. unsigned char CH375_Read_Sector(unsigned long addr,unsigned char *pBuf)
  179. {
  180. unsigned char i=0,j=0,k=0;
  181. unsigned char status,len;
  182. unsigned int counter=0;
  183. for(k=0;k<4;k++)
  184. {
  185.   counter=0;
  186.   CH375_Write_Cmd(CMD_DISK_READ);//磁盤讀取命令
  187.   CH375_Write_Dat(addr);
  188.   CH375_Write_Dat(addr>>8);
  189.   CH375_Write_Dat(addr>>16);
  190.   CH375_Write_Dat(addr>>24); //送入32位扇區(qū)地址
  191.   CH375_Write_Dat(1); //送入扇區(qū)數(shù)

  192.   for(i=0;i<8;i++)         //CH375的數(shù)據(jù)緩沖區(qū)為64字節(jié),所以讀取一個扇區(qū)要讀8次
  193.   {
  194.    status=CH375_Wait_Int();        //等待CH375中斷信號,讀取狀態(tài)碼
  195.    if(status==USB_INT_DISK_READ)        //如果狀態(tài)碼是USB_INT_DISK_READ,就開始讀取數(shù)據(jù),否則發(fā)生錯誤
  196.    {
  197.     CH375_Write_Cmd(CMD_RD_USB_DATA); //送入讀數(shù)據(jù)的命令
  198.     delay(4);
  199.     len=CH375_Read_Dat(); //先讀到的是數(shù)據(jù)的長度
  200.     do         //把隨后CH375送過來的數(shù)據(jù)放入pBuf中
  201.     {
  202.      pBuf[counter++]=CH375_Read_Dat();
  203.     }while(--len);
  204.     CH375_Write_Cmd(CMD_DISK_RD_GO);        //送入繼續(xù)讀數(shù)據(jù)的命令,CH375會將下面64個字節(jié)放入緩沖區(qū),等待單片機來讀
  205.    }
  206.    else
  207.    {
  208.     return 1; //發(fā)生錯誤,返回狀態(tài)碼
  209.    }
  210.   }

  211.   status=CH375_Wait_Int(); //讀取8次以后,最后一次送入繼續(xù)讀數(shù)據(jù)的命令,等待CH375產(chǎn)生中斷信號,并讀取狀態(tài)
  212.   if(status==USB_INT_SUCCESS) //如果狀態(tài)碼為USB_INT_SUCCESS,說明讀取扇區(qū)成功,返回0
  213.   {
  214.    return 0;
  215.   }
  216.   else
  217.    if(status==USB_INT_DISK_ERR )
  218.    {
  219.     delay(1000);
  220.     CH375_Write_Cmd(CMD_DISK_R_SENSE); /* 獲取USB存儲器的容量 */
  221.     status=CH375_Wait_Int();                 /* 等待中斷并獲取狀態(tài) */
  222.     if(status!=USB_INT_SUCCESS)            /* 出現(xiàn)錯誤 */
  223.     return 1;
  224.    }
  225. }
  226. }

  227. /******************************************************************
  228. - 功能描述:寫U盤的扇區(qū)
  229. - 隸屬模塊:CH375模塊
  230. - 函數(shù)屬性:外部,供用戶調(diào)用
  231. - 參數(shù)說明:addr:扇區(qū)地址
  232.              pbuf:指向數(shù)據(jù)緩沖區(qū)的指針
  233. - 返回說明:返回操作結(jié)果,如果為0說明操作成功,
  234.                            如果為1說明操作失敗
  235. ******************************************************************/

  236. unsigned char CH375_Write_Sector(unsigned long addr,unsigned char *pBuf)
  237. {
  238. unsigned char i=0;
  239. unsigned char status,len;
  240. CH375_Write_Cmd(CMD_DISK_WRITE);//磁盤寫 命令
  241. CH375_Write_Dat(addr);
  242. CH375_Write_Dat(addr>>8);
  243. CH375_Write_Dat(addr>>16);
  244. CH375_Write_Dat(addr>>24);        //寫入32位的扇區(qū)地址,先送低字節(jié)
  245. CH375_Write_Dat(1); //送入扇區(qū)數(shù)

  246. for(i=0;i<8;i++)
  247. {
  248.   status=CH375_Wait_Int();
  249.   if(status==USB_INT_DISK_WRITE)
  250.   {
  251.    CH375_Write_Cmd(CMD_WR_USB_DATA7);
  252.    len=64;
  253.    CH375_Write_Dat(len);
  254.    do
  255.    {
  256.     CH375_Write_Dat(*pBuf);
  257.         pBuf++;
  258.    }while(--len);
  259.    CH375_Write_Cmd(CMD_DISK_WR_GO);
  260.   }
  261.   else
  262.   {
  263.    return 1;
  264.   }
  265. }
  266. status=CH375_Wait_Int();
  267. if(status==USB_INT_SUCCESS) //如果狀態(tài)碼為USB_INT_SUCCESS,說明寫扇區(qū)成功,返回0
  268. {
  269.   return 0;
  270. }
  271. else
  272. {
  273.   return 1;  
  274. }
  275. }
復(fù)制代碼

全部資料51hei下載地址:
U盤例程+電路圖.rar (2.05 MB, 下載次數(shù): 405)


評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏16 分享淘帖 頂1 踩
回復(fù)

使用道具 舉報

來自 2#
ID:709781 發(fā)表于 2020-9-18 20:21 | 只看該作者
大家好,在CH375寫數(shù)據(jù)到U盤,如何實現(xiàn)將字符串和變化的時間值寫入U盤中,比如說字符串是“當前時間值為:”,變化的時間為小時、分鐘和秒,即寫入U盤例子為:  當前時間值為:  12:30:15,請指點下,在此先謝謝了
回復(fù)

使用道具 舉報

板凳
ID:497810 發(fā)表于 2019-9-5 12:38 | 只看該作者
下載下來 學習一下!
回復(fù)

使用道具 舉報

地板
ID:72951 發(fā)表于 2019-9-18 11:06 | 只看該作者
謝謝分享,學習USB了
回復(fù)

使用道具 舉報

5#
ID:138119 發(fā)表于 2019-9-18 21:59 | 只看該作者
不錯,學習好資料!
回復(fù)

使用道具 舉報

6#
ID:111376 發(fā)表于 2019-9-19 08:46 | 只看該作者
謝謝分享,學習了!
回復(fù)

使用道具 舉報

7#
ID:511456 發(fā)表于 2019-10-10 10:09 | 只看該作者
這個例程非常好,可以用于對設(shè)備數(shù)據(jù)的讀寫中,實用性強
回復(fù)

使用道具 舉報

8#
ID:611525 發(fā)表于 2019-11-5 15:25 | 只看該作者

這個例程非常好,可以用于對設(shè)備數(shù)據(jù)的讀寫中,實用性強
回復(fù)

使用道具 舉報

9#
ID:321614 發(fā)表于 2019-11-6 20:43 | 只看該作者
可以,學習中,這個例程很好
回復(fù)

使用道具 舉報

10#
ID:279058 發(fā)表于 2019-11-19 15:04 | 只看該作者
這個可以用znfat操作U盤嗎?
回復(fù)

使用道具 舉報

11#
ID:130230 發(fā)表于 2019-12-2 11:40 | 只看該作者
666有視頻講解不
回復(fù)

使用道具 舉報

12#
ID:527324 發(fā)表于 2020-3-29 10:23 來自手機 | 只看該作者
今天下載不少好東西了。沒黑幣了趕緊去賺點
回復(fù)

使用道具 舉報

13#
ID:240901 發(fā)表于 2020-6-3 16:09 | 只看該作者

謝謝分享,學習USB了
回復(fù)

使用道具 舉報

14#
ID:858595 發(fā)表于 2020-12-11 11:29 來自手機 | 只看該作者
這個用連接單片機實驗箱
回復(fù)

使用道具 舉報

15#
ID:907595 發(fā)表于 2021-4-17 22:29 來自手機 | 只看該作者
滴,請問這個能制作出來實物嗎
回復(fù)

使用道具 舉報

16#
ID:749848 發(fā)表于 2021-4-20 00:34 | 只看該作者
i不知道如何制作成品
回復(fù)

使用道具 舉報

17#
ID:927526 發(fā)表于 2021-5-26 20:22 | 只看該作者
謝謝分享,學習USB了
回復(fù)

使用道具 舉報

18#
ID:967573 發(fā)表于 2021-9-22 20:17 | 只看該作者
謝謝分享,學習USB了
回復(fù)

使用道具 舉報

19#
ID:983266 發(fā)表于 2021-12-6 10:30 | 只看該作者
這個確實是好東西,有時間,多研究看看,現(xiàn)在我是用TF卡的SPI模式寫數(shù)據(jù)的,后面用這個方法試試
回復(fù)

使用道具 舉報

20#
ID:804869 發(fā)表于 2022-3-4 10:57 | 只看該作者
用我們這邊的說法就是,大佬
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表