找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

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

單片機(jī)軟件SPI和硬件SPI讀寫SD卡,TF卡測(cè)試程序

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:658665 發(fā)表于 2020-4-26 23:24 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
軟件SPI和硬件SPI讀寫SD卡,TF卡測(cè)試程序
SD卡模塊和SD卡



軟件SPI讀寫SD卡程序
測(cè)試平臺(tái):STC89C516和STC12C5A60S2
內(nèi)存卡大小:128MB和2GB
晶振:均為12MHz

硬件SPI讀寫SD卡程序
測(cè)試平臺(tái):STC12C5A60S2
內(nèi)存卡大小:128MB和2GB
晶振:12MHz
(89C52沒有硬件SPI)


為了盡可能的不給后來者留坑,這些代碼我在發(fā)出來之前反復(fù)測(cè)試過,確保無誤,
還有就是關(guān)于SD卡程序的讀寫我在程序中寫的很清楚,這里不再贅述

單片機(jī)源程序如下:
  1. #include "public.h"
  2. #include "SD.h"

  3. //測(cè)試平臺(tái):STC89C516和STC12C5A60S2
  4. //內(nèi)存卡大小:128MB和2GB
  5. //晶振:均為12MHz

  6. void main()
  7. {
  8.         unsigned int i;

  9.         SD_init();//SD卡初始化
  10.        
  11.         for(i=0;i<512;++i) BUFFER_DATA[i]=0x7F;
  12.         MCU_write_SD_512Byte(960,512);//MCU向SD卡寫入數(shù)據(jù),一次最多512字節(jié)(扇區(qū),數(shù)據(jù)長(zhǎng)度(最大為512,建議填512))
  13.        
  14.         MCU_read_SD_512Byte(960,512);//MCU向SD卡讀取數(shù)據(jù),一次最多512字節(jié)(扇區(qū),數(shù)據(jù)長(zhǎng)度(最大為512,建議填512))
  15.         P0=BUFFER_DATA[0];
  16.        
  17.         while(1);
  18. }

  19. /*
  20.         unsigned int i;
  21.        
  22.         SD_init();//SD卡初始化
  23.        
  24.         {
  25.                 在使用SD卡模塊前,先初始化SD卡
  26.         }
  27.        
  28.         for(i=0;i<512;++i) BUFFER_DATA[i]=0x7F;
  29.         MCU_write_SD_512Byte(960,512);//MCU向SD卡寫入數(shù)據(jù),一次最多512字節(jié)(扇區(qū),數(shù)據(jù)長(zhǎng)度(最大為512,建議填512))
  30.        
  31.         {
  32.                 將數(shù)據(jù)寫入到SD卡:
  33.                 先將數(shù)據(jù)寫入到數(shù)據(jù)緩沖數(shù)組BUFFER_DATA中(這里的數(shù)據(jù)我全部都寫0x7F),
  34.                 然后運(yùn)行MCU_write_SD_512Byte(960,512);
  35.                 960為SD卡的扇區(qū),表示將數(shù)據(jù)寫入到SD卡的960扇區(qū),512為一次性寫入的數(shù)據(jù)大小,為512字節(jié),建議填512字節(jié),
  36.                 因?yàn)?個(gè)扇區(qū)的大小為512字節(jié)
  37.         }
  38.        
  39.         MCU_read_SD_512Byte(960,512);//MCU向SD卡讀取數(shù)據(jù),一次最多512字節(jié)(扇區(qū),數(shù)據(jù)長(zhǎng)度(最大為512,建議填512))
  40.         P0=BUFFER_DATA[0];
  41.        
  42.         {
  43.                 從SD卡讀取數(shù)據(jù):
  44.                 先運(yùn)行MCU_read_SD_512Byte(960,512);
  45.                 這里的960為你要讀的SD扇區(qū),512位一次性讀取的數(shù)據(jù)大小,為512字節(jié),建議填512字節(jié),因?yàn)?個(gè)扇區(qū)的大小為512字節(jié)
  46.                 完成后數(shù)據(jù)存放在數(shù)據(jù)緩沖數(shù)組BUFFER_DATA中
  47.                
  48.                 因?yàn)闆]有現(xiàn)象的話不好判斷SD卡讀寫是否成功,所以把P0BUFFER_DATA[0]賦給P0,P0接LED燈,就可以看見現(xiàn)象了
  49.         }

  50.         {
  51.                 注意:將程序下載到開發(fā)板后可能會(huì)出現(xiàn)P0口顯示的數(shù)據(jù)和SD卡寫入數(shù)據(jù)不一致的情況
  52.                 這時(shí),
  53.                         要將開發(fā)板和SD卡模塊斷電
  54.                         要將開發(fā)板和SD卡模塊斷電
  55.                         要將開發(fā)板和SD卡模塊斷電
  56.                         不是復(fù)位
  57.                         不是復(fù)位
  58.                         不是復(fù)位
  59.                 將開發(fā)板斷電后再上電,就可以看見現(xiàn)象了
  60.                 如果還不成功,
  61.                         檢查連線是否正確
  62.                         檢查連線是否正確
  63.                         檢查連線是否正確
  64.                 或嘗試插拔SD卡
  65.                
  66.                 SD卡讀寫成功后,可以修改扇區(qū)和SD的寫入數(shù)據(jù)多實(shí)驗(yàn)幾次,確保萬無一失
  67.         }
  68. */
