搜索
bottom↓
回复: 191

终于可以读写SD卡了(ATMEGA16 GCC)

[复制链接]

出0入0汤圆

发表于 2009-8-11 17:52:52 | 显示全部楼层 |阅读模式
不容易啊,整整4天时间都在搞单片机读写SD卡的程序,由于技术浅薄走了很多弯路.不过总算成功读写SD卡扇区数据了.

测试环境:ATMEGA16   16M晶振



总结下读写SD卡应该注意的地方:

1.首先烧录器一定要加上校检FLASH.

  有好几次由于HEX文件比较大时,是不是的会发生烧录错误数据,导致程序最后跑飞,为此被误导了好长时间,加上校检FLASH后虽说烧录速度明显慢了,但是烧录的心安理得



2.SD卡上电复位,所以每当调试完程序后都应重插下SD卡



3.供电不足,导致SD卡只能读不能写.

   一开始没找到合适的3.3V电源,就随便找了个3.3V稳压管加个小电阻给SD卡供电,导致我调试了将近两天的时间也没发现是这出了问题,SD卡写数据时比读数据是提供的电流要大,导致程序运行完全正常,SD卡返回的指令也完全正确,程序成功返回写数据完成后但在WINHEX下观看数据完全没有被写入.硬件基础差导致我浪费了这么长时间,还好没有放弃.最后更换了SD卡供电电源后便可正确读写SD卡扇区了.(我的3.3V电源是用5V减去3个1n4148串联分压的电压,用万用表测了下大约是3.3V)



4.最后说下让金士顿给害惨了

  我有一个2G的金士顿SD卡,一开始我就是用我的这个卡调试程序,发现怎么调试也不好使.后来找朋友借了个256M的小卡操作,完全可以正确读写扇区.后来决定再用1天的时间解决这个问题,从早忙活到黑,程序改了一遍又一遍后来在网上查了下金士顿上面的一个"SDC"的标记就完全明白了.原来SDC 它本身是MMC卡做成跟SD形同的脚位.晕了 白耽误1天.



最后总结下:只要SD卡看仔细了,我用ATMEGA16 上16M晶振,在初始化SD卡时设成SPI 128分频完全可以成功初始化SD卡,初始化后,便可设置SPI高速模式(2分频 8M).要是大家担心初始化频率过高可以完全用一个小晶振试验.当我用6M晶振试验我的SD卡时发现我的金士顿还是照常不能初始化就明白不是SPI频率的事.本来半天可以完成的工作还得我为此付出了4天时间,希望有学习SD卡的朋友千万别犯我的错误.



SD卡扇区可以正常读写后就该学FAT32文件系统了,学会了就可以试着做个MP3了,也为我的图像采集系统项目打些基础.


成功初始化SD卡 (原文件名:成功初始化.JPG)


读出的部分0扇区数据 (原文件名:读出的部分0好扇区.JPG)


winhex显示的0扇区数据 (原文件名:WINHEX0扇区的验证.JPG)

全部测试代码ourdev_469856.rar(文件大小:29K) (原文件名:全部代码.rar)


下面是我的还没有整理的源代码,只是简单测试下读写扇区.
#include"config.h"

//ATMEGA16 SPI引脚
#define        SPI_DDR                        DDRB
#define SPI_PORT                PORTB
#define SPI_PIN                        PINB
#define SPI_SS                        PB4
#define SPI_MOSI                PB5
#define SPI_MISO                PB6
#define SPI_SCK                        PB7

#define SET_SD_CS                PORTA |= (1<<PA0)
#define CLR_SD_CS                PORTA &= ~(1<<PA0)
#define SET_SPI_MOSI        PORTB |= (1 << PB5)                //没数据时SD_MI应保持为高电平

uint8_t buf[512];                        //数据缓冲区
uint16_t k;

