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) 你的晶振是振在33MHz上吗?高频晶振有一定的要求。你现在做一个实验,把晶振换成11.0592MHz的,再换成24MHz的,你看看现象有什么不同。实践是检验真理的唯一标准,先做实验再说。 回复【1楼】renpeng009大鹏集成
-----------------------------------------------------------------------
谢谢你的建议,昨天试了下换成11.0592M的晶振,居然可以了,但实际刷屏速度比33M晶振模拟SPI的方式还慢,算了,不折腾这种方式了,只要懂得原理和算法,换平台也方便! 飘过 mark 你33M的晶振外壳接地了吗? 怎么能提高速度呀 回复【6楼】xuhai76
-----------------------------------------------------------------------
硬件SPI肯定比模拟的速度快,这个我已经实验过了 硬件的快 模拟的 慢!!所以要注意 我也是用33M的,硬件SPI能开到8M/S左右!我是用汇编写的! 速度快多了!个人觉的51资源简单的单片机还是用汇编好!AVR,ARM 能和C完美结合 我使用 STC 永远卡在 while(!(SPSTAT & 0x80)); while(!(SPSTAT & 0x80));
spidata=SPSTA;
你这个SPSTA是什么?
这里spidata应该等于SPDAT吧? 楼主用33M成功了? mark 各位大哥 硬件SPI比模拟SPI快多少 为什么我的CMD1写入失败啊?
页:
[1]