欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: 51單片機+CH375讀寫U盤例程+電路原理圖 [打印本頁]

作者: w812903486    時間: 2019-4-11 10:27
標題: 51單片機+CH375讀寫U盤例程+電路原理圖
運行環境:STC51 1T單片機 22.1184M晶振 (建議使用STC12C5A60S2 或 STC89C58)
代碼介紹:

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

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

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

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

五:CH375對U盤的扇區級文件操作。

電路原理圖如下:


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

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

  20. /******************************************************************
  21. - 功能描述:向CH375寫入命令
  22. - 隸屬模塊:CH375模塊
  23. - 函數屬性:內部
  24. - 參數說明: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; //關閉寫使能
  36. CH375_CS=1; //關閉片選
  37. CH375_A0=1; //恢復A0為高電平
  38. delay(DELAYTIME); //稍作延時
  39. }

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

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

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

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

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

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

  95. /******************************************************************
  96. - 功能描述:初始化CH375芯片
  97. - 隸屬模塊:CH375模塊
  98. - 函數屬性:外部,供用戶調用
  99. - 參數說明:無
  100. - 返回說明:執行結果
  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);  /* 設置USB工作模式 */
  109. CH375_Write_Dat(6);  /* 模式代碼,自動檢測USB設備連接 */

  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. - 函數屬性:外部,供用戶調用
  122. - 參數說明:無
  123. - 返回說明:操作結果,0表示初始化磁盤成功
  124.                        1表示初始化磁盤失敗
  125. - 注:在使用U盤之前,先要調用此函數,此函數將進行判斷
  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設備斷開 */

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

  140. while(1)         //以下代碼均源自沁恒的官方U盤初始化函數,借用它可以提高對U盤的兼容性!
  141. {   
  142.   j++;
  143.   CH375_Write_Cmd(CMD_DISK_SIZE);  /* 獲取USB存儲器的容量 */
  144.   status=CH375_Wait_Int();             /* 等待中斷并獲取狀態 */
  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();                 /* 等待中斷并獲取狀態 */
  152.    if(status==USB_INT_SUCCESS)            /* 出現錯誤 */
  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();                 /* 等待中斷并獲取狀態 */
  164.   if(status==USB_INT_SUCCESS)
  165.    return 0;                           /* U盤已經成功初始化 */
  166. }
  167. return 1;
  168. }

  169. /******************************************************************
  170. - 功能描述:讀取U盤的扇區
  171. - 隸屬模塊:CH375模塊
  172. - 函數屬性:外部,供用戶調用
  173. - 參數說明:addr:扇區地址
  174.              pbuf:指向數據緩沖區的指針
  175. - 返回說明:返回操作結果,如果為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位扇區地址
  191.   CH375_Write_Dat(1); //送入扇區數

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

  211.   status=CH375_Wait_Int(); //讀取8次以后,最后一次送入繼續讀數據的命令,等待CH375產生中斷信號,并讀取狀態
  212.   if(status==USB_INT_SUCCESS) //如果狀態碼為USB_INT_SUCCESS,說明讀取扇區成功,返回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();                 /* 等待中斷并獲取狀態 */
  222.     if(status!=USB_INT_SUCCESS)            /* 出現錯誤 */
  223.     return 1;
  224.    }
  225. }
  226. }

  227. /******************************************************************
  228. - 功能描述:寫U盤的扇區
  229. - 隸屬模塊:CH375模塊
  230. - 函數屬性:外部,供用戶調用
  231. - 參數說明:addr:扇區地址
  232.              pbuf:指向數據緩沖區的指針
  233. - 返回說明:返回操作結果,如果為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位的扇區地址,先送低字節
  245. CH375_Write_Dat(1); //送入扇區數

  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) //如果狀態碼為USB_INT_SUCCESS,說明寫扇區成功,返回0
  268. {
  269.   return 0;
  270. }
  271. else
  272. {
  273.   return 1;  
  274. }
  275. }
復制代碼

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



作者: zhenglin_1987    時間: 2019-9-5 12:38
下載下來 學習一下!
作者: em78447    時間: 2019-9-18 11:06
謝謝分享,學習USB了
作者: yfpc2006    時間: 2019-9-18 21:59
不錯,學習好資料!
作者: stlong    時間: 2019-9-19 08:46
謝謝分享,學習了!
作者: zhanghua20112    時間: 2019-10-10 10:09
這個例程非常好,可以用于對設備數據的讀寫中,實用性強
作者: lllbp    時間: 2019-11-5 15:25

這個例程非常好,可以用于對設備數據的讀寫中,實用性強
作者: moyst    時間: 2019-11-6 20:43
可以,學習中,這個例程很好
作者: wuzhanxiang    時間: 2019-11-19 15:04
這個可以用znfat操作U盤嗎?
作者: jizhongbiao    時間: 2019-12-2 11:40
666有視頻講解不
作者: abcdefbcdef    時間: 2020-3-29 10:23
今天下載不少好東西了。沒黑幣了趕緊去賺點
作者: krstc    時間: 2020-6-3 16:09

謝謝分享,學習USB了
作者: SINFLY2020    時間: 2020-9-18 20:21
大家好,在CH375寫數據到U盤,如何實現將字符串和變化的時間值寫入U盤中,比如說字符串是“當前時間值為:”,變化的時間為小時、分鐘和秒,即寫入U盤例子為:  當前時間值為:  12:30:15,請指點下,在此先謝謝了
作者: Zag    時間: 2020-12-11 11:29
這個用連接單片機實驗箱
作者: 我的天吶怎么辦    時間: 2021-4-17 22:29
滴,請問這個能制作出來實物嗎
作者: bbzhu5039763    時間: 2021-4-20 00:34
i不知道如何制作成品
作者: jiquanxiang    時間: 2021-5-26 20:22
謝謝分享,學習USB了
作者: say123    時間: 2021-9-22 20:17
謝謝分享,學習USB了
作者: saint_lee1986    時間: 2021-12-6 10:30
這個確實是好東西,有時間,多研究看看,現在我是用TF卡的SPI模式寫數據的,后面用這個方法試試
作者: tokfc    時間: 2022-3-4 10:57
用我們這邊的說法就是,大佬




歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1