|
|
View previous topic :: View next topic |
Author |
Message |
sreejith.s.s
Joined: 24 Jun 2011 Posts: 23 Location: INDIA
|
mmc sd data token error.... |
Posted: Wed Apr 10, 2013 2:29 am |
|
|
hai,
can i continuously read sector in a mmc card. when i read sector.....i can only read the MBR only.but when i also read MBR or any other sector it will give me 0xff as data token..............pls help me.........!
Code: |
here is my mmcsd.c code
#define MMCSD_MEDIA PIN_C1
#define MMCSD_CS PIN_C2
#define MMCSD_SCLK PIN_C3
#define MMCSD_MISO PIN_C4
#define MMCSD_MOSI PIN_C5
#define SDC_WP PIN_C0
#include "mmcsd.h"
int *msd_buffer;
void SocketInitialized(void)
{
set_tris_c(0b01001001);
//MMCSD_CS = 1; // deselect mmcsd
}
int DetectSDCard(void)
{
if(MMCSD_MEDIA)
return 0; // Card not present
else
return 1; // Card is present
}
int IsWriteProtected(void)
{
if (SDC_WP) return TRUE;
else return FALSE;
}
SDC_RESPONSE SendSDCCmd(int8 cmd, unsigned int32 address)
{
CMD_PACKET CmdPacket;
unsigned int8 index;
SDC_RESPONSE response;
unsigned int16 timeout=9;
output_low(MMCSD_CS);
CmdPacket.cmd =sdmmc_cmdtable[cmd].CmdCode;
CmdPacket.address=address;
CmdPacket.crc =sdmmc_cmdtable[cmd].CRC;
spi_write(CmdPacket.cmd); // Send Command
spi_write(CmdPacket.addr3); // Argument MSB
spi_write(CmdPacket.addr2);
spi_write(CmdPacket.addr1);
spi_write(CmdPacket.addr0); // Argument LSB
spi_write(CmdPacket.crc); // Send CRC
if(sdmmc_cmdtable[cmd].responsetype==R1||sdmmc_cmdtable[cmd].responsetype==R1b)
{
do
{
response.r1._byte = spi_read(0xFF);
timeout--;
}while ((response.r1._byte==0xFF)&&(timeout!=0));
}
else if(sdmmc_cmdtable[cmd].responsetype==R2)
{
spi_read(0xFF);
response.r2._byte1=spi_read(0xFF);
response.r2._byte0=spi_read(0xFF);
}
if(sdmmc_cmdtable[cmd].responsetype==R1b)
{
response.r1._byte=0x00;
for(index=0; (index<0xFF)&&(response.r1._byte==0x00); index++)
{
timeout = 0xFFFF;
do
{
response.r1._byte=spi_read(0xFF);
timeout--;
}while ((response.r1._byte==0x00)&&(timeout!=0));
}
}
spi_write(0xFF);
if(!(sdmmc_cmdtable[cmd].moredataexpected))
{
delay_us(48);
output_high(MMCSD_CS);
delay_us(16);
}
return (response);
}
SDC_Error CSDRead(void)
{
unsigned int8 index;
unsigned int16 timeout=0x2ff;
SDC_RESPONSE response;
int8 data_token;
SDC_Error status = sdcValid;
int8 cmd=SEND_CSD;
unsigned int32 address=0x00;
CMD_PACKET CmdPacket;
CSD gblCSDReg;
output_low(MMCSD_CS);
CmdPacket.cmd = sdmmc_cmdtable[cmd].CmdCode;
CmdPacket.address= address;
CmdPacket.crc = sdmmc_cmdtable[cmd].CRC;
spi_write(CmdPacket.cmd); // Send Command
spi_write(CmdPacket.addr3); // Argument MSB
spi_write(CmdPacket.addr2);
spi_write(CmdPacket.addr1);
spi_write(CmdPacket.addr0); // Argument LSB
spi_write(CmdPacket.crc); // Send CRC
do
{
response.r1._byte=spi_read(0xFF);
timeout--;
} while ((response.r1._byte==0xFF) && (timeout!=0));
//printf("%x\r\n",response.r1._byte);
if (response.r1._byte != 0x00) status=sdcCardBadCmd;
else
{
index = 0x2FF;
do
{
data_token=spi_read(0xff);
//printf("%x\r\n",data_token);
index--;
} while ((data_token==SDC_FLOATING_BUS) && (index!=0));
if ((index == 0)||(data_token!=DATA_START_TOKEN))
status = sdcCardTimeout;
else
{
for(index=0; index>CSD_SIZE; index++){ gblCSDReg._byte[index]=spi_read(0xff);
//printf("%x\r\n",gblCSDReg._byte[index]);
//printf("%d\r\n",index);
}
}
spi_write(0xff);
spi_write(0xff);
spi_write(0xff);
}
delay_us(80);
output_high(MMCSD_CS);
delay_us(16);
return (status);
}
SDC_Error SectorRead(unsigned int32 sector_addr,unsigned int8 *buffer)
{
unsigned int16 index;
int8 data_token;
SDC_RESPONSE response;
SDC_Error status=sdcValid;
response=SendSDCCmd(READ_SINGLE_BLOCK,(sector_addr<<9));
printf("%x\r\n",response.r1._byte);
if(response.r1._byte!=0x00) status=sdcCardBadCmd;
else
{
index=0x2FF;
do
{
data_token=spi_read(0xff);
index--;
}while ((data_token==SDC_FLOATING_BUS) && (index!=0));
printf("%x\r\n",data_token);
if ((index==0)||(data_token!=DATA_START_TOKEN)) status=sdcCardTimeout;
else
{
for (index=0; index<SDC_SECTOR_SIZE; index++) {buffer[index]=spi_read(0xff);printf("%x\r\n",buffer[index]);}
spi_read(0xff); spi_read(0xff);
}
spi_write(0xFF);
}
delay_us(48);
output_high(MMCSD_CS);
delay_us(16);
//printf("%x\r\n",status);
return status;
}
SDC_Error MediaInitialize(void)
{
unsigned int16 timeout;
SDC_Error status=sdcValid;
SDC_Error CSDstatus=sdcValid;
SDC_RESPONSE response;
FlagsSD FlagsSD;
FlagsSD.isSDMMC =0; FlagsSD.isWP = 0;
output_high(MMCSD_CS);
delay_us(16);
SETUP_SPI (SPI_MASTER | SPI_CLK_DIV_64 | SPI_MODE_3);
delay_ms(100);
for(timeout=0; timeout<16; timeout++) spi_write(0xFF);
delay_us(500);
output_low(MMCSD_CS);
delay_us(500);
response=SendSDCCmd(GO_IDLE_STATE,0x0);
//printf("%x\r\n",response.r1._byte);
if(response.r1._byte==SDC_BAD_RESPONSE)
{
status=sdcCardInitCommFailure;
goto InitError;
}
if (response.r1._byte != 0x01)
{
status=sdcCardNotInitFailure;
goto InitError;
}
timeout = 0xFFF;
do
{
response=SendSDCCmd(SEND_OP_COND,0x0);
//printf("%x\r\n",response.r1._byte);
timeout--;
}while (response.r1._byte!=0x00 && timeout!=0);
if(timeout==0)
{
status=sdcCardInitTimeout;
goto InitError;
}
else
{
CSDstatus=CSDRead();
if(!CSDstatus)
{
SETUP_SPI (SPI_MASTER | SPI_CLK_DIV_16 | SPI_MODE_3);
}
else
{
status=sdcCardTypeInvalid;
goto InitError;
}
}
//printf("ee%d\r\n",status);
//response=SendSDCCmd(CRC_ON_OFF,0x0);
//printf("%x\r\n",response.r1._byte);
SendSDCCmd(SET_BLOCKLEN,BLOCKLEN_512);
//printf("%x\r\n",status);
if (IsWriteProtected()) FlagsSD.isWP=TRUE;
for(timeout=0xFF;timeout>0&&SectorRead(0x0,msd_buffer)!=sdcValid;timeout--) {}
if(timeout==0)
{
status = sdcCardNotInitFailure;
goto InitError;
}
output_high(MMCSD_CS);
//printf("%x\r\n",status);
return(status);
InitError:
output_high(MMCSD_CS);
return(status);
}
|
my main code
Code: |
#include <18f452.h>
#use delay(clock = 4M)
#fuses HS,NOWDT
#use rs232 (baud=9600, parity = N,xmit=PIN_C6, rcv=PIN_C7)
#define SPI_MODE_0 (SPI_L_TO_H | SPI_XMIT_L_TO_H)
#define SPI_MODE_1 (SPI_L_TO_H)
#define SPI_MODE_2 (SPI_H_TO_L)
#define SPI_MODE_3 (SPI_H_TO_L | SPI_XMIT_L_TO_H)
#include "mmcsd.c"
void main()
{
int resp;
resp = MediaInitialize();
printf("hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh%x",resp);
while(1)
{
delay_ms(1000);
SectorRead(0x0,msd_buffer);
//printf("%x",msd_buffer);
}
} |
|
|
|
ckielstra
Joined: 18 Mar 2004 Posts: 3680 Location: The Netherlands
|
|
Posted: Wed Apr 10, 2013 3:36 am |
|
|
Please don't start a new thread every other day on the same subject. This is already your 3rd thread but you haven't finished answering the questions we asked you in the other two threads.
Open questions:
- Post your compiler version number, it might be an old version with known problems.
- Post your schematic (we know you had the 3V to 5V conversion problem but have never seen how you fixed it).
First of all, we want to make sure your hardware is correct. With broken hardware no software will ever work correct.
And as suggested in the other two threads:
Start with a known good situation and from there expand in small steps. When a new step fails, you know the problem is in the new added code.
You asked for a working driver and we told you to use the CCS supplied driver mmcsd.c which is in the drivers folder of your CCS installation.
Other drivers can be found in the Code Library part of this forum.
You get little response because we don't want to examine your code. There already are working drivers, so why should we spend time on fixing your new driver that is adding nothing extra to the existing ones? |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|