找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

stm32f103驅(qū)動ch375b可讀寫優(yōu)盤扇區(qū),可測優(yōu)盤容量,源程序測試通過

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:955625 發(fā)表于 2021-7-22 16:13 | 只看該作者 回帖獎勵 |倒序?yàn)g覽 |閱讀模式
實(shí)驗(yàn)器材:
        MiniSTM32F103開發(fā)板V3版本
      
實(shí)驗(yàn)?zāi)康?
        STM32F103RC+CH375B模塊讀寫優(yōu)盤或SD卡,可實(shí)現(xiàn)單個扇區(qū)讀寫或多個連續(xù)扇區(qū)讀寫數(shù)據(jù)。
可獲取磁盤容量
      
硬件資源:
        1,串口1(波特率:9600,PA9/PA10連接在板載USB轉(zhuǎn)串口芯片CH340上面)
      
實(shí)驗(yàn)現(xiàn)象:
        如果讀寫的數(shù)據(jù)匹配,PD2上的LED點(diǎn)亮,否則LED不亮
        串口調(diào)試助手會打印各種初始化狀態(tài)和讀取到的數(shù)據(jù)
      
注意事項(xiàng):
        有些優(yōu)盤可能會初始化失敗,建議先給單片機(jī)上電,再插入優(yōu)盤。如果還不行,則復(fù)位單片機(jī)


要先上電,再插入優(yōu)盤

