www.pudn.com > Bit1611_demo_code.rar > SPI.C


/* ********************************************************************** 
 
         Copyright (c) 2002-2006 Beyond Innovation Technology Co., Ltd 
 
        All rights are reserved. Reproduction in whole or in parts is 
    prohibited without the prior written consent of the copyright owner. 
   ---------------------------------------------------------------------- 
 
    Module: SPI.C 
 
    Purpose: Implementation of SPI module. 
 
    Version: 0.01                                   02:23PM  2005/08/22 
 
    Compiler: Keil 8051 C Compiler v8.01 
 
    Reference: 
 
   ---------------------------------------------------------------------- 
    Modification: 
 
    R0.01 02:23PM  2005/08/22 Jeffrey Chang 
    Reason: 
        1. Original. 
    Solution: 
 
   ********************************************************************** */ 
 
#define _SPI_C_ 
 
 
/* ------------------------------------ 
    Header Files 
   ------------------------------------ */ 
#include  
 
#include "common.h" 
#include "spi.h" 
 
/* ------------------------------------ 
    Macro Definitions 
   ------------------------------------ */ 
 
#define NOP_24  { _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();} 
#define NOP_20  { _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); } 
#define NOP_18  { _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); } 
#define NOP_15  { _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();  } 
#define NOP_12  { _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();   } 
#define NOP_10  { _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();                     } 
#define NOP_3   { _nop_(); _nop_(); _nop_(); } 
#define NOP_2   { _nop_(); _nop_(); } 
#define NOP_1   { _nop_(); } 
#define NOP_0   {  } 
 
/* 
    1) 12-clock mode 
        12 / 14.318MHz = 838 ns ! 
 
    2) 6-clock mode 
        6 / 14.318MHz = 419 ns ! 
*/ 
 
#define SPI_T_S0    NOP_1           /* Min. 150 ns                          */ 
#define SPI_T_H0    NOP_1           /* Min. 150 ns                          */ 
#define SPI_T_S1    NOP_1           /* Min. 150 ns                          */ 
#define SPI_T_H1    NOP_1           /* Min. 150 ns                          */ 
#define SPI_T_W1L   NOP_1           /* Min. 210 ns                          */ 
#define SPI_T_W1H   NOP_1           /* Min. 210 ns                          */ 
#define SPI_T_W2    NOP_1           /* Min. 1   us                          */ 
 
#define SPI_REG_MASK        0x20 
#define SPI_DATA_MASK       0x80 
 
 
#define     SPI_SET_SDA(HiLo)       {   SPI_MOSI = (HiLo) ? HIGH : LOW;     } 
#define     SPI_SET_SCL(HiLo)       {   SPI_SPICLK = (HiLo) ? HIGH : LOW;   } 
#define     SPI_SET_CS(HiLo)        {   SPI_SS = (HiLo) ? HIGH : LOW;       } 
 
 
/* ------------------------------------ 
    Type Definitions 
   ------------------------------------ */ 
 
 
/* ------------------------------------ 
    Variables Definitions 
   ------------------------------------ */ 
sbit SPI_MOSI       = P1 ^ 4;       /* Master Out Slave In  (SDA)       */ 
sbit SPI_SPICLK     = P1 ^ 3;       /* SPI clock            (SCL)       */ 
sbit SPI_SS         = P1 ^ 2;       /* Slave Select         (CS)        */ 
 
 
/* ------------------------------------ 
    Function Prototypes 
   ------------------------------------ */ 
 
 
/* ------------------------------------------------------------------- 
    Name: SPI_Init - 
    Purpose: . 
    Passed: None. 
    Returns: None. 
    Notes: 
  ------------------------------------------------------------------- */ 
void SPI_Init (void) 
{ 
    SPI_SET_CS(HIGH); 
    SPI_SET_SDA(LOW); 
    SPI_SET_SCL(LOW); 
 
    #ifdef NOT_JUNK 
    SPI_TxByte(0x00, 0x03); 
    SPI_TxByte(0x01, 0x18); 
 
    SPI_TxByte(0x03, 0x40); 
    SPI_TxByte(0x04, 0x0B); 
    SPI_TxByte(0x05, 0x76); 
    SPI_TxByte(0x06, 0x15); 
    SPI_TxByte(0x07, 0x1E); 
    SPI_TxByte(0x08, 0x00); 
 
    SPI_TxByte(0x0C, 0x26); 
    SPI_TxByte(0x0D, 0x40); 
    SPI_TxByte(0x0E, 0x40); 
    SPI_TxByte(0x0F, 0x40); 
    SPI_TxByte(0x10, 0x40); 
    SPI_TxByte(0x11, 0x40); 
    SPI_TxByte(0x12, 0x88); 
    SPI_TxByte(0x13, 0x88); 
    #endif 
} /* SPI_Init */ 
 
 
/* ------------------------------------------------------------------- 
    Name: SPI_PowerOff - 
    Purpose: . 
    Passed: None. 
    Returns: None. 
    Notes: 
  ------------------------------------------------------------------- */ 
void SPI_PowerOff (void) 
{ 
    SPI_TxByte(0x05, 0x5E); 
} /* SPI_PowerOff */ 
 
 
/* ------------------------------------------------------------------- 
    Name: SPI_PowerOn - 
    Purpose: . 
    Passed: None. 
    Returns: None. 
    Notes: 
  ------------------------------------------------------------------- */ 
void SPI_PowerOn (void) 
{ 
    SPI_TxByte(0x02, 0x42); 
} /* SPI_PowerOn */ 
 
 
/* ------------------------------------------------------------------- 
    Name: SPI_TxByte - 
    Purpose: To transmit a 16-bit command to SPI slave device. 
    Passed: 
    Returns: None. 
    Notes: 
   ------------------------------------------------------------------- */ 
void SPI_TxByte ( 
UB8  bReg, 
UB8  bData 
) 
{ 
    UB8 bMask; 
 
 
    SPI_SET_CS(LOW); 
 
    for (bMask = SPI_REG_MASK; bMask; bMask >>= 1) 
    { 
        SPI_SET_SDA(bReg & bMask); 
 
        // SDA is loaded one bit a time at the rising edge of SCL 
        SPI_SET_SCL(HIGH); 
        SPI_T_H1; 
        SPI_SET_SCL(LOW); 
    } 
 
    SPI_SET_SDA(LOW); 
     
    SPI_SET_SCL(HIGH); 
    SPI_T_H1; 
    SPI_SET_SCL(LOW); 
    SPI_T_H1; 
 
    SPI_SET_SDA(HIGH); 
     
    SPI_SET_SCL(HIGH); 
    SPI_T_H1; 
    SPI_SET_SCL(LOW); 
    SPI_T_H1; 
 
    for (bMask = SPI_DATA_MASK; bMask; bMask >>= 1) 
    { 
        SPI_SET_SDA(bData & bMask); 
 
        // SDA is loaded one bit a time at the rising edge of SCL 
        SPI_SET_SCL(HIGH); 
        SPI_T_H1; 
        SPI_SET_SCL(LOW); 
    } 
 
    SPI_T_H0; 
    SPI_SET_CS(HIGH); 
    SPI_SET_SDA(LOW); 
         
} /* SPI_TxByte */ 
 
 
 
/* ------------------------------------------------------------------- 
    Name:  - 
    Purpose: . 
    Passed: None. 
    Returns: None. 
    Notes: 
   ------------------------------------------------------------------- */ 
 
 
/* ********************************************************************** 
 
    Description: 
 
 
   ********************************************************************** */ 
 
/* %% End Of File %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% */