void SPI_Low(void)               
{//SPI低速模式
        SPCR = 0;
        SPCR = (1 << SPE) | (1 << MSTR) | (1 << SPR0) | (1 << SPR1);
        //使能SPI,主机方式,MSB在前,模式0,128分频
}

void SPI_High(void)
{//SPI高速模式
        SPCR = 0;
        SPCR = (1 << SPE) | (1 << MSTR);
        SPSR |= (1 << SPI2X);
        //使能SPI,主机方式,MSB在前,模式0,4分频,2倍频
}

void SPI_Init(void)
{//SPI初始化
        SPI_PORT = (1 << SPI_SS) | (1 << SPI_MISO);                //将SS置位输出拉高,MISO输入带上拉
        SPI_DDR = (1 << SPI_SS) | (1 << SPI_MOSI) | (1 << SPI_SCK);
        //将SS SCK MOSI置为输出       
}

uint8_t SPI_RW(uint8_t dat)
{//SPI读写1Byte(欲想读之必先与之)
        SPDR = dat;
        while(!(SPSR & (1 << SPIF)))
                ;
        return (SPDR);
}

uint8_t SD_Write_Com(uint8_t *cmd)
{
        uint8_t i,temp,retry;

        SET_SD_CS;                                        //关片选
        SPI_RW(0XFF);                                 //提高兼容性,如果没有这里,有些SD卡可能不支持   
        CLR_SD_CS;                                        //开片选(后面的读写扇区可以省去开片选)
        asm("nop");
       
        for(i=0;i<6;i++)
        {
                SPI_RW(*cmd);
                cmd++;
        }

        SPI_RW(0XFF);                                //写入指令后附加8个时钟脉冲       

        retry = 0;
        do                                                        //不断地读
        {
                temp = SPI_RW(0XFF);
                retry++;               
        }while((temp == 0XFF) && (retry < 254));
       
        return (temp);
}

uint8_t SD_Init(void)
{
        uint8_t i,temp;
        uint16_t retry;                                                        //重试次数16位数据(适应大容量SD卡)       
        uint8_t CMD[] = {0x40,0x00,0x00,0x00,0x00,0x95};       

        SPI_Init();                                                               
        SPI_Low();                                                                //SPI初始化低速模式

        for(i=0;i<200;i++)                                                 //Wait MMC/SD ready...
        {
                asm("nop");
        }
       
        retry=0;
        do
        {
                SET_SD_CS;
                for (i=0;i<0x0f;i++)
                {
                        SPI_RW(0xff);                                                 //至少74个信号脉冲
                }
                       
                temp = SD_Write_Com(CMD);                      //写入CMD0号命令,最大重试次数254
                retry++;
                if(retry == 600)
                {
                        SET_SD_CS;
                        return(1);                                                //写入CMD0号命令错误
                }
        }while(temp!=1);

       
        CMD[0] = 0x41;                                                         //CMD1号命令
        CMD[5] = 0xFF;

        retry = 0;
        do
        {
                temp = SD_Write_Com(CMD);
                retry++;
                if(retry > 60000)                                         //写入CMD1号命令,最大重试次数60000
                {
                        SET_SD_CS;                                                //关闭片选
                        return(1);                                                //写CMD1命令失败
                }
        }while(temp != 0);
       

        SET_SD_CS;                                                          //关闭片选

        SPI_High();                                        //初始化成功,SPI高速模式
        SET_SPI_MOSI;                                //没数据时SD_MI应保持为高电平       
        return(0);                                         //成功初始化       
}

