搜索
bottom↓
回复: 97

SD卡底层驱动源程序公开------【注意】我的MP3开发板回来了(2)

[复制链接]

出0入0汤圆

发表于 2008-5-6 13:42:54 | 显示全部楼层 |阅读模式
本程序参考自bozai的SD卡驱动程序, 增加了SD、MMC卡判断的功能,SD、MMC初始化成功后能返回卡的类型参数供主程序使用。

//--------SD_MMC.H------------------------

#ifndef __SD_MMC_H__
#define __SD_MMC_H__

// 数据宏定义
#define uint8  unsigned char
#define  int8    signed char
#define uint16 unsigned int
#define  int16   signed int
#define uint32 unsigned long
#define  int32   signed long

// C8051F015与SD_MMC 的接口定义
sbit SDCS        = P3^0;
sbit SDDET        = P3^1;
sbit SDWP        = P3^2;


void SPI_SendWreit(uchar temp);        // VS1003B DATA发送
uint8 SPI_SendByte(uint8 val);        // SPI传送一个字节
uint8 MMC_SD_SendCmd(uint8 Cmd, uint32 arg);        //发送卡命令
uint8 MMC_SD_ReadSingleBlock(uint32 sector, uint8 *buffer);        //读一个扇区
uint8 MMC_SD_WriteSingleBlock(uint32 sector, uint8 *buffer);        //写一个扇区
uint8 MMC_SD_init();        //mmc_sd卡初始化

#endif
//---------SD_MMC.C-----------------

//---------------------------------------------------------
//        SD_MMC  底层驱动函数库
//        编译环境:Keil C V2.40
//        编写日期:2008-04-07
//        最后更新:2008-05-04
//---------------------------------------------------------
#include "main.h"
#include "sd_mmc.h"

//---------------------------------------------------
//        函数名:SPI_SendByte
//        功  能:SPI 数据发送
//        参  数:uchar
//        返回值:
//---------------------------------------------------

void SPI_SendWreit(uchar temp)
{
        SPI0DAT=temp;
        while(TXBSY);        // 查询发送标志位
}

//---------------------------------------------------
//        函数名:SPI_SendByte
//        功  能:SPI传送一个字节
//        参  数:uchar
//        返回值:uchar
//---------------------------------------------------

uint8 SPI_SendByte(uint8 val)        // uint8= uchar
{
        SPI0DAT = val;
        while(TXBSY);
        return SPI0DAT;
}

//---------------------------------------------------
//        函数名:MMC_SD_SendCmd
//        功  能:发送卡命令
//        参  数:uint8,uint32
//        返回值:uint8
//---------------------------------------------------

uint8 MMC_SD_SendCmd(uint8 Cmd, uint32 arg)
{
        uint8 r1;
        uint8 retry=0;
       
        SPI_SendWreit(0xFF);        //发命令前先发送8个时钟
       
        SPI_SendWreit(Cmd | 0x40);        //分别写入命令
        SPI_SendWreit(arg>>24);
        SPI_SendWreit(arg>>16);
        SPI_SendWreit(arg>>8);
        SPI_SendWreit(arg);
        SPI_SendWreit(0x95);                //仅本次有效的 CRC值       
       
        while((r1 = SPI_SendByte(0xFF)) == 0xFF)        //等待响应
                if(retry++ > 8) break;        //超时退出

        return r1;        //返回状态值
}

//---------------------------------------------------
//        函数名:MMC_SD_ReadSingleBlock
//        功  能:读一个扇区
//        参  数:扇区,数据缓冲区
//        返回值:
//---------------------------------------------------

uint8 MMC_SD_ReadSingleBlock(uint32 sector,uint8 *buffer)
{
        uint8 r1;
        uint16 i;

        SDCS=0;                // 使能Card

        r1 = MMC_SD_SendCmd(17, sector<<9);        // 发读扇区命令
       
        if(r1 != 0x00) return r1;

        while(SPI_SendByte(0xFF) != 0xFE);        //--等待数据的起始令牌号--

        for(i=0; i<512; i++)        //读512个数据
        {
                *buffer++ = SPI_SendByte(0xFF);
        }

        SPI_SendWreit(0xFF);        // 发送伪CRC
        SPI_SendWreit(0xFF);
        SDCS=1;                        // 关闭Card
        return 0;
}

