• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

    EEPW首頁 > 嵌入式系統 > 設計應用 > SD卡讀寫程序

    SD卡讀寫程序

    作者: 時間:2018-09-11 來源:網絡 收藏

    //實驗目的:學習SD卡的操作

    本文引用地址:http://www.czjhyjcfj.com/article/201809/388868.htm

    //軟件設計
    // 1、SD卡采用SPI通信
    // 2、先往SD里順序寫入0-255共256個數據,然后再讀回送LCD1602顯示
    //硬件要求:
    // 撥碼開關S11置ON
    // 跳線J18全部接通

    #include p30f6014.h> //dsPIC30F6014標準頭文件

    _FOSC(CSW_FSCM_OFF XT_PLL4); //4倍頻晶振,Failsafe 時鐘關閉
    _FWDT(WDT_OFF); //關閉看門狗定時器
    _FBORPOR(PBOR_OFF MCLR_EN); //掉電復位禁止,MCLR復位使能。
    _FGS(CODE_PROT_OFF); //代碼保護禁止

    #define cs PORTGbits.RG9 //定義SD卡片選腳

    #define rs LATBbits.LATB4 //定義LCD控制位(注意這里只能用LATB寄存器,不能直接用PORTB寄存器)
    #define rw LATBbits.LATB5
    #define e LATBbits.LATB6

    unsigned char __attribute__((address(0x900))) lcd[3]={0,0,0};

    void spi_init(); //申明系統初始函數
    void spi_low(); //申明產生低波特率函數(SD卡初始化使用)
    void spi_high(); //申明產生高波特率函數(SD卡初始化后使用)
    unsigned char sd_reset(); //申明SD卡初始化函數
    unsigned char SD_SendCommand(unsigned char cmd,unsigned long arg); //申明寫SD卡命令函數
    unsigned char SPI_WriteByte(unsigned char val); //申明寫一字節函數
    unsigned char SPI_ReadByte(void); //申明接收一字節函數
    unsigned char SD_WriteSingleBlock(unsigned long sector); //申明寫SD卡單BLOCK數據函數
    unsigned char SD_ReadSingleBlock(unsigned long sector); //申明讀SD卡單BLOCK數據函數
    void lcd_display(); //申明結果顯示函數
    void delay(); //申明延時函數(顯示時用)


    //系統初始化函數
    void spi_init()
    {
    TRISG=0x00d0; //設置SDI為輸出,其他C口為輸出
    TRISB=0X0000; //設置B口為輸出
    TRISD=0X0000; //設置D口為輸出
    SPI2CON=0x0278; //空閑時總線為高電平,fosc/64
    SPI2STAT=0x8000; // 輸出數據的末尾采樣輸入數據,上升沿發送數據
    }

    //*************************寫LCD****************************************
    //寫一個字節數據函數
    //在電平發生改變后需要插入一段延時時間,否則LCD反應不過來。
    void write(unsigned char x)
    {
    PORTD=x; //待顯示數據送PORTD口
    delay();
    rs=1; //該字節數據為數據,而不是命令
    delay();
    rw=0; //此次操作為寫,而不是讀
    delay();
    e=0; //拉低使能信號
    delay(); //保持使能信號為低一段時間
    e=1; //拉高使能信號,建立LCD操作所需要的上升沿
    delay();
    }

    //********************LCD顯示設置函數**************************************
    //在電平發生改變后需要插入一段延時時間,否則LCD反應不過來。
    void lcd_enable()
    {
    delay();
    rs=0; //該字節數據為命令,而不是數據
    delay();
    rw=0; //此次操作為寫,而不是讀
    delay();
    e=0; //拉低使能信號
    delay(); //保持使能信號為低一段時間
    e=1; //拉高使能信號,建立LCD操作所需要的上升沿
    delay();
    }

    //*********************LCD初始化函數**************************************
    void lcd_init()
    {
    PORTD=0X1; //清除顯示
    lcd_enable();
    PORTD=0X38; //8位2行5*7點陣
    lcd_enable();
    PORTD=0X0e; //顯示開,光標開,閃爍
    lcd_enable();
    PORTD=0X06; //文字不動,光標右移
    lcd_enable();
    PORTD=0X86; //時間顯示地址
    lcd_enable();
    }

    //***********************LCD顯示函數************************************
    void lcd_display()
    {
    unsigned char i,j;
    lcd_init();
    for(i=0;i3;i++) //一共3字節數據
    {
    write(lcd[i]); //查表獲取數據并調用寫一個字節數據函數送LCD顯示
    for(j=0;j5;j++) //延時一段時間(主要是為了控制顯示的速度)
    {delay();}
    }
    }

    //****************寫一字節函數***************************
    unsigned char SPI_WriteByte(unsigned char val)
    {
    SPI2BUF = val; //待發送數據裝載到發送寄存器
    while(!IFS1bits.SPI2IF); //等待發送完成
    IFS1bits.SPI2IF=0; //清除發送完成標志位
    return SPI2BUF; //讀取接收寄存器(即使是無效數據也需清空)
    }

    //****************接收一字節函數**************************
    unsigned char SPI_ReadByte(void)
    {
    SPI2BUF = 0xff; //發送寄存器裝載數據,以啟動數據接收
    while(!IFS1bits.SPI2IF); //等待接收完成
    IFS1bits.SPI2IF=0; //清除接收完成標志位
    return SPI2BUF; //讀取接收到的數據
    }

    //*****************發送命令函數****************************
    unsigned char SD_SendCommand(unsigned char cmd,unsigned long arg)
    {
    unsigned char r1;
    unsigned char retry1=0; //重復操作次數

    cs=0; //使能片選信號

    SPI_WriteByte(cmd | 0x40); //分別寫入命令
    SPI_WriteByte(arg>>24); //數據段第4字節
    SPI_WriteByte(arg>>16); //數據段第3字節
    SPI_WriteByte(arg>>8); //數據段第2字節
    SPI_WriteByte(arg); //數據段第1字節
    SPI_WriteByte(0x95); //CRC效驗和

    while((r1 = SPI_WriteByte(0xff)) == 0xff)//等待響應
    if(retry1++ > 200) break;//超時退出

    cs=1; //清初片選信號

    return r1; //返回狀態值
    }

    //*******************SD開初始化函數**************************


    上一頁 1 2 下一頁

    關鍵詞: SD卡讀寫 程序

    評論


    相關推薦

    技術專區

    關閉
    主站蜘蛛池模板: 长乐市| 社会| 沂水县| 新绛县| 江城| 探索| 岳西县| 芜湖市| 聊城市| 赤城县| 凤山市| 武威市| 潜江市| 肥西县| 西盟| 个旧市| 田阳县| 铅山县| 安顺市| 锡林郭勒盟| 墨竹工卡县| 大方县| 页游| 勃利县| 逊克县| 明星| 呈贡县| 浠水县| 邳州市| 策勒县| 新安县| 萍乡市| 钦州市| 大连市| 孟州市| 临城县| 张掖市| 马公市| 新巴尔虎左旗| 双桥区| 廊坊市|