CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to CCS Technical Support

PIC to SD Card
Goto page 1, 2  Next
 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
sjharris



Joined: 11 May 2006
Posts: 78

View user's profile Send private message

PIC to SD Card
PostPosted: Tue Jun 28, 2011 9:19 am     Reply with quote

Hello all,

I am trying to add an SD Card to my PIC design. I currently have a board with the correct voltage levels connected to to SD Card (3.3V) which are connected to pins C3,C4,C5 and B3 (I am using 18f8722)
I am using the standard mmc_spi library that comes with CCS but I must be doing something wrong. The pins are defined in code and I am probing on the pins (attached image is snapshot)
I am just sending out the init() command every 1 second to try and get a reponse. I get nothing back from the card. Using an SDHC 4GB formated to FAT32.
Code and pictures attached
Code:

/********************************************************************
*
*  Author:-       SJH
*  Date:-         16 May 2011
*  Version:-      1
*
*  PIC:-          18F8722
*
*********************************************************************
*  Scope:-
*********************************************************************
*
*  Changes:-
*
*********************************************************************
*
*  To Do:-
*
*********************************************************************
*
*
********************************************************************/

/*
SD Card        PIC
-------        ---
CS             RB3
CLK            RC3
DO             RC5
DI             RC4
*/




//*******************************************************************
// Includes
//*******************************************************************
#define MMC_CLK   PIN_C3
#define MMC_DI    PIN_C4
#define MMC_DO    PIN_C5
#define MMC_CS    PIN_B3

#include "D:\Projects\Tests\test.h"
#include "D:\Projects\Tests\flexLCD.c"
#include <mmc_spi.c>
//*******************************************************************
// Global Variables
//*******************************************************************

//*******************************************************************
// Interrupt Routines
//*******************************************************************

//*******************************************************************
// Functions
//*******************************************************************