//---------------------------------------------------
//        函数名:MMC_SD_WriteSingleBlock
//        功  能:写一个扇区
//        参  数:扇区,数据缓冲区
//        返回值:
//---------------------------------------------------

uint8 MMC_SD_WriteSingleBlock(uint32 sector, uint8 *buffer)
{
        uint8 r1;
        uint16 i;

        SDCS=0;                // 使能Card

        r1 = MMC_SD_SendCmd(24, sector<<9);        //写命令
        if(r1 != 0x00)
                return r1;

        SPI_SendWreit(0xFF);
        SPI_SendWreit(0xFF);
        SPI_SendWreit(0xFF);

        SPI_SendWreit(0xFE);        //发送数据起始令牌号
       
        for(i=0; i<512; i++)        //以扇区为单位写入数据
        {
                SPI_SendWreit(*buffer++);
        }
       
        SPI_SendWreit(0xFF);        // 发送伪CRC
        SPI_SendWreit(0xFF);
       
        r1 = SPI_SendByte(0xFF);        // 读数据应答令牌号
       
        if( (r1&0x1F) != 0x05)        //等待是否成功
        {
                SDCS=1;
                return r1;
        }

        while(!SPI_SendByte(0xFF));         //--等待操作完成--

        SDCS=1;                        // 关闭Card

        return 0;
}

//---------------------------------------------------
//        函数名:MMC_SD_Init
//        功  能:sd卡初始化
//        参  数:无
//        返回值:uint8 type        // 卡类型返回值: 0x10 SD, 0x20 MMC
//---------------------------------------------------

uint8 MMC_SD_init()
{
        uint8 i;
        uint8 retry;
        uint8 r1=0;
        uint8 type=0;        // 卡类型返回值:0xA0 SD 0xB0 MMC
        SDCS = 0;                // 使能Card

        SPI_speed=0x13;        //低速 SPI=300k   Fsystem=12Mhz
        retry = 0;

        do
        {
                for(i=0;i<10;i++) SPI_SendByte(0xFF);   //发送80个时钟,使卡同步
                r1 = MMC_SD_SendCmd(0, 0);        //发Cmd0(复位)命令
                retry++;
                if(retry > 30) return (type=0x01); //超时退出,个别卡需要更多次循环才有反应
        } while(r1 != 0x01);                // MMC、SD卡成功转到SPI模式

        retry = 0;

//****** SD卡在进入SPI模式后,激活命令和MMC卡一样为Cmd1,同时Cmd55+Cmd41 仍然有效******//

/*        do
        {
                r1 = MMC_SD_SendCmd(1, 0);        //发Cmd1(active激活)命令
                retry++;
                if(retry > 100) return 1;        //超时退出
        } while(r1);*/
        do
        {
                r1 = MMC_SD_SendCmd(55, 0);        // 先发送 Cmd55
                if(r1 == 0x01)                        // 如果有反应
                {
                        r1 = MMC_SD_SendCmd(41,0);        // 再发送 Cmd41 进行激活
                        if(r1 == 0x00) type = 0x10;        // 激活成功就是SD卡
                }

                else {                                   // 如果发送 Cmd55无反应,改发送 Cmd1
                                r1 = MMC_SD_SendCmd(1,0);
                                if(r1 == 0x00) type = 0x20;        // 激活成功就是MMC卡
                         }

                retry++;
                if(retry > 255) return (type=0x01);        // 超时退出, 个别卡需要更多次循环才有反应
        } while(r1 != 0x00);                // MMC、SD卡激活后的返回值均为0x00*/

//        SPI_SendByte(0xFF);        // 高速SPI前先发送8个时钟
//        SPI_speed = 0x07;        // 切换到高速 SPI

        r1 = MMC_SD_SendCmd(59, 0);        //关CRC
        r1 = MMC_SD_SendCmd(16, 512);        //设置读取一次的字节数

        SDCS = 1;                        // 关闭Card
//        SPI_speed=0x07;        //切换到高速 SPI

        return type;        //参数返回,1为初始化错误,10为SD卡,20为MMC卡
}

