lcodu_spi.c

来自「卫星接受机控制卫星和LCD显示」· C语言 代码 · 共 519 行 · 第 1/2 页

C
519
字号
//*----------------------------------------------------------------------------
//* File Name           : lcodu_spi.c
//* Object              : Main application written in C
//* Creation            : zdp  200710
//* Modif               : wp  1/11/2007
//*----------------------------------------------------------------------------

// Include Standard files
#include "Board.h"
#include "vars.h"

extern void Delay (unsigned int a);
#if(1)
//*-----------------------------------------------------------------------------
//* Function Name       : SPI_int
//* Object              : initiate the SPI device
//* autor               : wangping
//* Input Parameters    : none
//* Output Parameters   : none
//*-----------------------------------------------------------------------------
#define PLL_SPI_CLK   (1<<14)
#define PLL_SPI_DATA  (1<<13)
#define PLL_SPI_CS0   (1<<31)
#define PLL_SPI_CS1   (1<<3)
void SPI_int(void)
{
     unsigned int tmp,tmp1;
     tmp1=(unsigned int)PLL_SPI_CS0;
     tmp=PLL_SPI_CLK|PLL_SPI_DATA|PLL_SPI_CS1|tmp1;
     AT91C_BASE_PIOA->PIO_PER|=tmp;
     AT91C_BASE_PIOA->PIO_OER = tmp;  
     AT91C_BASE_PIOA->PIO_SODR= tmp;
}

void wirte_rigester4153(char msb, char nsb, char lsb, char channel)
{
   unsigned int v;
   unsigned int PLL_SPI_CS;
   unsigned int i,j;
   
   v=(msb<<16)|(nsb<<8)|(lsb);
   j=(1<<23);
  
   if(channel==1)
     PLL_SPI_CS=(unsigned int)PLL_SPI_CS0;
   else if(channel==3)
     PLL_SPI_CS=PLL_SPI_CS1;
   else return;
   
   AT91C_BASE_PIOA->PIO_SODR=(unsigned int)PLL_SPI_CS0;
   AT91C_BASE_PIOA->PIO_SODR= PLL_SPI_CS1;
   Delay(2000);
  
   AT91C_BASE_PIOA->PIO_CODR= PLL_SPI_CLK;
   Delay(2000);

   AT91C_BASE_PIOA->PIO_CODR= PLL_SPI_CS;  //使能
   Delay(3000);
   
   for(i=0;i<24;i++)//人工发射SPI信号
   {
      AT91C_BASE_PIOA->PIO_CODR= PLL_SPI_CLK;
      
      if((v&j)==0)  AT91C_BASE_PIOA->PIO_CODR= PLL_SPI_DATA;
      else     AT91C_BASE_PIOA->PIO_SODR= PLL_SPI_DATA;
      
      Delay(2000);
      AT91C_BASE_PIOA->PIO_SODR= PLL_SPI_CLK;
      j>>=1;
      Delay(2000);
   }
   
   AT91C_BASE_PIOA->PIO_CODR= PLL_SPI_CLK;
   AT91C_BASE_PIOA->PIO_SODR= PLL_SPI_CS;
   Delay(3000); 
   AT91C_BASE_PIOA->PIO_CODR= PLL_SPI_DATA; 
   AT91C_BASE_PIOA->PIO_CODR= (unsigned int)PLL_SPI_CS0;
   AT91C_BASE_PIOA->PIO_CODR= PLL_SPI_CS1;   
   
   Delay(3000); 
}

//*-----------------------------------------------------------------------------
//* Function Name       : Init_TX_RF
//* Object              : initialization TX_RF PLL(hittie)
//* autor               : wangping
//* Input Parameters    : none
//* Output Parameters   : none
//*-----------------------------------------------------------------------------
void Init_TX_RF(void)
{
    //	Noise Register (R3)
    wirte_rigester4153(0x00,0x00,0x03,1);
    
    //	Control Register  (R2)
    wirte_rigester4153(0x00,0x04,0xA2,1);
    
    // R Register   (R1)
    wirte_rigester4153(0x14,0x42,0x81,1);
    
   // N Register (R0)
    wirte_rigester4153(0x57,0x80,0x00,1);
    
}
//*-----------------------------------------------------------------------------
//* Function Name       : Init_RX_RF
//* Object              : initialization RX_RF PLL(hittie)
//* autor               : wangping
//* Input Parameters    : none
//* Output Parameters   : none
//*-----------------------------------------------------------------------------
void Init_RX_RF(void)
{
    //	Noise Register (R3)
    wirte_rigester4153(0x00,0x00,0x03,3);
    
    //	Control Register  (R2)
    wirte_rigester4153(0x00,0x04,0xA2,3);
    
    // R Register   (R1)
    wirte_rigester4153(0x14,0x42,0x81,3);
    
   // N Register (R0)
    wirte_rigester4153(0x57,0x80,0x00,3);
}

