|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
求一份详细的关于TF卡的SPI模式操作的资料。或者谁能帮忙解决这个问题?
我的是STM32F107VCT6,没有SDIO的,所以想用SPI驱动TF卡,从网上下载了源码,移植成了自己的,但在移植FATFS的时候遇到了问题,不能创建文件(也不是完全不能),后来发现是多块写入函数出了问题(单块读,写,多块读都没有问题)。但到现在都还没解决。。。
现象是在连续调用多块写函数时(短时间连续调用,如果在两次写块之间加入延时,则会成功,但貌似正常情况下是不用延时的),第一次可以正常写入,但后面的数据不能写入,调试发现是写数据后没有收到TF卡的回应。请高手帮忙。
以下是源码:
//写入SD卡的N个block
//输入:u32 sector 扇区地址(sector值,非物理地址)
// u8 *buffer 数据存储地址(大小至少512byte)
// u8 count 写入的block数目
//返回值:0: 成功
// other:失败
u8 SD_WriteMultiBlock(u32 sector, const u8 *data, u8 count)
{
u8 r1;
u16 i;
u16 retry;
sector<<=9;
r1 |= SD_CMD(CMD55,0x00,0x95,0);
r1 |= SD_CMD(ACMD23,count,0x00,0);
r1 = SD_CMD(CMD25, sector, 0x00,0);//发多块写入指令
if(r1 != 0x00)
return 1; //应答不正确,直接返回
GPIO_ResetBits(GPIOA,GPIO_Pin_4);//片选,开始准备数据传输
SPI_RW(0xff);//先放3个空数据,等待SD卡准备好
SPI_RW(0xff);
SPI_RW(0xff);
//--------下面是N个sector写入的循环部分
do
{
//放起始令牌0xFC 表明是多块写入
SPI_RW(0xFC);
//放一个sector的数据
for(i=0;i<512;i++)
{
SPI_RW(*data++);
}
//发2个Byte的dummy CRC
SPI_RW(0xff);
SPI_RW(0xff);
//等待SD卡应答
r1 = SPI_RW(0xff);
if((r1&0x1F)!=0x05)
{
GPIO_SetBits(GPIOA,GPIO_Pin_4);//如果应答为报错,则带错误代码直接退出
return r1;
}
retry=0;
//等待SD卡写入完成
if(SD_WaitDataReady()==1)
{
GPIO_SetBits(GPIOA,GPIO_Pin_4); //等待SD卡写入完成超时,直接退出报错
return 1;
}
}while(--count);//本sector数据传输完成
//发结束传输令牌0xFD
r1 = SPI_RW(0xFD);
if(r1==0x00)
{
count = 0xfe;
}
if(SD_WaitDataReady()) //等待准备好
{
GPIO_SetBits(GPIOA,GPIO_Pin_4);
return 1;
}
//写入完成,片选置1
GPIO_SetBits(GPIOA,GPIO_Pin_4);
SPI_RW(0xff);
/×下面是延时,貌似正常情况下不用,或者不用这么长时间×/
retry=2000;//1250
while(retry--)
SPI_RW(0xFF);//SPI读写函数
return count; //返回count值,如果写完则count=0,否则count=1
} |
|