uint8_t  SD_Write_Sector(uint32_t addr , uint8_t *buffer)
{//向SD卡中的指定地址的扇区写入512个字节,使用CMD24(24号命令,单块写命令)
        uint8_t temp,retry;
        uint16_t i;
        uint8_t cmd24[] = {0x58,0x00,0x00,0x00,0x00,0xff};

        addr <<= 9;
        //addr = addr * 512        将块地址(扇区地址)转为字节地址(所以SD卡的最大容量为4G)

        cmd24[1] = ((addr & 0xFF000000) >> 24);
        cmd24[2] = ((addr & 0x00FF0000) >> 16);
        cmd24[3] = ((addr & 0x0000FF00) >> 8);
        //cmd24[4] = ((addr & 0x000000FF) >> 0);        //可以省去

        //CLR_SD_CS;//打开SD卡片选

        retry = 0;
        do
        {  
                temp = SD_Write_Com(cmd24);
                retry++;
                if(retry > 200)
                {
                        return(1);                         //CMD24命令写入失败
                }
        }while(temp != 0);       


        SPI_RW(0XFF);
        SPI_RW(0XFF);       
        SPI_RW(0XFF);                                //按照时序要求插入若干时序信号

        SPI_RW(0XFE);                                //写入开始字节 0xfe,后面就是要写入的512个字节的数据       

        for (i=0;i<512;i++)                 //将缓冲区中要写入的512个字节写入SD卡
        {
                SPI_RW(buffer);               
        }

        SPI_RW(0xFF);
        SPI_RW(0xFF);                                 //两个字节的CRC校验码,不用关心


        temp = SPI_RW(0XFF);                   //读取返回值
        if((temp & 0x1F) != 0x05)         //如果返回值是 XXX0 0101b 说明数据已经被SD卡接受了
        {
                SET_SD_CS;
                return(1);                                 //写块数据失败
        }

        while(SPI_RW(0XFF) != 0xff)
                ;
        //等待SD卡不忙
        //等到SD卡不忙(数据被接受以后,SD卡要将这些数据写入到自身的FLASH中,需要一个时间)
        //忙时,读回来的值为0x00,不忙时,为0xff

        SET_SD_CS;                                         //关闭片选

        SPI_RW(0XFF);                                //按照SD卡的操作时序在这里补8个时钟

        SET_SPI_MOSI;                                //没数据时SD_MI应保持为高电平
        return(0);                                         //返回0,说明写扇区操作成功
}


uint8_t  SD_Read_Sector(uint32_t addr , uint8_t *buffer)
{//从SD卡的指定扇区中读出512个字节,使用CMD17(17号命令)
        uint16_t i;
        uint8_t retry,temp;
        uint8_t cmd17[]={0x51,0x00,0x00,0x00,0x00,0xFF}; //CMD17的字节序列

        addr <<= 9;                 //sector = sector * 512           将块地址(扇区地址)转为字节地址

        cmd17[1] = ((addr & 0xFF000000) >> 24);
        cmd17[2] = ((addr & 0x00FF0000) >> 16);
        cmd17[3] = ((addr & 0x0000FF00) >> 8);
        //cmd17[4] = ((addr & 0x000000FF) >> 0);//可以省去
        //CLR_SD_CS;                                                        //打开片选

        retry = 0;
        do
        {  
                temp = SD_Write_Com(cmd17);                 //写入CMD17
                retry++;
                if(retry > 250)                                         //最大重试次数250
                {
                        SET_SD_CS;
                        return(1);                                                 //读块失败
                }
        }while(temp != 0);


        while (SPI_RW(0XFF) != 0xfe);         //一直读,当读到0xfe时,说明后面的是512字节的数据了

        for(i=0;i<512;i++)                                 //将数据写入到数据缓冲区中
        {       
                buffer = SPI_RW(0XFF);
        }

        SPI_RW(0XFE);
        SPI_RW(0XFE);                                         //读取两个字节的CRC校验码,不用关心它们

        SET_SD_CS;                                          //SD卡关闭片选

        SPI_RW(0xFF);                                        //按照SD卡的操作时序在这里补8个时钟

        SET_SPI_MOSI;                                //没数据时SD_MI应保持为高电平
        return 0;                                                //返回0,说明读扇区成功
}


