回复【2楼】正点原子:
---------------------------------
//读SD卡的一个block
//输入:u32 sector 取地址(sector值,非物理地址)
// u8 *buffer 数据存储地址(大小至少512byte)
//返回值:0: 成功
// other:失败
u8 SD_ReadSingleBlock(u32 sector, u8 *buffer)
{
u8 r1;
//设置为高速模式
SPIx_SetSpeed(SPI_SPEED_4);
//如果不是SDHC,给定的是sector地址,将其转换成byte地址
if(SD_Type!=SD_TYPE_V2HC)
{
sector = sector<<9;
}
r1 = SD_SendCommand(CMD17, sector, 0);//读命令
printf("r1=%d\r\n",r1);
if(r1 != 0x00)return r1;
printf("死在这\r\n",r1);
***** r1 = SD_ReceiveData(buffer, 512, RELEASE);
printf("r1=%d\r\n",r1);
if(r1 != 0)return r1; //读数据出错!
else return 0;
}
用 printf追踪发现死在星号注释的句子那里了!!!
------------------------------------------------------------------------------------------------------------
继续追踪SD_ReceiveData()函数又出现了新的问题
//从SD卡中读回指定长度的数据,放置在给定位置
//输入: u8 *data(存放读回数据的内存>len)
// u16 len(数据长度)
// u8 release(传输完成后是否释放总线CS置高 0:不释放 1:释放)
//返回值:0:NO_ERR
// other:错误信息
u8 SD_ReceiveData(u8 *data, u16 len, u8 release)
{
// 启动一次传输
SD_CS=0;
if(SD_GetResponse(0xFE))//等待SD卡发回数据起始令牌0xFE
{
SD_CS=1;
return 1;
}
// printf("len=%d\r\n",len);
while(len--)//开始接收数据
{
*data=SPIx_ReadWriteByte(0xFF);
data++;
}
// printf("len=%d\r\n",len);
//下面是2个伪CRC(dummy CRC)
SPIx_ReadWriteByte(0xFF);
SPIx_ReadWriteByte(0xFF);
if(release==RELEASE)//按需释放总线,将CS置高
{
SD_CS=1;//传输结束
SPIx_ReadWriteByte(0xFF);
}
return 0;
}
加了红色那两句之后连初始化也无法通过了
一直在下面的初始化那里面循环而不会卡死
Stm32_Clock_Init(9);//系统时钟设置
delay_init(72); //延时初始化
uart_init(72,9600); //串口1初始化
LED_Init();
LCD_init(); //nokia_lcd初始化
JTAG_Set(2);
SD_Init(); //初始化SD卡
while(FAT_Init())//FAT 错误
{
LCD_write_english_string(0,0,"FAT SYS ERROR");
i= SD_Init();
if(i)//SD卡初始化
{
LCD_write_english_string(0,1,"SD_CARD ERROR");
}
delay_ms(500);
LED0=!LED0;
}
|