//*-----------------------------------------------------------------------------
//* Function Name       : Set_TX_RX_RF0
//* Object              : set TX_RF/RX_RF  PLL frequency(hittie),unit:MHZ
//* autor               : wangping
//* Input Parameters    : channel == 1 (TX_RF),channel == 3 (RX_RF),freq:frequency(mhz)
//* Output Parameters   : none
//*-----------------------------------------------------------------------------
void Set_TX_RX_RF0(char channel, float freq)
{   //这里频率单位为MHz
    unsigned int r0_int, r0_frac; //R0的INT、FRAC
    unsigned char msb, nsb, lsb;
    unsigned int numb;
    unsigned char numb1;
    float temp1, temp2;
    //char i = 0;
    
    temp1 = freq / 10.0;
    r0_int = (unsigned int)temp1; //INT 
    temp2 = (temp1 - r0_int)*160.0; //剩下的小数部分
    
    r0_frac = (unsigned int)temp2; //FRAC
    
    if ((temp2 - r0_frac)>=0.5)
    {
      r0_frac+= 1;
    }
    r0_int = r0_int &0x01ff; //屏蔽高7位
    r0_frac = r0_frac &0x0fff; // 屏蔽高4位

    numb = r0_int >> 2; //r0_int[9:2]->numb[7:0]
    msb = numb % 256; //numb[7:0]->msb[7:0]

    nsb = r0_int % 256; //r0_int[7:0]->nsb[7:0]
    nsb = nsb << 6; //r0_int[1:0]->nsb[7:6]
    nsb = nsb &0xc0; //nsb[5:0]=000000

    numb = r0_frac >> 6; //r0_frac[11:6]->numb[5:0],numb[7:6]=r0_trac[13:12]=00
    numb1 = numb % 256; //numb1[7:0]=numb[7:0],
    numb1 = numb1 | 0xc0; //numb1[7:6]=11,numb1[5:0]=numb[5:0]=r0_frac[11:6]
    numb1 = numb1 &0x3f;
    nsb = nsb | numb1; //nsb[5:0]=r0_frac[11:6]

    lsb = r0_frac % 256; //lsb[7:0]=r0_frac[7:0]
    lsb = lsb << 2; //lsb[7:2]=r0_frac[5:0],lsb[1:0]=00

  switch (channel)
  {
    case 1:
      // R Register   (R1)
      wirte_rigester4153(0x14,0x42,0x81,1);
      // N Register (R0)
      wirte_rigester4153(msb,nsb,lsb,1);
      break;
    case 3:
      // R Register   (R1)
      wirte_rigester4153(0x14,0x42,0x81,3);
      // N Register (R0)
      wirte_rigester4153(msb,nsb,lsb,3);   
      break;
    default:
      break;
  }
}
#endif

#if(1)
#define PLL_SPI_CLK   (1<<14)
#define PLL_SPI_DATA  (1<<13)
#define PLL_SPI_CS0   (1<<31)
#define PLL_SPI_CS1   (1<<3)

void SPI_int2531()
{
  unsigned int tmp,tmp1;
  tmp1=(unsigned int)PLL_SPI_CS0;
  tmp=PLL_SPI_CLK|PLL_SPI_DATA|PLL_SPI_CS1|tmp1;
  AT91C_BASE_PIOA->PIO_PER|=tmp;
  AT91C_BASE_PIOA->PIO_OER = tmp;  
  AT91C_BASE_PIOA->PIO_SODR= tmp;
}

void wirte_rigester2531(char msb, char nsb, char lsb, char channel)
{
   unsigned int v;
   unsigned int PLL_SPI_CS;
   unsigned int i,j;
   
   v=(msb<<16)|(nsb<<8)|(lsb);
   j=(1<<23);
  
   if(channel==1)
     PLL_SPI_CS=(unsigned int)PLL_SPI_CS0;
   else if(channel==3)
     PLL_SPI_CS=PLL_SPI_CS1;
   else return;
   
   AT91C_BASE_PIOA->PIO_SODR=(unsigned int)PLL_SPI_CS0;
   AT91C_BASE_PIOA->PIO_SODR= PLL_SPI_CS1;
   Delay(2000);
   /*
   AT91C_BASE_PIOA->PIO_SODR= PLL_SPI_CLK;
   Delay(2000);
   AT91C_BASE_PIOA->PIO_CODR= PLL_SPI_CLK;
   Delay(2000);
   AT91C_BASE_PIOA->PIO_SODR= PLL_SPI_CLK;
   Delay(2000);
   */
   AT91C_BASE_PIOA->PIO_CODR= PLL_SPI_CLK;
   Delay(2000);

   AT91C_BASE_PIOA->PIO_CODR= PLL_SPI_CS;  //使能
   Delay(3000);
   
   for(i=0;i<24;i++)
   {
      AT91C_BASE_PIOA->PIO_CODR= PLL_SPI_CLK;
      
      if((v&j)==0)  AT91C_BASE_PIOA->PIO_CODR= PLL_SPI_DATA;
      else     AT91C_BASE_PIOA->PIO_SODR= PLL_SPI_DATA;
      
      Delay(2000);
      AT91C_BASE_PIOA->PIO_SODR= PLL_SPI_CLK;
      j>>=1;
      Delay(2000);
   }
   
   AT91C_BASE_PIOA->PIO_CODR= PLL_SPI_CLK;
   AT91C_BASE_PIOA->PIO_SODR= PLL_SPI_CS;
   Delay(3000); 
   AT91C_BASE_PIOA->PIO_CODR= PLL_SPI_DATA; 
   AT91C_BASE_PIOA->PIO_CODR= (unsigned int)PLL_SPI_CS0;
   AT91C_BASE_PIOA->PIO_CODR= PLL_SPI_CS1;   
   
   Delay(3000); 

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?