STM32單片機(jī)源程序如下:
  1. #include "sys.h"
  2. #include "delay.h"
  3. #include "usart.h"
  4. #include  "ch375.h"
  5. #include  "led.h"



  6. #define ADDR 100//6600000//100         //要操作的U盤的扇區(qū)地址 物理扇區(qū)地址,用winhex打開物理磁盤可查看扇區(qū)地址數(shù)據(jù)

  7. u8 flag1=0;
  8. u8 Write_pbuf[512];   //數(shù)據(jù)緩沖區(qū)
  9. u8 Read_pbuf[2048];
  10. u8 status=0xff; //初始化狀態(tài)標(biāo)志

  11. //測試內(nèi)容:在優(yōu)盤或TF卡內(nèi)ADDR地址開始,連續(xù)寫4個扇區(qū)數(shù)據(jù),再從ADDR處連續(xù)讀4個扇區(qū)數(shù)據(jù)進(jìn)行匹配,驗(yàn)證數(shù)據(jù)是否正確
  12. //可獲取優(yōu)盤或TF卡容量

  13. //注意:要先上電,再插入優(yōu)盤
  14. int main(void)
  15. {
  16.         u16 i=0;         
  17.         delay_init();                     //延時(shí)函數(shù)初始化         
  18.         LED_Init();
  19.         
  20.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //設(shè)置NVIC中斷分組2:2位搶占優(yōu)先級,2位響應(yīng)優(yōu)先級
  21.         uart_init(9600);         //串口初始化為9600        
  22.         printf("串口設(shè)置完畢\r\n");
  23.         delay_ms(100); //內(nèi)部電源上電的復(fù)位時(shí)間最大為40ms,這里延時(shí)一段時(shí)間防止出現(xiàn)CH375初始化失敗
  24.         CH375_GPIO_Init(); //初始化CH375B控制端口和數(shù)據(jù)端口 WR、RD、CS、A0、INT和P0~P7
  25.         CH375_WR_CMD(CMD_GET_IC_VER);  // 獲取芯片及固件版本
  26.         status=CH375_RD_DAT();  // 版本
  27.         printf("芯片版本為:%#x\r\n",status);
  28.         status=CH375Init(); //初始化CH375芯片,成功返回0,失敗返回1
  29.         printf("CH375芯片初始化值:%#x\r\n",status);
  30.         CH375_WR_CMD(CMD_DISK_MAX_LUN);  // 獲取USB存儲設(shè)備的最大邏輯單元號
  31.         status=CH375_RD_DAT();  // 最大邏輯單元號
  32.          printf("USB存儲設(shè)備的最大邏輯單元號為:%#x\r\n",status);
  33.         //status=InitDisk();         //初始化U盤,初始化成功返回0,不成功返回錯誤代碼 優(yōu)盤要上電后重新插拔一次再復(fù)位才能成功。SD卡不用
  34.          //注意:要先上電,再插入優(yōu)盤
  35.          status=CH375_InitDisk(); //成功 金士頓8G USB2.0優(yōu)盤 東芝16G USB3.0優(yōu)盤上電后插入初始化成功,,SD卡可不用插拔
  36.          printf("U盤初始化值:%#x\r\n",status);
  37.          status=Get_CH375DiskSize();//打印磁盤容量,單位MByte
  38.         for(i=0;i<512;i++)
  39.                 Write_pbuf[i]=i;//0x55;//           //向數(shù)據(jù)緩沖區(qū)中寫入0~255 0~255,共512個字節(jié)
  40.         printf("向緩沖區(qū)中裝入完畢\r\n");
  41.         //CH375WriteSector(ADDR+2,Write_pbuf);//將數(shù)據(jù)緩沖區(qū)中的512個字節(jié)的數(shù)據(jù)寫入U(xiǎn)盤的第ADDR扇區(qū)中 單個扇區(qū)寫數(shù)據(jù)
  42.         CH375_WriteDisk(Write_pbuf,ADDR,4); //連續(xù)寫多個扇區(qū)數(shù)據(jù)
  43.         printf("寫 U盤扇區(qū)完畢\r\n");

  44.         for(i=0;i<2048;i++) //清空接收數(shù)據(jù)緩沖區(qū)
  45.         {
  46.                 Read_pbuf[i]=0;
  47.         }
  48.         printf("清空接收緩沖區(qū)完畢\r\n");
  49.         //CH375ReadSector(ADDR+1,Read_pbuf);//從U盤的第ADDR扇區(qū)中讀取512個字節(jié)的數(shù)據(jù)到數(shù)據(jù)緩沖區(qū)    單個扇區(qū)讀數(shù)據(jù)
  50.         CH375_ReadDisk(Read_pbuf,ADDR,4);  //連續(xù)讀多個扇區(qū)數(shù)據(jù)
  51.         //查看讀取到的幾個扇區(qū)數(shù)據(jù)
  52.                 for(i=0;i<10;i++)
  53.         {
  54.                 printf("讀取到的扇區(qū)數(shù)據(jù)為:i=%d   Read_pbuf[i]=%#x\r\n",i,Read_pbuf[i]);
  55.         }
  56.         for(i=520;i<530;i++)
  57.         {
  58.                 printf("讀取到的扇區(qū)數(shù)據(jù)為:i=%d   Read_pbuf[i]=%#x\r\n",i,Read_pbuf[i]);
  59.         }
  60.                 for(i=1030;i<1040;i++)
  61.         {
  62.                 printf("讀取到的扇區(qū)數(shù)據(jù)為:i=%d   Read_pbuf[i]=%#x\r\n",i,Read_pbuf[i]);
  63.         }
  64.                         for(i=1600;i<1610;i++)
  65.         {
  66.                 printf("讀取到的扇區(qū)數(shù)據(jù)為:i=%d   Read_pbuf[i]=%#x\r\n",i,Read_pbuf[i]);
  67.         }
  68.         printf("讀 U盤扇區(qū)完畢\r\n");

  69.         for(i=0;i<512;i++)
  70.         {
  71.                 if(Write_pbuf[i]!=Read_pbuf[i])  //對讀出的數(shù)據(jù)進(jìn)行匹配,如果不吻合則flag=1,否則flag=0
  72.                 {
  73.                         flag1=1;   //數(shù)據(jù)不吻合,flag1=1;
  74.                                 break;
  75.                 }
  76.         }
  77.         printf("匹配完畢\r\n");

  78.         for(i=0;i<512;i++) //清空發(fā)送數(shù)據(jù)緩沖區(qū)
  79.         {
  80.                 Write_pbuf[i]=0;
  81. //printf("扇區(qū)數(shù)據(jù)為:%#x\n",Write_pbuf[i]);         
  82.         }
  83.         
  84.         if(flag1)
  85.         {
  86.                 LED=1; //發(fā)光二極管滅
  87.                 printf("U盤扇區(qū)讀寫測試失敗!\r\n"); //數(shù)據(jù)不吻合
  88.         }
  89.         else
  90.         {         
  91.                 LED=0; //發(fā)光二極管點(diǎn)亮
  92.                 printf("U盤扇區(qū)讀寫測試成功!\r\n"); //數(shù)據(jù)吻合
  93.         }
  94.         printf("------------------------------------\r\n");
  95. while(1){
  96.         }
  97. }
復(fù)制代碼

所有資料51hei提供下載:
stm32f103驅(qū)動ch375b可讀寫優(yōu)盤扇區(qū),可測優(yōu)盤容量,測試通過.7z (214.63 KB, 下載次數(shù): 27)


評分

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

查看全部評分

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

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

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