|
|
View previous topic :: View next topic |
Author |
Message |
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Thu Jun 09, 2005 1:53 pm |
|
|
I translated the code given in ckielstra's link, to CCS.
http://www.cc5x.de/MMC/
I also wired up my test board according to their schematic.
It works.
In the translation to CCS, I tried to make as few changes as possible.
I translated a few of the German comments.
Also, they had the read operation occur first, followed by the write.
That was confusing to me, so I changed it to write the data, and then
read it back and display it.
They had the data set to all "MMMMM". I wanted to know that it
could do something besides that, so I added "Begin" and "End"
to the data block.
We should thank those guys for posting their code and the schematic.
We had a thread on MMC a few weeks ago, and nothing worked.
Code: | #include <16F877.H>
#fuses HS, NOWDT, NOPROTECT, BROWNOUT, PUT, NOLVP
#use delay(clock = 20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, ERRORS)
#use fast_io(C)
#byte SSPBUF = 0x13
#byte SSPCON = 0x14
#byte SSPSTAT = 0x94
#bit BF = SSPSTAT.0
#bit SMP = SSPSTAT.7
#bit CKE = SSPSTAT.6
#bit CKP = SSPCON.4
#bit SSPM1 = SSPCON.1
#bit SSPEN = SSPCON.5
#byte PORTC = 7
#bit CS = PORTC.2
//****************************************
// This is the same as the CCS spi_read() function.
char SPI(char d)
{
SSPBUF=d;
while (!BF);
return SSPBUF;
}
//******************************************
char Command(char befF, int16 AdrH, int16 AdrL, char befH)
{
SPI(0xFF);
SPI(befF);
SPI(AdrH >> 8);
SPI(AdrH);
SPI(AdrL >> 8);
SPI(AdrL);
SPI(befH);
SPI(0xFF);
return SPI(0xFF); // Return with the response
}
//********************************************
char MMC_Init()
{
char i;
// Init SPI
SMP=0;
CKE=0;
CKP=1;
SSPM1=1;
//SSPM0=1;
SSPEN=1;
CS=1; // MMC-Disabled
// MMC in SPI Mode -- start and Reset.
for(i=0; i < 10; i++) SPI(0xFF); // 10*8=80 clocks
CS=0; // MMC-Enabled
// CMD0
if (Command(0x40,0,0,0x95) !=1) goto Error; // Reset
st:
// CMD1
if (Command(0x41,0,0,0xFF) !=0) goto st ; // CMD1
return 1;
Error:
return 0;
}
//*********************************************
void main(void)
{
int16 i;
setup_port_a(NO_ANALOGS);
set_tris_c(0b11010011); // sck rc3-0, sdo rc5-0, CS rc2-0.
set_tris_b(0b00000010);
puts("Start\n\r");
if(MMC_Init())
puts("MMC ON\n\r"); // MMC Init OK
//*****************************************
// Write in 512 Byte-Mode
if (Command(0x58,0,512,0xFF) !=0) puts("Write error ");
SPI(0xFF);
SPI(0xFF);
SPI(0xFE);
SPI("Begin\n\r"); // 7 characters
for(i=0; i < 500; i++) // Was 512, but used 12 for text
{
SPI('M');
}
SPI("\n\rEnd"); // 5 characters
SPI(255); // Send two bytes of 0xFF at the end
SPI(255);
i=SPI(0xFF);
i &=0b00011111;
if (i != 0b00000101) puts("Write Error ");
while(SPI(0xFF) !=0xFF); // Wait for end of Busy condition
//*************************************
// Read in 512 Byte-Mode
if (Command(0x51,0,512,0xFF) !=0) puts("Read Error ");
while(SPI(0xFF) != 0xFE);
for(i=0; i < 512; i++)
{
putc(SPI(0xFF)); // Send data
}
SPI(0xFF); // Send two bytes of 0xFF at the end
SPI(0xFF);
//**********************************************
while(1); // The program stops here.
} |
|
|
|
arrow
Joined: 17 May 2005 Posts: 213
|
|
Posted: Fri Jun 10, 2005 1:18 am |
|
|
Hi Ckielstra and PCM programmer
Thank you VERY MUCH for your help!
I am feeling really stupid though- I have tried both your suggestions (including the TRIS command, and the whole new code posted by PCM programmer), and I still get an error.
In both cases at the initiliazation stage.
Basically when I am reading from the Card.
In Ed Waugh's code, on the line
while(SPI_READ(0xFF) != response && --count > 0);
it returns count = 0;
and in the PCM programmers code at the initialization stage:
Command(0x40,0,0,0x95) !=1
it goes to "Error"
PLEASE can you suggest what I should do, and thank you once again.
All the best
arrow |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Fri Jun 10, 2005 1:51 am |
|
|
Well, it's not my code. It's the code from this website
http://www.cc5x.de/MMC/ that I translated to CCS.
You should go to that website and make sure that you follow
their schematic. I suspect you have a wiring error.
Make sure you know which pin on your MMC is pin 1.
Be certain that you don't have it wired backwards. |
|
|
arrow
Joined: 17 May 2005 Posts: 213
|
|
Posted: Fri Jun 10, 2005 2:01 am |
|
|
Hi PCM Programmer
I actually use a flash card holder from:
http://www.sparkfun.com/shop/index.php?shop=1&itemid=331
so there is only one way to insert the card.
I use the 128MByte MMC card from "Super Talent". Together with the Low power version of the PIC (LF) series.
By mistake, I did apply a 5V to the MMC briefly, do you think that could have burn the card?
Can the MMC be pre-formated or write protected or something like that?
Also, would you know if writing to FLASH is faster than to EEPROM?
I would like to write in "blocks" of data to both. And if its faster, by how much?
Thank you
arrow |
|
|
ckielstra
Joined: 18 Mar 2004 Posts: 3680 Location: The Netherlands
|
|
Posted: Fri Jun 10, 2005 3:24 am |
|
|
Quote: | By mistake, I did apply a 5V to the MMC briefly, do you think that could have burn the card? | Hard to give a specific answer, in general it is a bad thing to apply a too high voltage. Try a new card and see if things improve.
Quote: | Can the MMC be pre-formated or write protected or something like that? | No. SD cards however are pin compatible to MMC but slightly different protocol and do have a write-protect switch.
Quote: | Also, would you know if writing to FLASH is faster than to EEPROM?
I would like to write in "blocks" of data to both. And if its faster, by how much? | Technology improves continuously, you'll have to look at the datasheets of your flash and eeprom devices.
Very likely the limiting factor in writing to the MMC card will be the SPI bus. For SPI the maximum clock rate is Fosc/4. your processor is running at 4MHz I believe? The maximum SPI clock will then be 1MHz or 125kbyte/sec. This excludes the actual write to flash, timing for this depends on the card you are using. New higher speed cards exist for use in photo camera's.
Please note that for MMC cards you can only write data in blocks of 512 bytes. This makes modyfying data in MMC difficult in PIC processors because of the limited RAM capacity (read 512 bytes, modify, write back whole block). Reading smaller blocks up to a single byte is possible.
A trick used in some datalogging applications is the fact that writing the data block to the MMC has no maximum timing limit as long as the chip-select line stays active. Data will only be written to flash when the full 512 bytes are received by the MMC, so beware of power loss. |
|
|
Guest
|
Some details please |
Posted: Fri Sep 22, 2006 1:57 pm |
|
|
Hello,
Can someone explain me the details conserning the adresses in below code ?
Code: | //******************************************
char Command(char befF, int16 AdrH, int16 AdrL, char befH)
{
SPI(0xFF);
SPI(befF);
SPI(AdrH >> 8);
SPI(AdrH);
SPI(AdrL >> 8);
SPI(AdrL);
SPI(befH);
SPI(0xFF);
return SPI(0xFF); // Return with the response
}
//********************************************
|
It seems a bit unlogic for me when writing 512 bytes in the 1st sector, AdrH is zero and AdrL is 512.
Isn't H standing for High and L standing for Low ?
Thanks. |
|
|
Bart
Joined: 12 Jul 2005 Posts: 49
|
|
Posted: Fri Sep 22, 2006 2:07 pm |
|
|
Guestpost was from me. |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Fri Sep 22, 2006 3:36 pm |
|
|
Quote: |
It seems a bit unlogic for me when writing 512 bytes in the 1st sector,
AdrH is zero and AdrL is 512.
|
They've skipped the first 512 bytes. Your question is, why did they
do this. Here's a possible answer:
Down at the bottom of the http://www.cc5x.de/MMC/ web page,
they have a comments section. It's all in German, but by using
the Altavista translator http://babelfish.altavista.com/ I can translate it.
The last section says this:
Quote: |
One writes and one reads starting from address 512. Starting from
address 512 the reserved range begins when formatting with FAT16,
so that even the data and file system on your MMC map remain. |
Regarding your question about the addresses, here's a short summary
of how to interface an MMC card to a microcontroller:
http://www.analog.com/UploadedFiles/Application_Notes/58264366383775EE264v01.pdf
It shows that the address field is 32-bits wide for the WRITE_BLOCK
command. So, the CC5X compiler code uses two 16-bit words to
pass the address to the Command() function. If we were to write
that function in CCS, we would use an 'int32' data type instead. |
|
|
hippie Guest
|
|
Posted: Fri Sep 22, 2006 5:39 pm |
|
|
Hi, just passing by:
this might interest you: h**p://elm-chan.org/fsw/ff/00index_e.html |
|
|
Jerry I
Joined: 14 Sep 2003 Posts: 96 Location: Toronto, Ontario, Canada
|
|
Posted: Sun Sep 24, 2006 6:46 pm |
|
|
Interesting site.
Could anyone download the source?.
I keep getting corrupt files.
Thanks |
|
|
asmallri
Joined: 12 Aug 2004 Posts: 1635 Location: Perth, Australia
|
|
Posted: Tue Sep 26, 2006 6:36 am |
|
|
Yes I can download it without problem. I have completed a major port of this software to the PIC18F and the CCS compiler. It took me weeks!! _________________ Regards, Andrew
http://www.brushelectronics.com/software
Home of Ethernet, SD card and Encrypted Serial Bootloaders for PICs!! |
|
|
|
|
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
|