mmc_ll_SPI0.c
上传用户:sourcesun
上传日期:2013-09-23
资源大小:362k
文件大小:5k
源码类别:

DNA

开发平台:

Asm

  1. /*************************************************************************
  2.  *
  3.  *    Used with ICCARM and AARM.
  4.  *
  5.  *    (c) Copyright IAR Systems 2003
  6.  *
  7.  *    File name   : mmc_ll.h
  8.  *    Description : define MMC module
  9.  *
  10.  *    History :
  11.  *    1. Data        : July 1, 2005
  12.  *       Author      : Stanimir Bonev
  13.  *       Description : Create
  14.  *
  15.  *    $Revision: 1.2.2.1 $
  16. **************************************************************************/
  17. // Hardware depend definitions
  18. /*************************************************************************
  19.  * Function Name: MmcChipSelect
  20.  * Parameters: Boolean Select
  21.  * Return: none
  22.  *
  23.  * Description: Mmc Chip select control
  24.  * Select = true  - Chip is enable
  25.  * Select = false - Chip is disable
  26.  *
  27.  *************************************************************************/
  28. void MmcChipSelect (Boolean Select)
  29. {
  30.   if (Select)
  31.   {
  32.     IO0CLR_bit.P0_7 = 1;
  33.   }
  34.   else
  35.   {
  36.     IO0SET_bit.P0_7 = 1;
  37.   }
  38. }
  39. /*************************************************************************
  40.  * Function Name: MmcPresent
  41.  * Parameters: none
  42.  * Return: Boolean - true cart present
  43.  *                 - false cart no present
  44.  *
  45.  * Description: Mmc precent check
  46.  *
  47.  *************************************************************************/
  48. inline
  49. Boolean MmcPresent (void)
  50. {
  51.   return(true);
  52. }
  53. /*************************************************************************
  54.  * Function Name: MmcWriteProtect
  55.  * Parameters: none
  56.  * Return: Boolean - true cart is protected
  57.  *                 - false cart no protected
  58.  *
  59.  * Description: Mmc Write protect check
  60.  *
  61.  *************************************************************************/
  62. inline
  63. Boolean MmcWriteProtect (void)
  64. {
  65.   return(FALSE);
  66. }
  67. /*************************************************************************
  68.  * Function Name: MmcSetClockFreq
  69.  * Parameters: Int32U Frequency
  70.  * Return: Int32U
  71.  *
  72.  * Description: Set SPI ckl frequency
  73.  *
  74.  *************************************************************************/
  75. Int32U MmcSetClockFreq (Int32U Frequency)
  76. {
  77. Int32U Div = SYS_GetFpclk()/Frequency;
  78.   // Check min clk divider (for master mode >= 8)
  79.   if (Div < 8)
  80.   {
  81.     Div = 8;
  82.   }
  83.   // Check max clk divider <= 254
  84.   else if (Div > 254)
  85.   {
  86.     Div = 254;
  87.   }
  88.   S0SPCCR_bit.COUNTER = Div;
  89.   // Return real frequency
  90.   return(SYS_GetFpclk()/Div);
  91. }
  92. /*************************************************************************
  93.  * Function Name: MmcInit
  94.  * Parameters: none
  95.  * Return: int
  96.  * 0 - no error
  97.  * 1 - speed is to high
  98.  *
  99.  * Description: Init SPI, Cart Present, Write Protect and Chip select pins
  100.  *
  101.  *************************************************************************/
  102. void MmcInit (void)
  103. {
  104.   // Chip select
  105.   IO0SET_bit.P0_7  = 1;
  106.   IO0DIR_bit.P0_7  = 1;
  107.   // Cart present
  108.   // Spi init
  109.   PM_OpenPeripheral(PC_PCSPI0);
  110.   S0SPCR = 0x0824;
  111.   // Clock Freq. Identification Mode < 400kHz
  112.   MmcSetClockFreq(IdentificationModeClock);
  113.   PINSEL0_bit.P0_4 = PINSEL0_bit.P0_5 = PINSEL0_bit.P0_6 = 1;
  114.   PINSEL0_bit.P0_7 = 0;
  115. }
  116. /*************************************************************************
  117.  * Function Name: MmcTranserByte
  118.  * Parameters: Int8U ch
  119.  * Return: Int8U
  120.  *
  121.  * Description: Read byte from SPI
  122.  *
  123.  *************************************************************************/
  124. Int8U MmcTranserByte (Int8U ch)
  125. {
  126.   S0SPDR_bit.DATA = ch;
  127.   while(!S0SPSR_bit.SPIF);
  128.   return((Int8U)S0SPDR_bit.DATA);
  129. }
  130. /*************************************************************************
  131.  * Function Name: MmcSendBlock
  132.  * Parameters: pInt8U pData, Int32U Size
  133.  *
  134.  * Return: void
  135.  *
  136.  * Description: Read byte from SPI
  137.  *
  138.  *************************************************************************/
  139. void MmcSendBlock (pInt8U pData, Int32U Size)
  140. {
  141. Int32U OutCount = Size;
  142.   while (OutCount--)
  143.   {
  144.     S0SPDR_bit.DATA = *pData++;
  145.     while(!S0SPSR_bit.SPIF);
  146.     volatile Int32U Dummy = SSPDR_bit.DATA;
  147.   }
  148. }
  149. /*************************************************************************
  150.  * Function Name: MmcReceiveBlock
  151.  * Parameters: pInt8U pData, Int32U Size
  152.  *
  153.  * Return: void
  154.  *
  155.  * Description: Read byte from SPI
  156.  *
  157.  *************************************************************************/
  158. void MmcReceiveBlock (pInt8U pData, Int32U Size)
  159. {
  160. Int32U InCount = Size;
  161.   while (InCount--)
  162.   {
  163.     S0SPDR_bit.DATA = 0xFF;
  164.     while(!S0SPSR_bit.SPIF);
  165.     *pData++ = S0SPDR_bit.DATA;
  166.   }
  167. }
  168. /*************************************************************************
  169.  * Function Name: MmcDly_1ms
  170.  * Parameters: Int32U Delay
  171.  * Return: none
  172.  *
  173.  * Description: Delay [msec]
  174.  *
  175.  *************************************************************************/
  176. void MmcDly_1ms (Int32U Delay)
  177. {
  178. volatile Int32U i;
  179.   for(;Delay;--Delay)
  180.   {
  181.     for(i = MMC_DLY_1MSEC;i;--i);
  182.   }
  183. }