int main()
{
        _delay_ms(50);
        PORTA |= (1 << PA0);
        DDRA |= (1 << PA0);
       
        for(k=0;k<512;k++)
        {
                buf[k] = k;
        }
       
        USART_Init();
        USART_Send_Str("SD卡测试程序\r\n");

        if(SD_Init() == 0)
                USART_Send_Str("SD卡初始化成功\r\n");
        else
                USART_Send_Str("SD卡初始化失败\r\n");
       

        /*if(SD_Write_Sector(80 , buf) == 0)
        {
                USART_Send_Str("SD卡写扇区成功\r\n");
                for(k=0;k<512;k++)
                {
                        USART_Send_Char(buf[k]/100+0x30);
                        USART_Send_Char(buf[k]/10%10+0x30);
                        USART_Send_Char(buf[k]%10+0x30);
                        USART_Send_Str("\r\n");
                }
        }
        else
                USART_Send_Str("SD卡写扇区失败\r\n");*/


        for(k=0;k<512;k++)                        //清零缓冲区
        {
                buf[k] = 0;
        }       

        if(SD_Read_Sector(0 , buf) == 0)
        {
                USART_Send_Str("SD卡读扇区成功\r\n");
                for(k=0;k<512;k++)
                {
                        USART_Send_Char(buf[k]/100+0x30);
                        USART_Send_Char(buf[k]/10%10+0x30);
                        USART_Send_Char(buf[k]%10+0x30);
                        USART_Send_Str("\r\n");
                }
        }
        else
                USART_Send_Str("SD卡读扇区失败\r\n");

       
        while(1)
        {
                asm("nop");       
        }
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2009-8-11 18:01:24 | 显示全部楼层
不错

出0入0汤圆

发表于 2009-8-11 18:16:16 | 显示全部楼层
支持一个

出0入0汤圆

发表于 2009-8-11 18:21:09 | 显示全部楼层
精神可嘉,帮顶

出0入0汤圆

发表于 2009-8-11 19:45:44 | 显示全部楼层
赞一个~~

出0入0汤圆

发表于 2009-8-11 20:56:15 | 显示全部楼层
支持!

出0入0汤圆

发表于 2009-8-11 21:35:14 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-8-11 21:52:48 | 显示全部楼层
MARK一下,谢谢。

出0入0汤圆

发表于 2009-8-11 22:03:21 | 显示全部楼层
小弟也在学习BOZAI的SD卡程序,现在进行到一半了。
楼主要多多指教。

出0入0汤圆

发表于 2009-8-11 22:31:30 | 显示全部楼层
程序写的有点乱~~

出0入0汤圆

发表于 2009-8-12 00:41:40 | 显示全部楼层
支持!

出0入0汤圆

发表于 2009-8-12 01:32:36 | 显示全部楼层

出0入0汤圆

发表于 2009-8-12 10:59:34 | 显示全部楼层
不错,感谢楼主分享你的经验

出0入0汤圆

发表于 2009-8-18 18:27:28 | 显示全部楼层

出0入0汤圆

发表于 2009-8-21 14:47:58 | 显示全部楼层
谢谢楼主,学习

出0入0汤圆

发表于 2009-8-21 14:55:11 | 显示全部楼层
顶,标记

出0入0汤圆

发表于 2009-8-27 01:01:24 | 显示全部楼层
頂一下!
請問樓主您的測試軟體可以分享嗎?

出0入4汤圆

发表于 2009-8-27 02:07:26 | 显示全部楼层
标记下  以后有用

出0入0汤圆

发表于 2009-8-27 08:44:57 | 显示全部楼层
我的已经可以写FAT32文件系统了,不过移植的是ZLG文件系统!

出0入0汤圆

发表于 2009-8-27 08:48:15 | 显示全部楼层
顶一下!

出0入0汤圆

发表于 2009-8-27 09:34:51 | 显示全部楼层
支持一下,谢谢共享

出0入0汤圆

发表于 2009-9-28 14:03:28 | 显示全部楼层
很好的东西,虽然还没有看,但是我先顶一下

出0入0汤圆

发表于 2009-9-28 14:07:57 | 显示全部楼层
菜鸟想看看电路图:)

