1596|0

3836

帖子

19

TA的资源

纯净的硅(中级)

楼主
 

MSP430的SD卡FAT16读写程序 [复制链接]

基于MSP430学习开发系统的SD卡FAT16读写程序这个工程
介绍了SD卡的基本结构和技术特征,详细说明了使用MSP430单片机和SD卡设计的FAT16文件系统,给出了接口电路和相应的软件系统设计。
该系统适用于大容量的现场数据采集、存储,并在动态心电图记录系统中得到了应用。
此工程有SCH,程序等。。。。。
########################################################################
以下是SCH图:


###########################################################################
以下是代码,对于MSP430开发主要是多做项目,希望这个项目对大家有用。。。。。

主函数如下:

void main(void)
{
    hwInterface sdNow;  
        uint8 ok,i;
        uint8 Name[12]="SD_FAT16TXT";
        uint8 buffer[54]=
                "If you look this content,the file was created success!";   
    uint8 rBuf[128];

    initMcu();

    UCTL1 |= SWRST;                       // Initialize USART state machine
    UCTL1 |= CHAR + SYNC + MM;            // 8-bit SPI Master **SWRST**
    UTCTL1 = CKPH + SSEL1 + SSEL0 + STC;  // SMCLK, 3-pin mode
    UBR01 = 0x04;                         // UCLK/4
    UBR11 = 0x00;                         // 0
    UMCTL1 = 0x00;                        // no modulation

    ME2 |= USPIE1;                        // Enable USART1 SPI mode
    UCTL1 &= ~SWRST;                      // Initialize USART state machine   

    P5DIR |= SDCS;                        //SD cs pin as output
    P5SEL |= 0x0E;                        // P5.1-3 SPI option select      

    sdNow.sectorCount = 1;
    sd_Init(&sdNow);

           InitFat16();

//    memset(rBuf,0,128);
//    sd_readSector(&sdNow,0,rBuf,128);
//    rBuf[1] = 0;

        ok=CreateFile(Name,(uint32)54);                                //建立长度为54的空文件
        if(ok!=SD_FAIL)                                         //文件已存在,退出
    {
                WriteFile(Name,(uint32)0,(uint32)54,buffer);        //将buffer写入文件
    };

        /*
        for(i=0;i<54;i++)buffer=0;
        ReadFile(Name,(uint32)0,(uint32)54,buffer);        //将文件读入buffer
       
        EreaseFile(Name);                                                                //删除文件
        */
    while(1);
}
SD卡读程序如下 :

int8 sd_readSector(hwInterface *iface,uint32 address, uint8* buf, uint16 len)
{
        uint8 cardresp;
        uint8 firstblock;
        uint8 c;
        uint16 fb_timeout=0xffff;
        uint32 i;
        uint32 place;

        /*DBG((TXT("sd_readSector::Trying to read sector %u and store it at %p.\n"),address,&buf[0]));*/
        place=512*address;
        sd_Command(iface,CMDREAD, (uint16) (place >> 16), (uint16) place);
       
        cardresp=sd_Resp8b(iface); /* Card response */

        /* Wait for startblock */
        do
                firstblock=sd_Resp8b(iface);
        while(firstblock==0xff && fb_timeout--);

        if(cardresp!=0x00 || firstblock!=0xfe){
                sd_Resp8bError(iface,firstblock);
                return(-1);
        }
       
        for(i=0;i<512;i++){
                c = if_spiSend(iface,0xff);
                if(i                         buf = c;
        }

        /* Checksum (2 byte) - ignore for now */
        if_spiSend(iface,0xff);
        if_spiSend(iface,0xff);

        return(0);
}

SD写程序如下:
int8 sd_writeSector(hwInterface *iface,uint32 address, uint8* buf)
{
        uint32 place;
        uint16 i;
        uint16 t=0;
       
        /*DBG((TXT("Trying to write %u to sector %u.\n"),(void *)&buf,address));*/
        place=512*address;
        sd_Command(iface,CMDWRITE, (uint16) (place >> 16), (uint16) place);

        sd_Resp8b(iface); /* Card response */

        if_spiSend(iface,0xfe); /* Start block */
        for(i=0;i<512;i++)
                if_spiSend(iface,buf); /* Send data */
        if_spiSend(iface,0xff); /* Checksum part 1 */
        if_spiSend(iface,0xff); /* Checksum part 2 */

        if_spiSend(iface,0xff);

        while(if_spiSend(iface,0xff)!=0xff){
                t++;
                /* Removed NOP */
        }
        /*DBG((TXT("Nopp'ed %u times.\n"),t));*/

        return(0);
}

 
点赞 关注

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表