flybabys 发表于 2010-12-23 13:43:05

STC12LE5A60S2 使用SPI口驱动SD卡的问题,向各位高手请教!

最近使用振南的SD卡例程配合自己写的TFT做个电子相册玩,晶振使用33M的,模拟SPI口已经成功,只是刷新率太低了,刷一幅图片居然要将近5秒多,初步判断是读取SD卡的速度太慢所致,参照一些资料,想使用MCU自带的硬件SPI端口,加速SD卡的读取速度,但实际使用后,按照初始化128时钟分频,CMD0和CMD1写入成功,但后面读数据出错,求教各位大侠!
片段源程序附下:
#ifdef _STC12C_SPI       //编译开关,定义STC12C_SPI的话使用硬件SPI,否则使用模拟SPI
void SD_spi_write(unsigned char spidata)      ////////注意读的时候,也要写一个字节
{
if (is_init)                     //利用主时钟分频技术达到初始化SD时候降速的目的
        CLK_DIV=0x07;
else
        CLK_DIV=0x00;   //如果初始化成功,则全速读写,实际调试我全部0x07也不行;头文件已经定义sfr CLK_DIV =0x97;
       
SPSTAT=0xC0;
SPDAT=spidata;
while(!(SPSTAT & 0x80));
}

unsigned char SD_spi_read()////////注意读的时候,也要写一个字节
{
unsigned char spidata;
if (is_init)
        CLK_DIV=0x07;
else
        CLK_DIV=0x00;
       
SPSTAT=0xC0;
SPDAT=0xAA;
while(!(SPSTAT & 0x80));
spidata=SPSTA;
return spidata;
}

#else
/******************************************************************
- 功能描述:IO模拟SPI,发送一个字节
- 隶属模块:SD卡模块
- 函数属性:内部
- 参数说明:x是要发送的字节
- 返回说明:无返回
- 注:其中is_init为1时,写的速度放慢,初始化SD卡SPI速度不能太高
******************************************************************/

void SD_spi_write(unsigned char x)
{
unsigned char i;
for (i = 0; i < 8; i++)
{
    if (x & 0x80)
    {
      SI_SD_HIGH;
    }
    else
    {
      SI_SD_LOW;
    }
    SCK_SD_LOW ;
    if(is_init) delay(DELAY_TIME);
    _nop_();
    SCK_SD_HIGH;
    if(is_init) delay(DELAY_TIME);
    _nop_();
    x<<=1;
}

}

/******************************************************************
- 功能描述:IO模拟SPI,读取一个字节
- 隶属模块:SD卡模块
- 函数属性:内部
- 参数说明:无
- 返回说明:返回读到的字节
******************************************************************/

unsigned char SD_spi_read() //SPI读一个字节
{
unsigned char i,rByte=0;

for(i=0;i<8;i++)
{
    SD_SO=1;
    SCK_SD_LOW ;
    if(is_init) delay(DELAY_TIME);
    _nop_();
    SCK_SD_HIGH;
    if(is_init) delay(DELAY_TIME);
    _nop_();
    rByte<<=1;
    rByte|=SD_SO;
}
return rByte;
}
#endif


完整的SD卡读写源程序如下。其实是参照振南的SD卡的读写程序稍作修改的,因此版权归振南兄所有!
点击此处下载 ourdev_606638EC0E5C.rar(文件大小:3K) (原文件名:sd.rar)

renpeng009 发表于 2010-12-23 14:14:19

你的晶振是振在33MHz上吗?高频晶振有一定的要求。你现在做一个实验,把晶振换成11.0592MHz的,再换成24MHz的,你看看现象有什么不同。实践是检验真理的唯一标准,先做实验再说。

flybabys 发表于 2010-12-24 11:09:29

回复【1楼】renpeng009大鹏集成
-----------------------------------------------------------------------

谢谢你的建议,昨天试了下换成11.0592M的晶振,居然可以了,但实际刷屏速度比33M晶振模拟SPI的方式还慢,算了,不折腾这种方式了,只要懂得原理和算法,换平台也方便!

zhouting928 发表于 2011-1-5 17:21:18

飘过

muzheyun 发表于 2011-1-6 15:02:07

mark

macimaci 发表于 2011-1-7 14:53:12

你33M的晶振外壳接地了吗?

xuhai76 发表于 2011-1-7 20:25:21

怎么能提高速度呀

renpeng009 发表于 2011-1-7 21:10:16

回复【6楼】xuhai76
-----------------------------------------------------------------------

硬件SPI肯定比模拟的速度快,这个我已经实验过了

bingshuihuo888 发表于 2011-4-15 09:49:15

硬件的快 模拟的 慢!!所以要注意

lxl_lxl 发表于 2011-4-18 12:05:13

我也是用33M的,硬件SPI能开到8M/S左右!我是用汇编写的! 速度快多了!个人觉的51资源简单的单片机还是用汇编好!AVR,ARM 能和C完美结合

d-link 发表于 2011-4-20 22:55:18

我使用 STC 永远卡在 while(!(SPSTAT & 0x80));

allen6kid 发表于 2011-5-19 15:05:46

while(!(SPSTAT & 0x80));
spidata=SPSTA;


你这个SPSTA是什么?
这里spidata应该等于SPDAT吧?

yanshengdian 发表于 2011-5-19 16:20:25

楼主用33M成功了?

jssz_hf 发表于 2011-5-25 13:48:33

mark

hj45103 发表于 2011-8-15 16:48:10

各位大哥 硬件SPI比模拟SPI快多少

972661569 发表于 2011-9-22 00:11:28

为什么我的CMD1写入失败啊?
页: [1]
查看完整版本: STC12LE5A60S2 使用SPI口驱动SD卡的问题,向各位高手请教!