出0入0汤圆

发表于 2009-9-28 16:01:27 | 显示全部楼层
hao !!赞一个

出0入0汤圆

发表于 2009-10-7 17:43:58 | 显示全部楼层
頂一個!

出0入0汤圆

发表于 2009-10-7 22:28:14 | 显示全部楼层
正需要 谢楼主

出0入0汤圆

发表于 2009-10-8 00:51:14 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-10-8 08:57:35 | 显示全部楼层
顶一个,再慢慢学习

出0入0汤圆

发表于 2009-10-8 09:11:58 | 显示全部楼层
秋天到了,建议A莫拿条裤子给楼主穿上

出0入0汤圆

发表于 2009-10-9 19:47:42 | 显示全部楼层
学习

出0入0汤圆

发表于 2009-10-9 20:56:35 | 显示全部楼层
顶!

出0入0汤圆

发表于 2009-10-10 07:57:55 | 显示全部楼层
qIANG

出0入0汤圆

发表于 2009-10-18 14:49:43 | 显示全部楼层
有没有硬件连接图示,谢谢

出0入0汤圆

发表于 2009-10-18 15:18:31 | 显示全部楼层
原理图看看呀

出0入0汤圆

发表于 2009-10-18 18:24:11 | 显示全部楼层
顶了~~~~

出0入0汤圆

发表于 2009-10-18 18:39:04 | 显示全部楼层
Mark一下

出0入0汤圆

发表于 2009-10-18 21:56:25 | 显示全部楼层
学习一下!谢谢

出0入0汤圆

发表于 2009-10-19 00:33:51 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-10-19 09:06:20 | 显示全部楼层
学习一下!谢谢

出0入0汤圆

发表于 2009-11-4 19:19:12 | 显示全部楼层
mark!!!

出0入0汤圆

发表于 2009-11-21 01:46:12 | 显示全部楼层
刚才试过了,可以写,但是速度比较慢(我的硬件是M16,16MHz频率,1G容量SD卡),写10000个扇区需要96秒左右。但是读取数据时候,前面一部分正确,后面的就出错了,不知道问题在那里,正在调试中。谢谢楼主的程序!

出0入0汤圆

发表于 2009-11-21 11:43:31 | 显示全部楼层
我找到错误在那里,我将原来的语句注释掉了。
uint8_t  SD_Read_Sector(uint32_t addr , uint8_t *buffer)
{//从SD卡的指定扇区中读出512个字节,使用CMD17(17号命令)
        uint16_t i;
        uint8_t retry,temp;
        uint8_t cmd17[]={0x51,0x00,0x00,0x00,0x00,0xFF}; //CMD17的字节序列

        addr <<= 9;                 //sector = sector * 512           将块地址(扇区地址)转为字节地址

        cmd17[1] = ((addr & 0xFF000000) >> 24);
        cmd17[2] = ((addr & 0x00FF0000) >> 16);
        cmd17[3] = ((addr & 0x0000FF00) >> 8);
        //cmd17[4] = ((addr & 0x000000FF) >> 0);//可以省去
        //CLR_SD_CS;                                                        //打开片选

        retry = 0;
        do
        {  
                temp = SD_Write_Com(cmd17);                 //写入CMD17
                retry++;
                if(retry > 250)                                         //最大重试次数250
                {
                        SET_SD_CS;
                        return(1);                                                 //读块失败
                }
        }while(temp != 0);


        while (SPI_RW(0XFF) != 0xfe);         //一直读,当读到0xfe时,说明后面的是512字节的数据了


        for(i=0;i<512;i++)                                 //将数据写入到数据缓冲区中
        {       
                buffer = SPI_RW(0XFF);
        }

//        SPI_RW(0XFE);                   //如果使用这两条语句,则读取32个扇区之后就出错了
//        SPI_RW(0XFE);                                        
        SPI_RW(0XFF);                   //读取两个字节的CRC校验码,不用关心它们(这两条语句是我修改之后的)
        SPI_RW(0XFF);
        SET_SD_CS;                                          //SD卡关闭片选

        SPI_RW(0xFF);                                        //按照SD卡的操作时序在这里补8个时钟

        SET_SPI_MOSI;                                //没数据时SD_MI应保持为高电平
        return 0;                                                //返回0,说明读扇区成功
}

