Tuesday 8 January 2013

Global Type Difinition : MMC SD Card interfacing

Global Type Difinition : MMC SD Card interfacing


►Global type definitions and variables

Here are some standard definitions I use throughout this tutorial. You can modify them to suite your needs, but these seem to work fine for me. I modified the INTEGER.H file included in Chan’s library as follows:


CODE:
/*-------------------------------------------*/
/* Integer type definitions for FatFs module */
/*-------------------------------------------*/

#ifndef _INTEGER

   /* These types must be 16-bit, 32-bit or larger integer */
   typedef int                          INT;
   typedef unsigned int UINT;
 
   /* These types must be 8-bit integer */
   typedef signed char          CHAR;
   typedef unsigned char        UCHAR;
 
   /* These types must be 16-bit integer */
   typedef short                        SHORT;
   typedef unsigned short       USHORT;
 
   /* These types must be 32-bit integer */
   typedef long                 LONG;
   typedef unsigned long        DWORD;


   #ifndef STANDARD_TYPES
      #define STANDARD_TYPES
      typedef unsigned char BYTE;
      typedef unsigned int  WORD;
      typedef unsigned long ULONG;
   #endif

   /* Boolean type */
   typedef enum { FALSE = 0, TRUE } BOOL;
 
   #define _INTEGER
#endif
 


The following variable is global, and necessary for Chan’s Library

CODE:
xdata WORD CardType;    /* MMC = 0, SDCard v1 = 1, SDCard v2 = 2 */
 


These are specific to the SPI interface in my microcontroller. Again, you can modify them to suite your needs, and better match your hardware environment.
CODE:
enum SPI_FREQUENCIES { kHz400, MHz1, MHz5, MHz10 };
/* =========================================================== */
/* Table 59. SPICON0: Control Register 0                       */
/* (SFR D6h, Reset Value 00h)                                  */
/*                                                             */
/* BIT SYMBOL   R/W   DEFINITION                               */
/* --- ------   ---   ---------------------------------------- */
/*  7    --      -    Reserved...                              */
/*  6    TE     R/W   T)ransmitter E)nable                     */
/*                    0 = transmitter disabled,                */
/*                    1 = transmitter enabled                  */
/*  5    RE     R/W   R)eceiver E)nable                        */
/*                    0 = receiver disabled,                   */
/*                    1 = receiver enabled                     */
/*  4  SPIEN    R/W   SPI) E)nable                             */
/*                    0 = entire SPI interface disabled,       */
/*                    1 = entire SPI interface enabled         */
/*  3   SSEL    R/W   S)lave SEL)ection                        */
/*                    0 = SPISEL output always '1',            */
/*                    1 = SPISEL output '0' during transfers   */
/*  2   FLSB    R/W   F)irst LSB)                              */
/*                    0 = transfer MSB first,                  */
/*                    1 = transfer LSB first                   */
/*  1   SPO     R/W   S)ampling PO)larity                      */
/*                    0 = Sample transfer data at falling edge */
/*                        of clock (SPICLK is '0' when idle)   */
/*                    1 = Sample transfer data at rising edge  */
/*                        of clock (SPICLK is '1' when idle)   */
/*  0    --      -    Reserved...                              */
/*                                                             */
/* =========================================================== */
        #define TE     0x40
        #define RE     0x20
        #define SPIEN  0x10
        #define SSEL   0x08 // This feature is disabled in PDSoft...
        #define FLSB   0x04
        #define SPO    0x02
 

The following table is used for setting the frequency of the SPI clock – This is definitely hardware specific. My system’s normal crystal frequency is 40.0Mhz, but this example uses a 22.1184Mhz crystal, so that’s why I setup this table. Also, the upsd3334D microcontroller is a 4-clocker, not a 12-clocker device, which means it takes only 4 clock cycles to execute a simple instruction, not 12 like a typical 8052. Your hardware will dictate the values you use as timer constants.

CODE:
/* =========================================================== */
/* Table 61. SPICLKD: SPI Prescaler (Clock Divider)            */
/*           Register (SFR D2h, Reset Value 04h)               */
/*           based on frequency, the following are             */
/*           divisors for the SPI clock register               */
/* =========================================================== */

#define SPI_FREQUENCY_10MHz     4   // Fastest: 10MHz @ 40MHz, and
                                    // 5.529MHz at 22.1184MHz
#ifdef NORMAL_SPEED
   #define SPI_FREQUENCY_5MHz   8   // 5MHz
   #define SPI_FREQUENCY_1MHz   40  // 1MHz
   #define SPI_FREQUENCY_400KHz 100 // 400kHz
#else
   #define SPI_FREQUENCY_5MHz   4   // 5.529MHz
   #define SPI_FREQUENCY_1MHz   20  // 1.105MHz
   #define SPI_FREQUENCY_400KHz 56  // 394.971kHz
#endif

/* =========================================================== */
/* Table 62. SPISTAT: SPI Interface Status Register            */
/*                    (SFR D3h, Reset Value 02h)               */
/*                                                             */
/* BIT   SYMBOL   R/W   DEFINITION                             */
/* ---   ------   ---   -------------------------------------- */
/*  7      --      -    Reserved...                            */
/*  6      --      -    Reserved...                            */
/*  5      --      -    Reserved...                            */
/*  4     BUSY     R    SPI Busy                               */
/*                      0 = Transmit or Receive is completed   */
/*                      1 = Transmit or Receive is in process  */
/*  3     TEISF    R                                           */
/*        T)ransmission E)nd I)nterrupt S)ource F)lag          */
/*                      0 = Automatically resets to '0'        */
/*                          when firmware reads this register  */
/*                      1 = Automatically sets to '1'          */
/*                          when transmission end occurs       */
/*  2    RORISF    R                                           */
/*       R)eceive O)verrun I)nterrupt S)ource F)lag            */
/*                      0 = Automatically resets to '0'        */
/*                          when firmware reads this register  */
/*                      1 = Automatically sets to '1'          */
/*                          when receive overrun occurs        */
/*  1     TISF     R    T)ransmission I)nterrupt S)ource F)lag */
/*                      0 = Automatically resets to '0'        */
/*                          when SPITDR is full                */
/*                         (just after the SPITDR is written)  */
/*                      1 = Automatically sets to '1'          */
/*                          when SPITDR is empty               */
/* (just after BYTE loads from SPITDR into SPI shift register) */
/*  0     RISF     R    R)eception I)nterrupt S)ource F)lag    */
/*                      0 = Automatically resets to '0'        */
/*                          when SPIRDR is empty               */
/*                         (after the SPIRDR is read)          */
/*                      1 = Automatically sets to '1'          */
/*                          when SPIRDR is full                */
/*                                                             */
/* =========================================================== */
#define     BUSY              0x10
#define     TEISF             0x08
#define     RORISF            0x04
#define     TISF              0x02
#define     RISF              0x01
 

No comments:

Post a Comment