⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcodu_spi.c

📁 是关于arm7的代码
💻 C
📖 第 1 页 / 共 2 页
字号:
//* autor               : zhu dong po  
//* Input Parameters    : msb,nsb,lsb,make up the value of the register 
//*                       channel == 1 (TX_RF),channel == 3 (RX_RF),
//* Output Parameters   : none
//*-----------------------------------------------------------------------------
void wirte_rigester2531(char msb, char nsb, char lsb, char channel)
{
    AT91F_SPI_PutChar(AT91C_BASE_SPI,0x0000,2);
    while (!(AT91C_BASE_SPI->SPI_SR & AT91C_SPI_TDRE)){};
    AT91F_SPI_PutChar(AT91C_BASE_SPI,msb,channel);    
    while (!(AT91C_BASE_SPI->SPI_SR & AT91C_SPI_TDRE)){};
    AT91F_SPI_PutChar(AT91C_BASE_SPI,nsb,channel);
    while (!(AT91C_BASE_SPI->SPI_SR & AT91C_SPI_TDRE)){};
    AT91F_SPI_PutChar(AT91C_BASE_SPI,lsb,channel);
    while (!(AT91C_BASE_SPI->SPI_SR & AT91C_SPI_TDRE)){};
    AT91F_SPI_PutChar(AT91C_BASE_SPI,0x0000,2);	
    while (!(AT91C_BASE_SPI->SPI_SR & AT91C_SPI_TDRE)){};
}
//*----------------------------------------------------------------------------
//* File Name           : 
//* Object              : initialization TX_RF
//* Creation            : 5/11/2007
//* Modif               : 20/11/2007
//*----------------------------------------------------------------------------


//*-----------------------------------------------------------------------------
//* Function Name       : Init_TX_RF2531
//* Object              : initialization TX_RF PLL(vco embeded,2531)
//* autor               : zhu dong po  
//* Input Parameters    : none
//* Output Parameters   : none
//*-----------------------------------------------------------------------------
void Init_TX_RF2531(void)
{
    //	R5(INIT1)
    wirte_rigester2531(0x84, 0x00, 0x05, TX_RF);   
    //	R5(INIT2)
    wirte_rigester2531(0x80, 0x00, 0x05, TX_RF);
    //	R5
    wirte_rigester2531(0x80, 0x07, 0xF5, TX_RF);
    Delay(9999);
    //	R12
    wirte_rigester2531(0x01, 0x04, 0x8C, TX_RF);
    //	R9
    wirte_rigester2531(0x00, 0x0B, 0xA9, TX_RF);
    //	R8
    wirte_rigester2531(0x03, 0x00, 0x08, TX_RF);
    //	R7
    wirte_rigester2531(0x00, 0x91, 0x07, TX_RF);
    //	R6
    wirte_rigester2531(0x46, 0xE6, 0x56, TX_RF);
    //	R4
    //wirte_rigester2531(0x00, 0x00, 0x34, TX_RF);
    //	R3
    wirte_rigester2531(0x78, 0xC0, 0x03, TX_RF);//6c-7c modify 08-01-17
    //	R2
    wirte_rigester2531(0x43, 0xC0, 0x12, TX_RF);
    //	R1
    wirte_rigester2531(0x20, 0x00, 0x01, TX_RF);
    //	R0
    wirte_rigester2531(0xF0, 0x00, 0x00, TX_RF);						
}

//*-----------------------------------------------------------------------------
//* Function Name       : Init_RX_RF2531
//* Object              : initialization RX_RF PLL(vco embeded,2531)
//* autor               : zhu dong po  
//* Input Parameters    : none
//* Output Parameters   : none
//*-----------------------------------------------------------------------------
void Init_RX_RF2531(void)
{
    //	R5(INIT1)
    wirte_rigester2531(0x84, 0x00, 0x05, RX_RF);   
    //	R5(INIT2)
    wirte_rigester2531(0x80, 0x00, 0x05, RX_RF);
    //	R5
    wirte_rigester2531(0x80, 0x07, 0xF5, RX_RF);
    Delay(9999);    
    //	R12
    wirte_rigester2531(0x01, 0x04, 0x8C, RX_RF);
    //	R9
    wirte_rigester2531(0x00, 0x0B, 0xA9, RX_RF);
    //	R8
    //wirte_rigester2531(0x03, 0x00, 0x08, RX_RF);
    //	R7
    wirte_rigester2531(0x00, 0x91, 0x07, RX_RF);
    //	R6
    wirte_rigester2531(0x46, 0xE6, 0x56, RX_RF);
    //	R4
    //wirte_rigester2531(0x00, 0x00, 0x34, RX_RF);
    //	R3
    wirte_rigester2531(0x78, 0xC0, 0x03, RX_RF);
    //	R2
    wirte_rigester2531(0x43, 0xC0, 0x12, RX_RF);
    //	R1
    wirte_rigester2531(0x20, 0x00, 0x01, RX_RF);
    //	R0
    wirte_rigester2531(0xFA, 0x00, 0x00, RX_RF);
}