//*******************************************************************
// CCS PIC Init
//*******************************************************************
CCS_Init()
{
   setup_adc_ports(NO_ANALOGS|VSS_VDD);
   setup_adc(ADC_OFF|ADC_TAD_MUL_0);
   setup_psp(PSP_DISABLED);
   setup_spi(FALSE);
   setup_spi2(FALSE);
   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_timer_4(T4_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   setup_low_volt_detect(FALSE);
}

//*******************************************************************
// Other Init
//*******************************************************************

//*******************************************************************
// Main
//*******************************************************************


void main()
{
   int response;
   int attempt;
   char     temp_string[20];

   attempt = 48;

   response = 0;

   CCS_Init();                                                       //Initialise PIC

   lcd_init();                                                       //Initialise LCD

   response = 1;

   lcd_putc("SD Write test");                                        //Write on lcd


   output_high(PIN_F0);
   while (response !=0)
   {
      response = mmc_init();
      delay_ms(1000);
   }

   output_low(PIN_F0);
   lcd_putc('\f');                                                   //Clear LCD Screen
   delay_ms(1000);                                                   //Wait for 1 second


   while(1)
   {
      output_high(PIN_F1);
      delay_ms(1000);
      output_low(PIN_F1);
      delay_ms(1000);
   }
}


and picture

The voltages a reading at 5V as I probed on the PIC side of the SD Card (I have tested the 3.3V and it does come out at 3.3V)
If you need any more screen shots let me know.
What I would like to know is if anyone has sucessfully managed to interface to SD Card (I see that there are a lot of discussions on here but not really much "Here is a .zip file of all the libs you need etc, etc" Does anyone have such a thing to get me started??

Thanks
sjharris
Ttelmah



Joined: 11 Mar 2010
Posts: 19513

View user's profile Send private message

PostPosted: Tue Jun 28, 2011 9:44 am     Reply with quote

You do realise you need voltage level translation between the SD card and the PIC, unless you run the PIC at 3.3v?.
On the output lines, simple resistive dividers, but doing the other way you need a logic gate that translates from 3.3v logic levels to 5v levels.
The 8722, will _require_ this. Alternative is to use the 18LF8722, at 16MHz max, off 3.3v.

Best Wishes
sjharris



Joined: 11 May 2006
Posts: 78

View user's profile Send private message

PostPosted: Wed Jun 29, 2011 1:36 am     Reply with quote

Granted,
A level conversion would be required, but have probed on the output (from SD Card) line and there is not even 3.3 V there, so level conversion will not work.

Do my scope output even look correct? Without even doing this before I do not relly know what to look for.

Will keep checking my board and check signals are going to correct pins, I will post the data sheet for my SD Card holder for pin out later.

Cheers
sjharris
Ttelmah



Joined: 11 Mar 2010
Posts: 19513

View user's profile Send private message

PostPosted: Wed Jun 29, 2011 4:04 am     Reply with quote

No.
You _need_ the level conversion in the other direction (resistive dividers), or you risk destroying the SD card. Also have you got the pullup resistors to 3.3v on the lines. Some cards work without these, but most require them.

Best Wishes
sjharris



Joined: 11 May 2006
Posts: 78

View user's profile Send private message

PostPosted: Wed Jun 29, 2011 3:35 pm     Reply with quote

Nt quite sure I follow you 100%, are you saying I need the level conversion from 3.3V SD card to 5V pic before the card will transmit anything? I am not getting anything from the card (3.3V from the SD) tested with scope.
Also, Where would I need the pull ups? I am asking as I am using the reference design in the "SD card projects using the pic microcontroller" book. There are no pull ups on any lines just resistor dividers.

Also is there anything that I am missing from my code that would stop the SD card from working? Or is it purely hardware issues? As I said before, I havnt really done this before so I annoy sure what parts are wrong, if the code is wrong the hw won't work and vice versa. It would be good to k ow if I at least have the code correct or not?
temtronic



Joined: 01 Jul 2010
Posts: 9226
Location: Greensville,Ontario

View user's profile Send private message

PostPosted: Wed Jun 29, 2011 4:48 pm     Reply with quote

First you MUST get the hardware right !! As Ttelmah said, you MUST have proper level translators between the PIC and the SD card.
Good chance you've blown the card. Easy test ...insert into a PC and see what happens.

There is NO point in looking at the code until proper hardware is built. Either add the interface chips or replace the PIC with the LF ( low voltage ) version.

AFTER that, then cut code and see what happens.
ckielstra



Joined: 18 Mar 2004
Posts: 3680
Location: The Netherlands

View user's profile Send private message

PostPosted: Wed Jun 29, 2011 7:50 pm     Reply with quote

Here is a link to an on-line version the mentioned book. Figure 9.17 shows the schematic, which is again one of the many flawed designs we have seen here on this forum before.

This schematic only has voltage dividers from the 5V PIC to the 3.3V SD card. Problem with this schematic is that there is no voltage conversion the other way around, the SDO line to the PIC will be out of specs.

Also the pull up resistors on the data lines are missing. Most likely this is why you get no signal from the card on the scope. The card starts up in MMC bus Mode where the DO line is driven by an Open-Collector output. Without the pull-up resistor there will only be a floating voltage. Only after the Reset command is received by the SD card it will switch to a push-pull output.

For some people the schematic works, but this is luck. It is a shame this schematic was publicized in a printed book. Just a quick glance at the rest of the book gives me the impression the book is poor quality.

Fix the hardware by inserting a proper level converter for the DO line from the memory card to the PIC. Or beter, replace your PIC by a low voltage (LF) version. Than you can get rid of all the glue logic (voltage dividers).

Note: My guess is that the LF-chips are just selected chips from the normal F-type. For a hobby project you could try to run your normal PIC processor (non-LF version) at 3.3V, get rid of the voltage dividers and add 100k pull up on the two data lines. Clock frequency should be kept low, max. 16MHz.
asmallri



Joined: 12 Aug 2004
Posts: 1634
Location: Perth, Australia

View user's profile Send private message Send e-mail Visit poster's website

PostPosted: Wed Jun 29, 2011 8:17 pm     Reply with quote

Here you will find some operational reference designs for integrating an SD card with a PIC.

http://www.brushelectronics.com/index.php?page=projects

As already mentions, if you do not have a pullup resistor to VDD of the card (not the PIC) on DO of the card it is unlikely you will be able to communicate with the card.
_________________
Regards, Andrew

http://www.brushelectronics.com/software
Home of Ethernet, SD card and Encrypted Serial Bootloaders for PICs!!
sjharris



Joined: 11 May 2006
Posts: 78

View user's profile Send private message

PostPosted: Thu Jun 30, 2011 3:07 am     Reply with quote

Hi,

Pull up added to DO line (from SD Card). Data now seen on pic pin (but no response yet) probably difference in voltage, would a Transistor switch work, I understand the SPI bus can operate at 30MHz?
I am going to board design two that will incorporate these changes but I would just like to get this working before I do and I am trying with stuff that is lying around the lab. I ahve used FET's as 5V switches before but not switching that fast, hopefully they will work :-~ ??
Cheers
Steve
ckielstra



Joined: 18 Mar 2004
Posts: 3680
Location: The Netherlands

View user's profile Send private message

PostPosted: Thu Jun 30, 2011 5:58 am     Reply with quote

Quote:
Pull up added to DO line (from SD Card). Data now seen on pic pin (but no response yet) probably difference in voltage, would a Transistor switch work,
Yes, a Voltage Follower design (a.k.a. common-drain amplifier) should work with most common FETs. In case of doubt study the datasheets for your FET.

Quote:
I understand the SPI bus can operate at 30MHz?
SD cards can be clocked up to 25MHz in Standard-speed mode, or up to 50 MHz in High-speed mode. The limiting factor here is the PIC which clocks the SPI bus at Fosc/4. The fastest PIC model at 64MHz then results in a SPI speed of 16MHz.
sjharris



Joined: 11 May 2006
Posts: 78

View user's profile Send private message

PostPosted: Mon Jul 04, 2011 4:20 am     Reply with quote

Have used an OR gate to raise the level back to 5V for the PIC. This is the output from the OR gate when I send the mmc_spi init command (DO line on top for reference)



Note that the DI line (on bottom) is now +5V to interface to PIC.

The code does not want to break out of the loop, i.e. the response from the mmc_init() call is not returning a zero (i.e. non zero = error).

Any ideas what to check next? Does the response look correct from the SD Card?, the output from the SD Card is identicle only 3.3V and not 5V.

Cheers
zxsteve
ckielstra



Joined: 18 Mar 2004
Posts: 3680
Location: The Netherlands

View user's profile Send private message

PostPosted: Mon Jul 04, 2011 4:52 pm     Reply with quote

The SD card is sending a response, this is positive.
For more details I would enable the MMC_DEBUG define in mmc_spi.c so you get more debug info on your LCD screen. Post the results.
sjharris



Joined: 11 May 2006
Posts: 78

View user's profile Send private message

PostPosted: Thu Aug 11, 2011 5:13 am     Reply with quote

Success,

I have successfully ( I think ) written the the SD Card. Problem now is how to get the data off the card. I would like to write some custom VB code to read the raw data from the card. Does anyone know how to do this, or failing that a program that will enable me to read the data in?

Cheers
temtronic



Joined: 01 Jul 2010
Posts: 9226
Location: Greensville,Ontario

View user's profile Send private message

PostPosted: Thu Aug 11, 2011 5:23 am     Reply with quote

Well the easiest way is to use 'hexedit' or some other PC program to read the SD drive.You're not the first one wanting to do this, so there's probably 100s of example programs out there in dozens of programming languages.
or...
you could program a 2nd PIC to read the SD drive and send the data to the PC via RS-232 or USB.

I'd do the 2nd option as it's PIC related, you've alrady cut 95% of the code and it's a bit interesting.
sjharris



Joined: 11 May 2006
Posts: 78

View user's profile Send private message

PostPosted: Thu Aug 11, 2011 7:37 am     Reply with quote

I have just checked using Hexedit. The bytes appear as they should !!
But taking this one step further I have formatted the card, created a text file and found the start sector for the file. Multiply by 512 bytes (sector size = 512) and hey presto I have now edited the file in the PIC.
But unfortunately the file does not appear changed in notepad on the PC (i.e. the bytes do not appear) but they do appear in hexedit. What else do I need to change in the file on the SD card to get the file to show the changes in Notepad?

This is OK:-
Code:

Original file contents:-  12345678
PIC writes:-  Hello123
New file contents:- Hello123

But fails on this:-
Code:

Original file contents:- 123
PIC writes:-  Hello123
New file contents:- Hel

Where are the rest of the bytes not displayed? (PS They do show up in Hexedit)

Cheers
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Goto page 1, 2  Next
Page 1 of 2

 
Jump to:  
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