出0入0汤圆

发表于 2009-11-21 12:19:41 | 显示全部楼层
支持阿莫给楼主拿条裤子穿穿。

出0入0汤圆

发表于 2009-11-22 12:19:59 | 显示全部楼层
我就喜欢楼主的总结风格

出0入0汤圆

发表于 2009-11-22 17:31:25 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-11-22 17:44:49 | 显示全部楼层
很详细,赞一个!

出0入0汤圆

发表于 2009-11-25 11:33:18 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-11-25 22:53:15 | 显示全部楼层
牛!

出0入0汤圆

发表于 2009-11-26 09:42:10 | 显示全部楼层
弱弱的问一下 ,LZ的代码初始化中  CMD0后 是CMD1
我在一篇文章上面看的是  CMD55+ACMD41  回应为SD卡  不回应为 MMC卡  您这段测试代码是不是不能区别这两种呢?

出0入0汤圆

发表于 2009-11-26 11:19:04 | 显示全部楼层
马克

出0入0汤圆

发表于 2009-11-26 18:53:20 | 显示全部楼层
mark!

出0入0汤圆

发表于 2009-11-26 20:10:43 | 显示全部楼层
mark~

出0入0汤圆

发表于 2009-12-1 01:31:58 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-12-1 16:46:02 | 显示全部楼层
请问楼主SD卡的读写速度够不够快啊!AD转换后的数据能存储吗?

出0入0汤圆

发表于 2009-12-1 21:46:15 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-12-2 09:27:58 | 显示全部楼层
学习了

出0入0汤圆

发表于 2009-12-2 10:16:39 | 显示全部楼层
学习

出0入0汤圆

发表于 2009-12-9 16:56:11 | 显示全部楼层
按照楼主的方法试了一下,但出现的一个问题,请高手指教,先谢了。
我的板子能够正常的读写数据,但读出的数据跟winhex里看到的对应不上,
比如我试读了0扇区的数据,在winhex找了大半天才在2B8F2C开始的地址找到正确对应的地址,
不知道地址设定是否错误,还是卡有问题(我只有一张卡)?

出0入0汤圆

发表于 2009-12-9 19:42:38 | 显示全部楼层
学习了

出110入26汤圆

发表于 2009-12-10 09:23:08 | 显示全部楼层
mark!学习

出0入0汤圆

发表于 2009-12-10 10:22:44 | 显示全部楼层
新手报到不知道可不可以mark

出0入0汤圆

发表于 2009-12-10 12:17:35 | 显示全部楼层
学习

出0入0汤圆

发表于 2009-12-10 13:09:08 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-1-5 09:26:33 | 显示全部楼层
支持一下,学习学习

出0入0汤圆

发表于 2010-1-5 13:14:40 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-1-13 09:14:17 | 显示全部楼层
mark  顶

出0入0汤圆

发表于 2010-1-13 13:34:25 | 显示全部楼层
支持一下!

出0入0汤圆

发表于 2010-1-23 20:12:48 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-1-27 13:18:44 | 显示全部楼层
DING


DING





出0入0汤圆

发表于 2010-1-27 13:23:05 | 显示全部楼层
记号

出0入0汤圆

发表于 2010-3-8 16:32:52 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-3-8 16:41:15 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-3-20 08:41:18 | 显示全部楼层
顶了

