MMC/SD Card raw data read with PIC16F887 – CCS C

Interfacing MMC/SD card with PIC16F887

This small example shows how to read SD card raw data (bytes, sectors …). SD card raw data means that there is no use of system files like FAT16 or FAT32. Serial monitor is used to display the data after reading it and here the UART protocol is used.
the link below shows a small PIC16F887 MCU UART example:
UART Example for PIC16F887 microcontroller using CCS PIC C compiler

In this project I used the MMC/SD card driver for CCS C compiler which is described in the post at the link below:
MMC/SD Card driver for CCS PIC C compiler

The PIC16F887 MCU has only 368 bytes of data RAM which means that it is not possible to load an entire sector of 512 bytes. That means we can’t write byte or sector correctly with this microcontroller unless an external component is added to the circuit such as external EEPROM which of course slows the writing process. But reading is not like writing, we can read all the SD card data byte by byte.

Hardware Required:

  • PIC16F887 microcontroller
  • SD Card
  • AMS1117 3.3V voltage regulator
  • 3 x 3.3K ohm resistor
  • 3 x 2.2K ohm resistor
  • 10K ohm resistor
  • 5 x 10uF polarized capacitor
  • 100nF ceramic capacitor
  • MAX232 chip
  • Female COM port
  • 5V Power source
  • Breadboard
  • Jumper wires

Interfacing SD card with PIC16F887 MCU circuit:

PIC16F887 MMC/SD card interfacing with voltage divider

The AMS1117 3.3V voltage regulator is used to supply the SD card with 3.3V. Also 3 voltage dividers are used to step down the 5V which comes from the microcontroller to about 3V which is sufficient for the SD card. Each voltage divider consists of 2K2 and 3K3 resistors.
MAX232 integrated circuit is used to interface the microcontroller with the PC, I connected just one wire (RD2) because I need to transmit data from the SD card to the microcontroller and then from the microcontroller to the PC, there is no need to connect the second wire because I don’t have to send data from the PC to the microcontroller.
Hardware SPI module is used by the microcontroller to read data from the SD card, the SPI pins of the PIC16F887 are:

  • SCK (RC3): connected to pin SCK of the SD card
  • SDI (RC4): connected to pin MISO of the SD card
  • SD0 (RC5): connected to pin MOSI of the SD card

and there is an other pin which is CS (Chip Select) can be connected to any digital output pin (defined in the code), this pin is connected to SS pin of the SD card.

SD Card raw data read using PIC16F887 CCS C code:
The C code below was tested with CCS PIC C compiler version 5.051.
There are two functions in the code: sdcard_read_byte and sdcard_read_data. I used the first function to read byte with address 0 and I used the second function to read sector number 0. Since the PIC16F887 has only 368 bytes of RAM, I can not upload all the sector data (512 bytes) in one time, I divided the sector into 16 32-byte parts, so 16 x 32 = 512. The sdcard_read_data function allows us to read data from the SD card starting from any address with any size we want.
The functions sdcard_init , sdcard_read_byte and sdcard_read_data return 0 if OK and non-zero if an error has been occurred.

After compiling the code and burning the HEX file into the microcontroller and with the help of the Serial Monitor of the CCS C IDE I got the result shown in the image below (I used a SD card with 2 GB).

SD card read raw dat output using PIC16F887 and CCS C serial monitor

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.