//-----------------------------------------------------------
//        End of File
//-----------------------------------------------------------

出0入0汤圆

发表于 2008-5-6 14:38:34 | 显示全部楼层
记号

出0入0汤圆

发表于 2008-5-6 14:47:41 | 显示全部楼层
MARK

出0入0汤圆

发表于 2008-5-6 17:12:36 | 显示全部楼层
记号

出0入0汤圆

发表于 2008-5-6 18:23:15 | 显示全部楼层
我也留个记号

出0入0汤圆

发表于 2008-5-6 18:41:38 | 显示全部楼层
希望楼主能贴个SD模式的操作程序。

出0入0汤圆

发表于 2008-5-6 18:46:08 | 显示全部楼层
谢谢

出0入42汤圆

发表于 2008-5-6 19:18:14 | 显示全部楼层
记号

出0入0汤圆

发表于 2008-5-6 20:04:51 | 显示全部楼层
支持!


一直没有MMC卡,所以自己的程序没试过,虽然函数以 MMC_SD打头

出0入0汤圆

 楼主| 发表于 2008-5-6 20:37:50 | 显示全部楼层
【8楼】 bozai 章其波

求教一下bozai ,在MP3播放时听起来感觉播放的很慢,播放时间比电脑上放的时间长,音调也不对劲。不知需要做些什么处理能改善此现象?你的SD卡读取速度大概是多少,我的MMC卡SCK时钟用示波器看了在1.3M左右,放128Kbps的MP3速度还行,放182K的就有点吃不消 了,感觉放出来的声音很卡,请教一下要注意些什么?

出0入0汤圆

发表于 2008-5-6 20:53:30 | 显示全部楼层
我用AVR速度很快的,SCK速率要达到4M的(8MHz crystal), 这种情况有两种,一是VS1003的时钟频率不够,用4倍频最好。还有就是真的数据跟不上。
你说声音卡,可能是数据没跟上。送的太慢。

C8051的速度可以到很高啊,不知道它的SPI最高可以达到多少

出0入0汤圆

发表于 2008-5-6 20:59:58 | 显示全部楼层
bozai有没有试过SDHC卡?据说很快。

出0入0汤圆

 楼主| 发表于 2008-5-6 21:22:44 | 显示全部楼层
【10楼】 bozai 章其波

C8051F的SPI最大时钟是系统OSC的二分之一。
我现在比较晕的地方是怎样设置VS1003B的内核时钟倍频,说明书上看得一知半解的,看了几个程序的VS1003设置都不一样。
现在C8051F015的时钟是11.0592,分频比率是0x03,问题是MMC卡快不起来,太快就读不出了,SD卡比MMC卡的时钟频率还要低。


(原文件名:QQ截图未命名.GIF)

出0入0汤圆

发表于 2008-5-6 21:26:15 | 显示全部楼层
哦,你找找我的程序是设多少,我用的是12.288的,其它的设就比较麻烦,要计算一下

出0入0汤圆

 楼主| 发表于 2008-5-6 21:45:01 | 显示全部楼层
你的是C000,用的多的设置是9800,我把倍频设到最高F800,放MP3还是一样的慢。
还有就是SD卡的速度提不起来,一提高就读不出数据了,现在最大的问题就是这两个了,还得花时间研究。
忘了说我现在的播放程序没有文件系统支持,只是把卡里的扇区数做在了程序里,上电后直接去指定扇区位置读出来送VS1003的。

出0入0汤圆

发表于 2008-5-6 22:26:04 | 显示全部楼层
mark

出0入0汤圆

 楼主| 发表于 2008-5-6 22:35:26 | 显示全部楼层
现在SD、MMC卡的速度都提起来了,现在硬件SPI的SCK频率是C8051F015系统时钟的二分之一,已达C8051F015的SPI时钟极限!

原因在这里:
                 if(retry > 30) return (type=0x01); //超时退出,个别卡需要更多次循环才有反应