出0入0汤圆

发表于 2010-3-20 08:42:19 | 显示全部楼层
ding'

出0入0汤圆

发表于 2010-3-20 09:07:03 | 显示全部楼层
学习,顶

出0入0汤圆

发表于 2010-3-20 17:11:38 | 显示全部楼层
很好!!!!!!!!!!!

出0入0汤圆

发表于 2010-3-20 22:12:46 | 显示全部楼层
先谢楼主啦!
42楼也幸苦了,楼主啥时过来把程序修改一下啊~~

出0入0汤圆

发表于 2010-3-21 08:09:05 | 显示全部楼层
回复【19楼】whuctx
-----------------------------------------------------------------------

可以分享一下经验么?我的好像读取FAT32文件系统有点问题,我用的是Nokia的512MB Micro SD卡,好像读取数据有点问题。

出0入0汤圆

发表于 2010-3-21 13:16:33 | 显示全部楼层
很赞!顶一个!

出0入0汤圆

发表于 2010-3-21 13:41:20 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-3-21 17:26:48 | 显示全部楼层
精神可嘉,帮顶

出0入0汤圆

发表于 2010-3-21 18:33:08 | 显示全部楼层
谢谢

出0入0汤圆

发表于 2010-3-22 09:27:38 | 显示全部楼层
学习

出0入0汤圆

发表于 2010-3-23 11:01:32 | 显示全部楼层
非常好的贴,顶啊顶啊.学习了.不过我用ICC编译器.没有做出来.有些句子理解不了.大概是对SD卡不了解吧.谢谢

出0入0汤圆

发表于 2010-3-30 16:24:21 | 显示全部楼层
非常好的例程,必须顶一个!

出0入0汤圆

发表于 2010-3-30 23:02:30 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-4-4 00:55:13 | 显示全部楼层
哈哈,由于我过度参考楼主的程序,所以编译一次通过

这是SD卡与单片机的物理连接图

SD卡        MCU

1:CS        /SS
2:DI        MOSI
3:GND       GND
4:VCC       3.3V
5:CLK       SCK
6:GND       GND
7:DO        MISO
8:NC
9:NC
  _________
/912345678|
|          |
|          |
|  SD卡    |
|          |
|__________|

出0入0汤圆

发表于 2010-4-4 23:08:40 | 显示全部楼层
记号!

出0入0汤圆

发表于 2010-4-4 23:10:51 | 显示全部楼层
不错

出0入0汤圆

发表于 2010-4-6 09:12:41 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-4-28 14:35:51 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-4-28 17:48:25 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-4-28 18:03:23 | 显示全部楼层
mark!

出0入0汤圆

发表于 2010-5-3 16:33:43 | 显示全部楼层
mark

出0入50汤圆

发表于 2010-5-7 08:52:01 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-5-7 09:10:37 | 显示全部楼层
很好,很详细!!!

出0入0汤圆

发表于 2010-5-7 21:55:55 | 显示全部楼层
mark!

出0入0汤圆

发表于 2010-5-13 09:17:07 | 显示全部楼层
回复【88楼】hsztc
哈哈,由于我过度参考楼主的程序,所以编译一次通过
这是sd卡与单片机的物理连接图
sd卡        mcu
1:cs        /ss
2:di        mosi
3:gnd       gnd
4:vcc       3.3v
5:clk       sck
6:gnd       gnd
7:do        miso
8:nc
9:nc
  _________
/912345678|
|          |
|          |
|  sd卡    |
|          |
|__________|
-----------------------------------------------------------------------

弱弱问一下,LZ程序里 还有一个PA0(CS片选?)是接的SD卡的哪个地方呀?

出0入0汤圆

发表于 2010-7-11 11:54:33 | 显示全部楼层
记号

出0入0汤圆

发表于 2010-7-11 12:18:17 | 显示全部楼层
mark sd~
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-25 23:23

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表