//*-----------------------------------------------------------------------------
//* Function Name       : Set_TX_RX_RF2531
//* Object              : set TX_RF/RX_RF  PLL frequency(vco embeded,2531),unit:MHZ
//* autor               : zhu dong po  
//* Input Parameters    : channel == 1 (TX_RF),channel == 3 (RX_RF), freq:frequency(mhz)
//* Output Parameters   : none
//*-----------------------------------------------------------------------------
void Set_TX_RX_RF2531(char channel, float freq)
{   //这里频率单位为MHz
    unsigned int r0_int, r0_frac; //R0的INT、FRAC
    unsigned char msb, nsb, lsb;
    unsigned int R0;
    float temp1, temp2;
    unsigned char N = 0x00;  // N [10:8]
    
    temp1 = freq / 10.0;
    r0_int = (unsigned int)temp1; //INT
    if (r0_int > 255)
    {
      N = 0x40;
    }
    temp2 = (temp1 - r0_int)*240.0; //剩下的小数部分
    
    r0_frac = (unsigned int)temp2; //FRAC
    
    if ((temp2 - r0_frac)>=0.5)
    {
      r0_frac+= 1;
    }
    
    R0 = ((r0_int%0xFF)<<16)|(r0_frac<<4);
    msb = (R0>>16) & 0x000000FF;
    nsb = (R0>>8) & 0x000000FF;
    lsb = R0 & 0x000000FF;
    
    switch (channel)
    {
      case TX_RF:       
        //  R1
        wirte_rigester2531(0x20, N, 0x01, TX_RF);
        //  R0
        wirte_rigester2531(msb, nsb, lsb, TX_RF);
      break;
      case RX_RF:    
        //  R1
        wirte_rigester2531(0x20, N, 0x01, RX_RF);
        //  R0
        wirte_rigester2531(msb, nsb, lsb, RX_RF);      
      break;
    default:
      break;
  }
}



//*-----------------------------------------------------------------------------
//* Function Name       : odu_spi_init
//* Object              : initiate to set tx&rx frequency,Software entry point
//* autor               : zhu dong po  
//* Input Parameters    : none.
//* Output Parameters   : none.
//*-----------------------------------------------------------------------------
void odu_spi_init()
{
  if(syn_select)
  {
      SPI_int();
	//开启SPI PMC

      Init_TX_RF();
      Init_RX_RF();
  }
  else 
  {
    SPI_int2531();
	//开启SPI PMC

      Init_TX_RF2531();
      Init_RX_RF2531();
  }
}

//*--------------------------------------------------------------------------------------
//* Function Name       : Set_TX_RX_RF
//* Object              : the entrance of setting the TX/RX RF frequency(hettie or 2531)
//* autor               : zhudongpo
//* Input Parameters    : channel == 1 (TX_RF),channel == 3 (RX_RF);freq:这里频率单位为MHz
//* Output Parameters   : none.
//*--------------------------------------------------------------------------------------
void Set_TX_RX_RF(char channel, float freq)
{
   if(syn_select)
     Set_TX_RX_RF0(channel,freq);
   else
     Set_TX_RX_RF2531(channel,freq);
}

#if(0)
//*--------------------------------------------------------------------------------------
//* Function Name       : dac_write
//* Object              : write DAC with SPI data bus,to output rssi voltage
//* autor               : zhudongpo
//* Input Parameters    : v(0<=v<=255)
//* Output Parameters   : none.
//*--------------------------------------------------------------------------------------
void dac_write(unsigned char v)
{
      while (!(AT91C_BASE_SPI->SPI_SR & AT91C_SPI_TDRE)){};
      AT91C_BASE_SPI->SPI_TDR = (((unsigned int)v<<4)&0x0ff0);
     
     
}
#endif

#if(1)
//*--------------------------------------------------------------------------------------
//* Function Name       : dac_write
//* Object              : write DAC with SPI timing which was modulated by io,
//*                          to output rssi voltage
//* author              : wang ping
//* Input Parameters    : v(0<=v<=255)
//* Output Parameters   : none.
//*--------------------------------------------------------------------------------------
#define DAC_SPI_CLK   (1<<18)
#define DAC_SPI_DATA  (1<<19)
#define DAC_SPI_CS    (1<<28)

void dac_write(unsigned char v)
{
   int i;
   unsigned int j,k;
   j=0x8000;
   k=(((unsigned int)v<<4)&0x0ff0);
   
   AT91C_BASE_PIOA->PIO_SODR= DAC_SPI_CLK;
   Delay(1000);
   AT91C_BASE_PIOA->PIO_CODR= DAC_SPI_CLK;
   Delay(1000);
   AT91C_BASE_PIOA->PIO_SODR= DAC_SPI_CS;
   AT91C_BASE_PIOA->PIO_SODR= DAC_SPI_CLK;
   Delay(1000);
   AT91C_BASE_PIOA->PIO_CODR= DAC_SPI_CLK;
   Delay(1000);
   AT91C_BASE_PIOA->PIO_CODR= DAC_SPI_CS;
  
   
   for(i=0;i<16;i++)
   {
      AT91C_BASE_PIOA->PIO_SODR= DAC_SPI_CLK;
      
      if((k&j)==0)  AT91C_BASE_PIOA->PIO_CODR= DAC_SPI_DATA;
      else     AT91C_BASE_PIOA->PIO_SODR= DAC_SPI_DATA;
      
      Delay(1000);
      AT91C_BASE_PIOA->PIO_CODR= DAC_SPI_CLK;
      j>>=1;
      Delay(1000);
   }

}
#endif

⌨️ 快捷键说明

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