这一句中的超时限制次数  if(retry > 30)改为if(retry > 50),手里最难读的一张32M佳能相机原配SD卡也能上到SPI最大时钟^_^

出0入0汤圆

 楼主| 发表于 2008-5-6 22:43:20 | 显示全部楼层
这一句也要加到255次限制,不然32M的卡还是读不出来:           if(retry > 100) return 1;        //超时退出

出0入0汤圆

 楼主| 发表于 2008-5-7 17:08:23 | 显示全部楼层
今天在公司用示波器看了VS1003-DREQ、VS1003-xDCS、SD-CS的时序,确认不是数据速度影响MP3播放慢的,C8051F015的晶振换用了20M的,SD卡的SCK也达到了MCU的极限20M/2=10M,512字节的读取时间在2.4~2.8ms间。改了无数次可能有BUG的地方,还是没有见效,声音听起来仍有间接性的破音,下面是部分播放函数的代码,在读完SD、送完512字节数据时都做了延时,已达12ms还是不能解决破音,请各位朋友指点指点,先行谢过了!


        for(s=0;s<10362;s++)             //一首歌的总扇区数
        {
            uint count=0;
            uchar j;
            SPI_speed=0x00;        // MMC_SD
            MMC_SD_ReadSingleBlock((563+s),buffer); //直接到指定扇区读数据
            SPI_speed=0x05;        // VS1003
            delayms(12);      //延时12ms
            xDCS=0;
            while(512 != count)
            {
                 if(0 != DREQ)
                 {
                  LED=1;
                  for(j=0;j<32;j++)
                  {
                       SPI_SendWreit(buffer[count]);
                       count++;
                  }
             }
             LED=0;
            }
        xDCS=1;
        delayms(12);
     }

出0入0汤圆

发表于 2008-5-7 17:14:12 | 显示全部楼层
to 【18楼】 hn_ny_dxs 夏风
    为和要加延时呢,加了数据才跟不上啊。

出0入0汤圆

 楼主| 发表于 2008-5-7 17:22:54 | 显示全部楼层
数据能跟上的,看DREQ的信号电平间隔是30ms ,延时一下(12+2.4+12=27ms)没有问题的,程序暂时没有做其它事情,只是读卡、送数据,但就是播放出来的声音有破音。

出0入0汤圆

 楼主| 发表于 2008-5-7 17:23:09 | 显示全部楼层
数据能跟上的,看DREQ的信号电平间隔是30ms ,延时一下(12+2.4+12=27ms)没有问题的,程序暂时没有做其它事情,只是读卡、送数据,但就是播放出来的声音有破音。

出0入0汤圆

发表于 2008-5-7 17:25:33 | 显示全部楼层
不是,你一次读512字节数据,但是这512字节不一定够mp3的一帧数据,而mp3的一帧数据播放时间是26ms,当然如果码率低的mp3是可以的。

出0入0汤圆

 楼主| 发表于 2008-5-7 17:30:58 | 显示全部楼层
这两个延时是刚才加上的,在此之前就是有破音的,没有头绪了。

出0入0汤圆

发表于 2008-5-7 17:34:18 | 显示全部楼层
还有,你的mp3数据存放是连续的么? 建议格式化卡再放文件,这样数据就使连续的了

出0入0汤圆

 楼主| 发表于 2008-5-7 17:36:30 | 显示全部楼层
这我也想到了,卡是格成FAT16格式的,然后只放一首歌在里面,数据不会有碎片的。

出0入0汤圆

发表于 2008-5-7 17:43:32 | 显示全部楼层
还有,看看是不是 内存不足,出现覆盖了,把mp3数据给破坏掉了之类的。

之前我用m64做歌词显示的时候碰到这个问题,显示数据的buffer盖到了mp3的数据buffer

出0入0汤圆

 楼主| 发表于 2008-5-7 17:57:05 | 显示全部楼层