復(fù)制代碼

所有資料51hei提供下載:
單片機(jī)讀寫SD卡.rar (78.27 KB, 下載次數(shù): 464)

沒有積分的可從這里下載
鏈接:
游客,本帖隱藏的內(nèi)容需要積分高于 1 才可瀏覽,您當(dāng)前積分為 0



評(píng)分

參與人數(shù) 4黑幣 +65 收起 理由
小當(dāng) + 5
13487086265 + 5 絕世好帖!
1679079206 + 5 贊一個(gè)!
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

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

使用道具 舉報(bào)

沙發(fā)
ID:276663 發(fā)表于 2020-4-27 08:57 | 只看該作者
多謝分享,這些都是對(duì)新手最大的幫助。
回復(fù)

使用道具 舉報(bào)

板凳
ID:586074 發(fā)表于 2020-5-4 11:02 | 只看該作者
標(biāo)記一個(gè),有時(shí)間再來詳細(xì)拜讀。謝謝樓主分享
回復(fù)

使用道具 舉報(bào)

地板
ID:259035 發(fā)表于 2020-10-14 12:21 | 只看該作者
多謝分享,這些都是對(duì)新手很好的。。贊
回復(fù)

使用道具 舉報(bào)

5#
ID:834302 發(fā)表于 2020-10-25 14:11 | 只看該作者
感謝分享,正在研究SD卡
回復(fù)

使用道具 舉報(bào)

6#
ID:382699 發(fā)表于 2020-11-14 11:40 | 只看該作者
非常感謝,終于找到一個(gè)可以用的程序了
回復(fù)

使用道具 舉報(bào)

7#
ID:705471 發(fā)表于 2020-11-17 21:55 | 只看該作者
正用上,參考了。謝謝。
回復(fù)

使用道具 舉報(bào)

8#
ID:495990 發(fā)表于 2021-2-22 22:49 | 只看該作者
樓主: "SD.h"頭文件可以下載還是需要自己制作呢?
回復(fù)

使用道具 舉報(bào)

9#
ID:658665 發(fā)表于 2021-2-23 09:51 | 只看該作者
SJ-123 發(fā)表于 2021-2-22 22:49
樓主: "SD.h"頭文件可以下載還是需要自己制作呢?

單片機(jī)讀寫SD卡.rar

78.27 KB, 下載次數(shù): 16, 下載積分: 黑幣 -5

回復(fù)

使用道具 舉報(bào)

10#
ID:718536 發(fā)表于 2021-6-22 13:10 | 只看該作者
感謝大佬的無私分享。感謝!愛你喔
回復(fù)

使用道具 舉報(bào)

11#
ID:908826 發(fā)表于 2021-9-5 10:17 | 只看該作者
我有一點(diǎn) 想問一下,比如這個(gè)扇區(qū)寫滿512,再寫下一個(gè)的時(shí)候時(shí)候自動(dòng)進(jìn)入下一個(gè)扇區(qū)還是覆蓋本扇區(qū)呢?
回復(fù)

使用道具 舉報(bào)

