|
|
View previous topic :: View next topic |
Author |
Message |
Bart
Joined: 12 Jul 2005 Posts: 49
|
Test MMC on 18F won't work. |
Posted: Mon Oct 24, 2005 2:39 pm |
|
|
Below code compiles without errors, but :
Where did I go wrong ?
In the set_tris_b or set_tris_c ?
Or in the #use fast_io(B) #use fast_io(C)
Or in the SPI configuration (20 Mhz clock and div. by 64 ) ?
Or in the #byte and #bit section ?
Or is it hardware failure ?
I receive my 3 beeps and 20x4 dispay is correct.
Thanks for any help !
This is my RS232 output : (don't receive "MMC ON - Init OK" )
Code: |
PIC Online
Version : MMC Test
For PIC 18F4550
Start
Write Error in end of write
Read Error
ø
ø
|
Code: |
// VERSION : 0.1.07
// TEST : using the mmc in write and read mode.
// Based on http://www.ccsinfo.com/forum/viewtopic.php?t=23183
#include <18F4550.h>
#fuses HS,NOWDT,NOPUT,NOLVP,NOBROWNOUT,NOCPD,NOWRT
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_E1, rcv=PIN_E0, ERRORS)
#include <LCD4x20D.C>
#use fast_io(B)
#use fast_io(C)
// For the PIC 16F877 see manual on page 20/234
// #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
// For the PIC 18F4550 see manual on page 68/426
#byte SSPBUF = 0xFC9
#byte SSPCON = 0xFC6
#byte SSPSTAT = 0xFC7
#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 = 0xF82
#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; SSPEN=1; //SSPM0=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_adc_ports(NO_ANALOGS|VSS_VDD);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
// -------------------------------------------------
SETUP_SPI(SPI_MASTER | SPI_H_TO_L | SPI_CLK_DIV_64 );
// -------------------------------------------------
setup_wdt(WDT_OFF);
setup_timer_0(RTCC_INTERNAL);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
setup_comparator(NC_NC_NC_NC);
setup_vref(VREF_LOW|-2);
setup_low_volt_detect(FALSE);
setup_oscillator(False);
// PIC 16F code
// set_tris_c(0b11010011); // sck=rc3-0, sdo=rc5-0, CS=rc2-0.
// set_tris_b(0b00000010);
// PIC 18F code
set_tris_c(0b01111011); // sdo=rc7(pin26)-0, CS=rc2(pin17)-0.
set_tris_b(0b00000001); // sck=rb1(pin34)-0, sdi=rb0(pin33)-I
// Version output to RS232
printf(" PIC Online\n\r");
printf(" Version : MMC Test\n\r");
printf(" For PIC 18F4550\n\r");
// Version output to LCD
lcd_init();
lcd_putc("\f**** PIC Online ****\n");
lcd_putc("V0.1.07 Bart De Pauw\n");
lcd_putc("MMC test READ+WRITE\n");
lcd_putc("For : PIC18F4550\n");
// beep 3 times to show circuit is ON
output_HIGH(PIN_A3);
delay_ms(100);
output_LOW(PIN_A3);
delay_ms(100);
output_HIGH(PIN_A3);
delay_ms(100);
output_LOW(PIN_A3);
delay_ms(100);
output_HIGH(PIN_A3);
delay_ms(100);
output_LOW(PIN_A3);
puts("Start\n\r");
if(MMC_Init())
puts("MMC ON - Init OK\n\r"); // MMC Init OK
if (Command(0x58,0,512,0xFF) !=0) puts("Write error in begin of write"); // Write in 512 Byte-Mode
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 in end of write");
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.
}
| [/code] _________________ I like Skype (www.skype.com), my username is BplotM |
|
|
ckielstra
Joined: 18 Mar 2004 Posts: 3680 Location: The Netherlands
|
|
Posted: Mon Oct 24, 2005 3:38 pm |
|
|
Can you give us more info? Right now you don't give us a lot to go on.
Do you see the output of the debug texts on the serial port?
Are you using MMC or SD cards?
What does your electronics schema look like? Which pins of the PIC have you connected to which pins of the MMC? Did you provide the required pull-up resistors on the data and clock lines? etc. |
|
|
Bart
Joined: 12 Jul 2005 Posts: 49
|
|
Posted: Tue Oct 25, 2005 8:05 am |
|
|
Hello ckielstra,
Please find my remarks between your text.
ckielstra wrote: | Can you give us more info? Right now you don't give us a lot to go on.
Do you see the output of the debug texts on the serial port?. |
Please look again to my first post. See RS232 output (in code window)
Quote: | Are you using MMC or SD cards?. |
A real MMC card 8Mb
Quote: | What does your electronics schema look like? Which pins of the PIC have you connected to which pins of the MMC? Did you provide the required pull-up resistors on the data and clock lines? etc. |
Please see set_tris_b and set_tris_c section, used pins are mentioned as \\text
Basically, my schema is this from the http://www.cc5x.de/MMC/ site. I know that the data out from the mmc (sdi on pic) without converter from 3.3v to 5v can be the problem, but as it worked with others, I tryed without. Also this schema is for a 16F877. So for my 18F4550 I needed to use other pins.
Hope this is more info to you.
Best greetings. _________________ I like Skype (www.skype.com), my username is BplotM |
|
|
ckielstra
Joined: 18 Mar 2004 Posts: 3680 Location: The Netherlands
|
|
Posted: Tue Oct 25, 2005 6:22 pm |
|
|
The code of the original site is a nice starting point but needs a lot of work as the errors and time outs are handled poorly.
I modified the code by including my own Command function which has better time out handling. In case of errors during the write I also added an extra command for retrieving and printing the MMC status which might give us a clue as to what is going on.
Code: | // TEST : using the mmc in write and read mode.
// Based on http://www.ccsinfo.com/forum/viewtopic.php?t=23183
#include <18F4550.h>
#fuses HS,NOWDT,NOPUT,NOLVP,NOBROWNOUT,NOCPD,NOWRT
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_E1, rcv=PIN_E0, ERRORS)
#use fast_io(B)
#use fast_io(C)
// For the PIC 16F877 see manual on page 20/234
// #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
// For the PIC 18F4550 see manual on page 68/426
#byte SSPBUF = 0xFC9
#byte SSPCON = 0xFC6
#byte SSPSTAT = 0xFC7
#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 = 0xF82
#bit CS = PORTC.2
// Command codes
#define MMC_CMD(x) (0x40 + x) // A command always starts with the same two start bits.
#define GO_IDLE_STATE MMC_CMD(0) // Reset card to Idle State
#define SEND_OP_COND MMC_CMD(1) // Activates the card's initialization process.
#define SEND_STATUS MMC_CMD(13) // Asks the card to send its status register
#define READ_SINGLE_BLOCK MMC_CMD(17) // Reads a block of the size selected with SET_BLOCKLEN
#define WRITE_BLOCK MMC_CMD(24) // Writes a block of the size selected with SET_BLOCKLEN
#define MMC_TIME_OUT 0xFF // Just a long time out value
#define TIMER_EXPIRED 0
// -------------------------------------------------
// This is the same as the CCS spi_read() function.
char SPI(char d)
{
SSPBUF=d;
while (!BF);
return SSPBUF;
}
//-----------------------------------------------------------------------------
// Send a command with parameters to the MultiMediaCard
//-----------------------------------------------------------------------------
int8 Command(int8 Cmd, int8 Param1, int8 Param2, int8 Param3, int8 Param4)
{
int8 Response;
int8 TimeOutCounter;
// Allow at least 8 dummy clocks between commands
spi_read(0xFF); // note that the first bit is undefined when card is busy (high impedance state)
// check for the card not being in busy state.
TimeOutCounter = MMC_TIME_OUT;
do
{
Response = spi_read(0xFF);
}
while ((Response != 0xFF) && (--TimeOutCounter != TIMER_EXPIRED));
if (TimeOutCounter == TIMER_EXPIRED)
{
puts("Time out; card busy.\r\n");
return 0xFF;
}
// Send command to the card
spi_write(Cmd); // Command
spi_write(Param1); // Parameter 1
spi_write(Param2); // Parameter 2
spi_write(Param3); // Parameter 3
spi_write(Param4); // Parameter 4
spi_write(0x95); // CRC (including End Bit)
// Hard coded the CRC to 0x95 because CRC is always
// don't care except for CMD0 which uses 0x95.
// Wait for response
TimeOutCounter = MMC_TIME_OUT;
do
{
Response = spi_read(0xFF);
}
while ((Response == 0xFF) && (--TimeOutCounter != TIMER_EXPIRED));
return Response;
}
// -------------------------------------------------
char MMC_Init()
{
char i;
// Init SPI
SMP=0; CKE=0; CKP=1; SSPM1=1; SSPEN=1; //SSPM0=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(GO_IDLE_STATE, 0,0,0,0) != 1)
goto Error; // Reset
st:
// CMD1
if (Command(SEND_OP_COND, 0,0,0,0) != 0)
goto st ; // CMD1
return 1;
Error:
return 0;
}
// -------------------------------------------------
void main(void)
{
int16 i;
setup_adc_ports(NO_ANALOGS);
// PIC 16F code
// set_tris_c(0b11010011); // sck=rc3-0, sdo=rc5-0, CS=rc2-0.
// set_tris_b(0b00000010);
// PIC 18F code
set_tris_c(0b01111011); // sdo=rc7(pin26)-0, CS=rc2(pin17)-0.
set_tris_b(0b00000001); // sck=rb1(pin34)-0, sdi=rb0(pin33)-I
puts("Start\n\r");
if(MMC_Init())
puts("MMC ON - Init OK\n\r"); // MMC Init OK
// -------------------------------------------------
// Write block
if (Command(WRITE_BLOCK, 0,0,2,0) != 0)
puts("Write error in begin of write"); // Write in 512 Byte-Mode
else
{
SPI(0xFF); // Wait a minimum of 8 clock pulses
SPI(0xFE); // Write the Start Block Token (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(0xFF); // Write the 16-bit CRC at the end (don't cares)
SPI(0xFF);
i = SPI(0xFF); // Get data response token
i &= 0b00011111;
if (i != 0b00000101)
{
i = Command(SEND_STATUS, 0,0,0,0);
printf("Write Error in end of write (status: 0x%X)\n", i);
}
while(SPI(0xFF) != 0xFF)
; // Wait for end of Busy condition
}
// -------------------------------------------------
// Read in 512 Byte-Mode
if (Command(READ_SINGLE_BLOCK, 0,0,2,0) !=0)
puts("Read Error ");
else
{
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.
} |
Please run the above code and post the result code for the write error. |
|
|
Bart
Joined: 12 Jul 2005 Posts: 49
|
|
Posted: Wed Oct 26, 2005 2:06 pm |
|
|
Hello ckielstra,
Thanks for the effort you putted in this topic.
Have bad news for you.
I only receive "Start" on my hyperterminal, no more no less.
Can neverwhere find the SETUP_SPI command in your code, is this correct ?
Will MMC run with a 20Mhz PIC clock ? _________________ I like Skype (www.skype.com), my username is BplotM |
|
|
ckielstra
Joined: 18 Mar 2004 Posts: 3680 Location: The Netherlands
|
|
Posted: Wed Oct 26, 2005 4:21 pm |
|
|
Quote: | I only receive "Start" on my hyperterminal, no more no less. | I didn't notice before, but in your original posting the message for a correct MMC setup wasn't showing either.
Quote: | Can neverwhere find the SETUP_SPI command in your code, is this correct ? | Correct. In MMC_Init the SPI module is configured. I didn't check the setup, but in your code the SPI module was configured twice which for sure will give trouble so I removed one setup.
Quote: | Will MMC run with a 20Mhz PIC clock ? | 20MHz is no problem for MMC, actually the maximum SPI clock = CPU clock speed / 4 = 5MHz.
During startup the maximum speed should be limited to 400kHz, this slow-down is one of the things missing from this code but my guess is that most cards won't mind.
The fact that the message for a correct MMC init is missing makes me think you have a hardware problem.
Please double check your hardware. Make sure the SDO of the PIC is connected to the DATA_IN of the MMC and vice versa (a cross connection) and that all pull up resistors are in place.
If possible have your PIC run at the same voltage as the MMC, this requires an PIC18LFxxxx version. |
|
|
Bart
Joined: 12 Jul 2005 Posts: 49
|
|
Posted: Thu Oct 27, 2005 9:38 am |
|
|
Thanks again.
Will start some measurements with the osciloscoop on the pins of the PIC and MMC.
Will keep everybody informed when I find something. _________________ I like Skype (www.skype.com), my username is BplotM |
|
|
Bart
Joined: 12 Jul 2005 Posts: 49
|
|
Posted: Thu Oct 27, 2005 2:42 pm |
|
|
Hello ckielstra,
Did you try your code at your site ?
Where did you define SET_BLOCKLEN ?
Thanks. _________________ I like Skype (www.skype.com), my username is BplotM |
|
|
Bart
Joined: 12 Jul 2005 Posts: 49
|
|
Posted: Thu Oct 27, 2005 3:20 pm |
|
|
STUPID STUPID STUPID of me !!
It was a "create your own hardware" problem.
I am using a floppy drive like connector (less long than the real floppy connector), like mentioned on a lot of sites.
Problem was that the MMC was to deep inserted in the connector, contacts where no longer making contact.
My original code is working fine.
PS : ckielstra : can't manage to let it work with yours. I think something is missing. Thanks anyway for your help. _________________ I like Skype (www.skype.com), my username is BplotM |
|
|
baasbrits Guest
|
saving a sensor's data on a mmc card by using the pic16f8550 |
Posted: Tue Sep 19, 2006 10:27 am |
|
|
Hey I am busy with a project where I want to save the data of g-force sensors on as mmc card by using the pic16f877/ pic18f4550 can anybody please help me |
|
|
asmallri
Joined: 12 Aug 2004 Posts: 1634 Location: Perth, Australia
|
|
Posted: Tue Sep 19, 2006 11:10 am |
|
|
Unless you are going to add additional memory, forget about the 16F. The MMC and SD write block size if 512 bytes. You MUST write a 512 bytes block. Therefore you need either a PIC with more memory than a PIC16F877 or you need to add the external memory.
If you are planning to use a FAT file system then I suggest using a PIC with 4K RAM. I suggest the PIC18F4620 variants and above are the realistic minimum for general purpose applications that require the ability to write to SD cards with the FAT file system.
If you are looking for reference hardware design schematics interfacing to an SD/MMC card check out my projects page on my web site. _________________ Regards, Andrew
http://www.brushelectronics.com/software
Home of Ethernet, SD card and Encrypted Serial Bootloaders for PICs!! |
|
|
Foxabilo Guest
|
|
Posted: Thu Sep 28, 2006 6:28 am |
|
|
Post deleted by Admin. There are more civil ways of discussing your 'out of the box' ideas. |
|
|
fox Guest
|
|
Posted: Sun Oct 08, 2006 8:12 am |
|
|
Foxabilo wrote: | Post deleted by Admin. There are more civil ways of discussing your 'out of the box' ideas. |
Touched a nerve I see.
Ohh well I'll keep my corrections to errors to myself |
|
|
|
|
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
|