谢谢!现在的程序只是单纯的读卡、送VS1003数据,除此之外什么也没干,C8051F015有2K的XDATA,我在里面开了512字节出来做缓冲,可以排除数据覆盖,但不能保证没有覆盖,因为C8051F015的XDATA是分页的,这个我还没有确认是否有问题,也许就是缓冲区引起的,但音乐听起来是连续的,我改过发送32字节的长度,改成只发31字节,就能听到象VCD花碟的那种声音,改回发送32字节扣就正常了。

出0入0汤圆

发表于 2008-5-7 19:00:01 | 显示全部楼层
不错哈,谢谢

出0入0汤圆

发表于 2008-5-8 10:10:32 | 显示全部楼层
mark

出0入0汤圆

 楼主| 发表于 2008-5-9 15:25:26 | 显示全部楼层
刚才播放了下64K 的MP3很流畅,换到80K的就卡了,真郁闷啊!
今天又快过完了,还是找不出问题。

出0入0汤圆

 楼主| 发表于 2008-5-11 16:01:32 | 显示全部楼层
哈哈...MP3播放声音卡的问题已解决!现在C8051F015工作在20M,播320Kbps的立体声MP3很流畅^_^

辛苦了这么多天,终于找出问题了,原因竞然是出在VS1003B的初始化延时上,不多说了,偶很激动,上程序:

以前的VS1003B初始化程序:

//---------------------------------------------------
//        函数名:VS1003b_init
//        功  能:VS1003B 初始化
//        参  数:
//        返回值:
//---------------------------------------------------

