久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 15166|回復(fù): 19
收起左側(cè)

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

  [復(fù)制鏈接]
ID:485624 發(fā)表于 2019-4-11 10:27 | 顯示全部樓層 |閱讀模式
運(yùn)行環(huán)境:STC51 1T單片機(jī) 22.1184M晶振 (建議使用STC12C5A60S2 或 STC89C58)
代碼介紹:

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

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

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

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

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

電路原理圖如下:
QQ截圖20190411102510.png QQ截圖20190411102527.png

單片機(jī)源程序如下:
  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án)禁隨意用于商業(yè)目的
  11.          振南電子
  12.                             WW:yzn07
  13.   注:本程序?yàn)镮O方式,即使用單片機(jī)的IO模擬時(shí)序來驅(qū)動(dòng)CH375
  14.       IO方式便于移植。其實(shí)IO在模擬外部總線的時(shí)序,對于沒有
  15.           外部總線的單片機(jī),可以參考此程序。模擬時(shí)序,在速度上
  16.           不及硬件的外部總線。在操作U盤的時(shí)候,對操作速度有一定
  17.           要求。
  18.           這是振南在長期對CH375的研究中,得到的經(jīng)驗(yàn),請借鑒!!                                  
  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); //稍作延時(shí)
  30. CH375_CS=0; //打開片選
  31. CH375_A0=1; //命令模式
  32. DATA_PORT=cmd;        //輸出命令碼
  33. CH375_WR=0; //打開寫使能
  34. delay(DELAYTIME); //稍作延時(shí)
  35. CH375_WR=1; //關(guān)閉寫使能
  36. CH375_CS=1; //關(guān)閉片選
  37. CH375_A0=1; //恢復(fù)A0為高電平
  38. delay(DELAYTIME); //稍作延時(shí)
  39. }

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

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

  60. /******************************************************************
  61. - 功能描述:從CH375讀取一個(gè)字節(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單片機(jī)IO作輸入,先置高
  74. delay(DELAYTIME); //稍作延時(shí)
  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);  /* 模式代碼,自動(dòng)檢測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出錯(cuò),例如芯片型號錯(cuò)或者處于串口方式或者不支持 */
  117. }


  118. /******************************************************************
  119. - 功能描述:初始化磁盤
  120. - 隸屬模塊:CH375模塊
  121. - 函數(shù)屬性:外部,供用戶調(diào)用
  122. - 參數(shù)說明:無
  123. - 返回說明:操作結(jié)果,0表示初始化磁盤成功
  124.                        1表示初始化磁盤失敗
  125. - 注:在使用U盤之前,先要調(diào)用此函數(shù),此函數(shù)將進(jìn)行判斷
  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)錯(cuò)誤 */
  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é),所以讀取一個(gè)扇區(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ā)生錯(cuò)誤
  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會(huì)將下面64個(gè)字節(jié)放入緩沖區(qū),等待單片機(jī)來讀
  205.    }
  206.    else
  207.    {
  208.     return 1; //發(fā)生錯(cuò)誤,返回狀態(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)錯(cuò)誤 */
  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 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評分

回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

ID:497810 發(fā)表于 2019-9-5 12:38 | 顯示全部樓層
下載下來 學(xué)習(xí)一下!
回復(fù)

使用道具 舉報(bào)

ID:72951 發(fā)表于 2019-9-18 11:06 | 顯示全部樓層
謝謝分享,學(xué)習(xí)USB了
回復(fù)

使用道具 舉報(bào)

ID:138119 發(fā)表于 2019-9-18 21:59 | 顯示全部樓層
不錯(cuò),學(xué)習(xí)好資料!
回復(fù)

使用道具 舉報(bào)

ID:111376 發(fā)表于 2019-9-19 08:46 | 顯示全部樓層
謝謝分享,學(xué)習(xí)了!
回復(fù)

使用道具 舉報(bào)

ID:511456 發(fā)表于 2019-10-10 10:09 | 顯示全部樓層
這個(gè)例程非常好,可以用于對設(shè)備數(shù)據(jù)的讀寫中,實(shí)用性強(qiáng)
回復(fù)

使用道具 舉報(bào)

ID:611525 發(fā)表于 2019-11-5 15:25 | 顯示全部樓層

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

使用道具 舉報(bào)

ID:321614 發(fā)表于 2019-11-6 20:43 | 顯示全部樓層
可以,學(xué)習(xí)中,這個(gè)例程很好
回復(fù)

使用道具 舉報(bào)

ID:279058 發(fā)表于 2019-11-19 15:04 | 顯示全部樓層
這個(gè)可以用znfat操作U盤嗎?
回復(fù)

使用道具 舉報(bào)

ID:130230 發(fā)表于 2019-12-2 11:40 | 顯示全部樓層
666有視頻講解不
回復(fù)

使用道具 舉報(bào)

ID:527324 發(fā)表于 2020-3-29 10:23 來自手機(jī) | 顯示全部樓層
今天下載不少好東西了。沒黑幣了趕緊去賺點(diǎn)
回復(fù)

使用道具 舉報(bào)

ID:240901 發(fā)表于 2020-6-3 16:09 | 顯示全部樓層

謝謝分享,學(xué)習(xí)USB了
回復(fù)

使用道具 舉報(bào)

ID:858595 發(fā)表于 2020-12-11 11:29 來自手機(jī) | 顯示全部樓層
這個(gè)用連接單片機(jī)實(shí)驗(yàn)箱
回復(fù)

使用道具 舉報(bào)

ID:907595 發(fā)表于 2021-4-17 22:29 來自手機(jī) | 顯示全部樓層
滴,請問這個(gè)能制作出來實(shí)物嗎
回復(fù)

使用道具 舉報(bào)

ID:749848 發(fā)表于 2021-4-20 00:34 | 顯示全部樓層
i不知道如何制作成品
回復(fù)

使用道具 舉報(bào)

ID:927526 發(fā)表于 2021-5-26 20:22 | 顯示全部樓層
謝謝分享,學(xué)習(xí)USB了
回復(fù)

使用道具 舉報(bào)

ID:967573 發(fā)表于 2021-9-22 20:17 | 顯示全部樓層
謝謝分享,學(xué)習(xí)USB了
回復(fù)

使用道具 舉報(bào)

ID:983266 發(fā)表于 2021-12-6 10:30 | 顯示全部樓層
這個(gè)確實(shí)是好東西,有時(shí)間,多研究看看,現(xiàn)在我是用TF卡的SPI模式寫數(shù)據(jù)的,后面用這個(gè)方法試試
回復(fù)

使用道具 舉報(bào)

ID:804869 發(fā)表于 2022-3-4 10:57 | 顯示全部樓層
用我們這邊的說法就是,大佬
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚洲一区视频在线 | 51ⅴ精品国产91久久久久久 | 91在线第一页 | 亚洲一二三区av | 亚洲欧美高清 | 一级毛毛片 | 久久久久久久一区二区三区 | 丝袜 亚洲 欧美 日韩 综合 | 99精品国产成人一区二区 | 97在线播放| 亚州精品天堂中文字幕 | 黑人巨大精品欧美一区二区免费 | 欧美性受xxxx白人性爽 | 欧美成年黄网站色视频 | 国产精品美女视频 | 一区二区三区国产精品 | 亚洲午夜小视频 | 一级毛片视频在线 | 色视频在线播放 | 日韩中文字幕 | 中国黄色毛片视频 | 久久国产成人 | www312aⅴ欧美在线看 | 久久国产精品网 | 在线一区视频 | 狠狠做深爱婷婷综合一区 | 一区在线视频 | 国产乱码一区 | 欧产日产国产精品v | 一级在线| 日本精品一区二区 | 91福利网| 国产美女精品 | 欧美性猛交一区二区三区精品 | 在线三级网址 | 北条麻妃一区二区三区在线观看 | 中国一级大毛片 | 国产一区二区三区免费观看在线 | 日本一区二区影视 | 91看片在线观看 | 午夜国产在线 |