12#
ID:983266 發(fā)表于 2021-11-21 23:21 | 只看該作者
13205495918 發(fā)表于 2021-9-5 10:17
我有一點(diǎn) 想問一下,比如這個(gè)扇區(qū)寫滿512,再寫下一個(gè)的時(shí)候時(shí)候自動(dòng)進(jìn)入下一個(gè)扇區(qū)還是覆蓋本扇區(qū)呢?

你搞定TF卡操作了嗎?
回復(fù)

使用道具 舉報(bào)

13#
ID:983266 發(fā)表于 2021-11-22 00:09 | 只看該作者
        while(response)
        {
                SD_CS=1;
                SPI_write_Byte(0xFF);
                SD_CS=0;
                MCU_write_SD_command(0x01,0x00FFC000,0xFF);
                response=SD_response();
        }
我測(cè)試了新買的8G,32G內(nèi)存卡,都卡在了這個(gè)地方,無法初始化,但是用之前的32g的,1g,2g的都正常,不知道是哪里問題,新的卡不支持SPI模式嗎?
回復(fù)

使用道具 舉報(bào)

14#
ID:513213 發(fā)表于 2021-11-22 14:06 | 只看該作者
saint_lee1986 發(fā)表于 2021-11-22 00:09
while(response)
        {
                SD_CS=1;

時(shí)格式化的格式不一樣嗎?
回復(fù)

使用道具 舉報(bào)

15#
ID:983266 發(fā)表于 2021-11-24 07:21 | 只看該作者
lsh04 發(fā)表于 2021-11-22 14:06
時(shí)格式化的格式不一樣嗎?

還有個(gè)問題請(qǐng)教你一下,關(guān)于讀寫時(shí),切換block問題,0x58,0x00,0x00,0x00,0x00,0xff,這是寫第一個(gè)block地址,如果要讀下一個(gè),是要將地址改為:0x58,0x00,0x00,0x02,0x00,0xff?是這樣嗎
回復(fù)

使用道具 舉報(bào)

16#
ID:972156 發(fā)表于 2021-11-24 15:45 | 只看該作者
太棒了!找了好久終于找到了!
回復(fù)

使用道具 舉報(bào)

17#
ID:830688 發(fā)表于 2022-2-25 17:19 | 只看該作者
你好,感謝分享。你那個(gè)“檢測(cè)SD卡響應(yīng)”的函數(shù)不怎么管用,改成如下好多了。
//檢測(cè)SD卡的響應(yīng)————返回0xFF,沒檢測(cè)到;反之檢測(cè)到
u8 SD_response()
{
        u8 i;
        u8 response = 0xFF;

        for(i=0;i<9;++i)
        {
                response=SPI_read_Byte();
                if((response==0x00)||(response==0x01))
                        return response;
        }
        return response;
}
回復(fù)

使用道具 舉報(bào)

18#
ID:961457 發(fā)表于 2022-6-3 23:16 | 只看該作者
謝謝樓主,很有幫助
回復(fù)

使用道具 舉報(bào)

19#
ID:1039438 發(fā)表于 2023-2-28 10:20 | 只看該作者
我使用了stc32g12k128,修改了頭文件包涵和相應(yīng)的管腳定義,用軟件模擬spi方式一次成功讀寫。用硬件spi方式反復(fù)試都不成功,不知是什么問題。
回復(fù)

使用道具 舉報(bào)

20#
ID:1039438 發(fā)表于 2023-2-28 10:40 | 只看該作者
使用了spi管腳選擇,試過各種頻率,都不行。讀出來都是0.
回復(fù)

使用道具 舉報(bào)

21#
ID:1039438 發(fā)表于 2023-2-28 11:08 | 只看該作者
有沒有人試過在程序中加一個(gè)清零語句?
void main()
{
        unsigned int i;

        SD_init();//SD卡初始化
        
        for(i=0;i<512;++i) BUFFER_DATA[i ]=0x7F;
        MCU_write_SD_512Byte(960,512);//MCU向SD卡寫入數(shù)據(jù),一次最多512字節(jié)(扇區(qū),數(shù)據(jù)長(zhǎng)度(最大為512,建議填512))
                for(i=0;i<512;++i) BUFFER_DATA[i ]=0x00;//緩沖區(qū)數(shù)據(jù)清零

        MCU_read_SD_512Byte(960,512);//MCU向SD卡讀取數(shù)據(jù),一次最多512字節(jié)(扇區(qū),數(shù)據(jù)長(zhǎng)度(最大為512,建議填512))
        P0=BUFFER_DATA[0];
        
        while(1);
}
我加了清零語句后發(fā)現(xiàn)我的讀語句沒起作用。用winhex打開tf卡看內(nèi)存,960扇區(qū)是空白的,沒有被寫入內(nèi)容,全是0

內(nèi)存圖.png (103.79 KB, 下載次數(shù): 128)

內(nèi)存圖.png
回復(fù)

使用道具 舉報(bào)

22#
ID:229375 發(fā)表于 2023-6-3 11:53 | 只看該作者
感謝樓主分享!
今天試了用 硬件SPI移植到STC8F2K16S2上 ,試了128M和2G的內(nèi)存卡,可以正常寫入,4G則失敗了

回復(fù)

使用道具 舉報(bào)

23#
ID:1040201 發(fā)表于 2023-8-18 17:49 | 只看該作者
非常感謝,TF卡    正是我想學(xué)的
回復(fù)

使用道具 舉報(bào)

24#
ID:1063561 發(fā)表于 2023-8-22 08:58 | 只看該作者
非常感謝, 正是想學(xué)的
回復(fù)

使用道具 舉報(bào)

25#
ID:819198 發(fā)表于 2023-8-31 18:21 | 只看該作者
標(biāo)記一個(gè),有時(shí)間再來詳細(xì)拜讀。謝謝樓主分享
回復(fù)

使用道具 舉報(bào)

26#
ID:57657 發(fā)表于 2023-8-31 21:19 | 只看該作者
麗江春水 發(fā)表于 2023-2-28 10:20
我使用了stc32g12k128,修改了頭文件包涵和相應(yīng)的管腳定義,用軟件模擬spi方式一次成功讀寫。用硬件spi方式 ...

具有硬件SPI功能的IO口是固定的,不同型號(hào)都可能不一樣。
有問題是寄存器配置有誤或中斷問題,使用邏輯分析儀檢查時(shí)序。
回復(fù)

使用道具 舉報(bào)

27#
ID:1030215 發(fā)表于 2023-9-20 20:08 | 只看該作者
感謝大佬的無私分享。感謝!愛你喔
回復(fù)

使用道具 舉報(bào)

28#
ID:230500 發(fā)表于 2023-10-1 18:59 | 只看該作者
值得學(xué)習(xí)! Mark一下!
回復(fù)

使用道具 舉報(bào)

29#
ID:92781 發(fā)表于 2023-11-19 08:20 來自手機(jī) | 只看該作者
你就是我的神,多謝無私奉獻(xiàn)
回復(fù)

使用道具 舉報(bào)

30#
ID:17521 發(fā)表于 2024-4-1 11:12 | 只看該作者
謝謝大神分享代碼
回復(fù)

使用道具 舉報(bào)

31#
ID:1112603 發(fā)表于 2024-4-7 09:48 | 只看該作者
謝謝分享!新手學(xué)習(xí)很需要這樣的帖子。
回復(fù)

使用道具 舉報(bào)

32#
ID:79094 發(fā)表于 2024-5-5 21:35 | 只看該作者
//SD卡初始化
u8 SD_init()
{
        u8 i;
        u8 response=0x01;
       
        SD_CS=1;
        for(i=0;i<10;++i) SPI_write_Byte(0xFF);
        SD_CS=0;
       
        MCU_write_SD_command(0x00,0x00000000,0x95);//發(fā)送命令0將MMC置于SPI模式

        response=SD_response();

        if(response!=0x01) return 0;
        while(response)
        {
                SD_CS=1;
                SPI_write_Byte(0xFF);
                SD_CS=0;
                MCU_write_SD_command(0x01,0x00FFC000,0xFF);
                response=SD_response();
        }
        SD_CS=1;
        SPI_write_Byte(0xFF);
        樓主 cmd1 是mmc 初始化  我用sd 卡cmd1 命令回應(yīng)不正確  好坑啊  有sd 的沒 給新人學(xué)習(xí)下把 搞了一個(gè)多星期啊  我好想哭啊
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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