void VS1003b_init()
{
        xRST=0;                // 硬件复位
        xCS=1;
        xDCS=1;
        delayms(5);
        xRST=1;
        delayus(200);     //******** 注意这里的延时只有200us

        xCS=0;
        while(!DREQ);                // 等待VS1003 就绪
        SPI_SendWreit(VS_Write);
        SPI_SendWreit(VS_Clk);
        SPI_SendWreit(0xC0);        //0x98
        SPI_SendWreit(0x00);

//---------------------------------------------------

现在改成功的VS1003初始化程序:

//---------------------------------------------------
//        函数名:VS_init
//        功  能:VS1003B 初始化
//        参  数:
//        返回值:
//---------------------------------------------------

void VS1003b_init()
{
        xRST=0;                // 硬件复位
        xCS        =1;
        xDCS=1;
        delayms(5);
        xRST=1;
        delayms(5);      //******** 现在改为延时5ms ,试验过只要不少于1ms就可以了**************

        xCS=0;
        while(!DREQ);                        //等待VS1003 就绪
        SPI_SendWreit(VS_Write);
        SPI_SendWreit(VS_Clk);
        SPI_SendWreit(0xC0);        //0x98
        SPI_SendWreit(0x00);
//---------------------------------------------------------

接下来可以安心的写FAT了,不知又会遇到什么问题。

相信还有不少制做MP3的朋友也遇到这样的问题,希望在看了此帖后能解决实际问题!


如果 armok 和各位版主认为本帖符合“酷”帖标准,请给条“裤子”穿穿,谢谢!

出50入0汤圆

发表于 2008-5-11 16:17:01 | 显示全部楼层
为什么VS1003复位延时不正确还能工作呢?

出0入0汤圆

 楼主| 发表于 2008-5-11 16:22:09 | 显示全部楼层
这也是我想知道的,或许设计 VS1003B 的工程师能够解释。

出0入0汤圆

发表于 2008-5-11 19:54:34 | 显示全部楼层
看到lz做的mp3,我也有了用c8051f020做个mp3的冲动。今天晚上就开始画图.......

出0入0汤圆

 楼主| 发表于 2008-5-11 20:36:19 | 显示全部楼层
支持!加油哦!

出0入0汤圆

发表于 2008-5-11 20:55:31 | 显示全部楼层
不错,问题总算解决了

出0入0汤圆

发表于 2008-5-11 23:04:45 | 显示全部楼层
不知TF卡(microSD)和SD卡有何区别呢,波仔那个程序好像只能兼容miniSD,我直接用了TF卡不行,不知什么原因……

出0入0汤圆

发表于 2008-5-11 23:06:19 | 显示全部楼层
SD  miniSD  microSD


(原文件名:SD.jpg)

出0入0汤圆

 楼主| 发表于 2008-5-11 23:27:31 | 显示全部楼层
【37楼】 icer

TF卡是micro SD, 和标准SD卡是兼容的,可以修改卡的初始化次数限制,用150K的低时钟,一般都能初始化成功的。我手上没有TF卡无法做测试, mini SD/SD/MMC 都能测试通过。

出0入0汤圆

发表于 2008-5-28 11:19:58 | 显示全部楼层
楼主好人啊

出0入0汤圆

发表于 2008-5-28 11:32:35 | 显示全部楼层
收藏

出0入0汤圆

发表于 2008-5-30 12:24:06 | 显示全部楼层
谢谢!

出0入0汤圆

发表于 2008-6-1 22:32:28 | 显示全部楼层
我也遇到了这样的问题了,连续好几天的调试都没有结果,有的歌曲播放正常,有的放起来很慢,没办法用你的思路再来试一下

出0入0汤圆

 楼主| 发表于 2008-6-1 22:41:46 | 显示全部楼层
播放起来慢的歌曲是不是高码率的,如果是高码率的,那就是你的MCU速度不够。

出0入0汤圆

发表于 2008-6-2 20:05:03 | 显示全部楼层
楼主能告诉我这块豪板在哪有卖吗?我这个暑假有很高的热情想自己弄来玩玩啊~~~我的邮箱是dreddred@126.com~~~谢谢了~~~

出0入0汤圆

发表于 2008-6-2 20:43:50 | 显示全部楼层
hn_ny_dxs 夏风 是不是南阳的?

出0入0汤圆

 楼主| 发表于 2008-6-2 22:31:35 | 显示全部楼层
【45楼】 dreddred  

这块板是我做的,市面没有的买。


【46楼】 xzyang  

被你猜中!是南阳人。

出0入0汤圆

发表于 2008-6-2 23:09:33 | 显示全部楼层
mark

出0入50汤圆

发表于 2008-6-3 09:04:22 | 显示全部楼层
这么好的东东,顶一下!
帮人利己两不误,^_^

出0入0汤圆

发表于 2008-6-3 14:34:51 | 显示全部楼层
楼主大侠。
为什么章兄的avr代码里面没有对 SDCS 编程,
而你的 C51 要呢?

出0入0汤圆

 楼主| 发表于 2008-6-3 19:07:39 | 显示全部楼层
【50楼】 34480016 晕来晕去


//读一个扇区
uint8 MMC_SD_ReadSingleBlock(uint32 sector, uint8* buffer)
{
        uint8 r1;
        uint16 i;
        //uint8 retry=0;

        r1 = MMC_SD_SendCommand(17, sector<<9);//读命令
       
        if(r1 != 0x00)
                return r1;

        SPI_CS_Assert();//****************************************************************这里就是SDCS
        //等数据的开始
        while(SPI_WriteByte(0xff) != 0xfe);//if(retry++ > 50){SPI_CS_Deassert();return 1;}

        for(i=0; i<512; i++)//读512个数据
        {
                *buffer++ = SPI_WriteByte(0xff);
        }

        SPI_WriteByte(0xff);//伪crc
        SPI_WriteByte(0xff);
       
        SPI_CS_Deassert();//***************************************************************这里就是SDCS

        return 0;
}

出0入0汤圆

发表于 2008-6-3 21:09:41 | 显示全部楼层
mark..

出0入0汤圆

发表于 2008-6-5 08:46:02 | 显示全部楼层
谢谢lz,
明白了。

lz的 硬spi总线访问sd卡,很通用, 值得借鉴.
只是需要51单片机有spi接口和 3个寄存器.

出0入0汤圆

发表于 2008-6-6 13:31:42 | 显示全部楼层
记号

出0入0汤圆

发表于 2008-7-14 16:13:55 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-3-11 21:23:14 | 显示全部楼层
记号,

出0入0汤圆

发表于 2009-3-11 22:39:36 | 显示全部楼层

出0入0汤圆

发表于 2009-4-19 20:50:50 | 显示全部楼层
正需要这方面的资料,想把sd卡里的图象读出来,不知道怎么弄,mark.

出0入0汤圆

发表于 2009-5-26 19:25:33 | 显示全部楼层
111111111111111111

出0入0汤圆

发表于 2009-7-17 17:31:57 | 显示全部楼层
。。。我的毕业设计就是他了!

出0入0汤圆

发表于 2009-7-18 08:22:26 | 显示全部楼层
mark!

出0入0汤圆

发表于 2009-7-18 09:35:33 | 显示全部楼层
兄弟们,现在用spi凡是操作SDHC的卡也有些了,我也做了些实验,用楼主的初始化函数和读函数都可以很好的操作SDHC的卡,但是就写不行,不知道为什么,不知道你们测试过没有,是不是SDHC写得命令不支持SPI 模式啊

出0入0汤圆

发表于 2009-8-10 22:23:58 | 显示全部楼层

出0入0汤圆

发表于 2009-8-11 01:54:01 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-8-21 14:56:06 | 显示全部楼层
收录,谢谢楼主

出0入0汤圆

发表于 2010-1-22 11:02:48 | 显示全部楼层
望楼主整理打包上来,以便大家共享。谢谢!

出0入0汤圆

发表于 2010-3-18 12:38:53 | 显示全部楼层
记录下,正在进行中

出0入0汤圆

发表于 2010-4-6 18:36:35 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-6-9 18:08:49 | 显示全部楼层
MARK~~

出5入8汤圆

发表于 2010-6-9 19:35:48 | 显示全部楼层
牛,MARK一下!

出0入0汤圆

发表于 2010-6-10 06:28:32 | 显示全部楼层
MARK

出0入0汤圆

发表于 2010-6-10 08:23:15 | 显示全部楼层
学习了,SD cark

出0入0汤圆

发表于 2010-6-10 13:27:16 | 显示全部楼层
不错哈,谢谢

出0入0汤圆

发表于 2010-7-29 15:42:51 | 显示全部楼层
回复【3楼】ibq3100
-----------------------------------------------------------------------

记号~

出0入0汤圆

发表于 2010-7-29 16:02:55 | 显示全部楼层
回复【3楼】ibq3100
-----------------------------------------------------------------------

记号~

出0入0汤圆

发表于 2010-9-18 22:46:49 | 显示全部楼层
COOL!

出0入0汤圆

发表于 2010-9-19 23:03:01 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-9-26 20:21:52 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-10-6 21:41:19 | 显示全部楼层
mark~~sd~~

出0入0汤圆

发表于 2010-10-29 17:23:55 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-11-2 21:04:57 | 显示全部楼层
强帖留名!

出0入0汤圆

发表于 2010-11-2 21:07:02 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-12-23 16:39:47 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-12-24 00:11:35 | 显示全部楼层
我也留个记号

出0入0汤圆

发表于 2011-1-19 17:42:32 | 显示全部楼层
MARK

出0入0汤圆

发表于 2011-12-21 16:14:33 | 显示全部楼层
回复【楼主位】hn_ny_dxs 夏风
-----------------------------------------------------------------------

MARK

出0入0汤圆

发表于 2012-1-31 12:22:31 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-2-1 09:57:01 | 显示全部楼层

出0入30汤圆

发表于 2012-2-1 15:54:54 | 显示全部楼层
MARK.必须顶。谢谢分享。

出0入0汤圆

发表于 2012-2-9 17:36:13 | 显示全部楼层
这个要支持, 有原文件吗?

出0入0汤圆

发表于 2013-2-17 10:43:28 | 显示全部楼层
MARK!正用的着

出0入0汤圆

发表于 2013-3-30 22:30:45 | 显示全部楼层
多谢楼主!mark!

出0入0汤圆

发表于 2013-4-17 06:34:59 来自手机 | 显示全部楼层
手机上网一会看

出0入0汤圆

发表于 2013-9-24 22:52:13 | 显示全部楼层
学习学习。。。。

出0入0汤圆

发表于 2013-9-26 20:52:16 | 显示全部楼层
mark,顶

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-4-29 23:46

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

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