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

📄 lcodu_spi.c

📁 是关于arm7的代码
💻 C
📖 第 1 页 / 共 2 页
字号:
//*----------------------------------------------------------------------------
//* 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);


//*-----------------------------------------------------------------------------
//* Function Name       : SPI_int
//* Object              : initiate the SPI device
//* autor               : zhu dong po
//* Input Parameters    : none
//* Output Parameters   : none
//*-----------------------------------------------------------------------------
void SPI_int(void)
{
    AT91F_SPI_CfgPMC();
    AT91F_PIO_CfgPeriph( AT91C_BASE_PIOA, // PIO controller base address
		((unsigned int) AT91C_PA13_MOSI    ) |
		((unsigned int) AT91C_PA31_NPCS1   ) |
		((unsigned int) AT91C_PA14_SPCK    ) |
		((unsigned int) AT91C_PA11_NPCS0   ), // Peripheral A
		((unsigned int) AT91C_PA3_NPCS3   ));  // Peripheral B
          	
 
      // 复位SPI
      AT91F_SPI_Reset(AT91C_BASE_SPI);
      AT91C_BASE_SPI->SPI_CR = AT91C_SPI_LASTXFER;
      // 配置 SPI 工作在主模式
      AT91F_SPI_CfgMode(AT91C_BASE_SPI, AT91C_SPI_MSTR |AT91C_SPI_PS_VARIABLE| (0x44<<24));
      AT91F_SPI_CfgCs(AT91C_BASE_SPI,0, AT91C_SPI_NCPHA|AT91C_SPI_CPOL|AT91C_SPI_BITS_16|22<<8);
      AT91F_SPI_CfgCs(AT91C_BASE_SPI,2, AT91C_SPI_NCPHA|AT91C_SPI_CPOL|AT91C_SPI_BITS_16|120<<8);
      AT91F_SPI_CfgCs(AT91C_BASE_SPI,TX_RF, AT91C_SPI_CPOL|AT91C_SPI_CSAAT|AT91C_SPI_BITS_8|240<<8|4<<16|0<<24);
      AT91F_SPI_CfgCs(AT91C_BASE_SPI,RX_RF, AT91C_SPI_CPOL|AT91C_SPI_CSAAT|AT91C_SPI_BITS_8|240<<8|4<<16|0<<24);
      // 启动 SPI0
      AT91F_SPI_Enable(AT91C_BASE_SPI);
}

//*-----------------------------------------------------------------------------
//* Function Name       : Init_TX_RF
//* Object              : initialization TX_RF PLL(hittie)
//* autor               : zhu dong po  
//* Input Parameters    : none
//* Output Parameters   : none
//*-----------------------------------------------------------------------------
void Init_TX_RF(void)
{
    //	Noise Register (R3)
    while (!(AT91C_BASE_SPI->SPI_SR & AT91C_SPI_TDRE)){};
    AT91F_SPI_PutChar(AT91C_BASE_SPI,0x00,1);    
    while (!(AT91C_BASE_SPI->SPI_SR & AT91C_SPI_TDRE)){};
    AT91F_SPI_PutChar(AT91C_BASE_SPI,0x00,1);
    while (!(AT91C_BASE_SPI->SPI_SR & AT91C_SPI_TDRE)){};
    AT91F_SPI_PutChar(AT91C_BASE_SPI,0x03,1);
    while (!(AT91C_BASE_SPI->SPI_SR & AT91C_SPI_TDRE)){};
    AT91F_SPI_PutChar(AT91C_BASE_SPI,0x0000,2);   
    //	Control Register  (R2)
    while (!(AT91C_BASE_SPI->SPI_SR & AT91C_SPI_TDRE)){};
    AT91F_SPI_PutChar(AT91C_BASE_SPI,0x00,1);
    while (!(AT91C_BASE_SPI->SPI_SR & AT91C_SPI_TDRE)){};
    AT91F_SPI_PutChar(AT91C_BASE_SPI,0x04,1);
    while (!(AT91C_BASE_SPI->SPI_SR & AT91C_SPI_TDRE)){};
    AT91F_SPI_PutChar(AT91C_BASE_SPI,0xA2,1);
    while (!(AT91C_BASE_SPI->SPI_SR & AT91C_SPI_TDRE)){};
    AT91F_SPI_PutChar(AT91C_BASE_SPI,0x0000,2);
    // R Register   (R1)
    while (!(AT91C_BASE_SPI->SPI_SR & AT91C_SPI_TDRE)){};
    AT91F_SPI_PutChar(AT91C_BASE_SPI,0x14,1);
    while (!(AT91C_BASE_SPI->SPI_SR & AT91C_SPI_TDRE)){};
    AT91F_SPI_PutChar(AT91C_BASE_SPI,0x42,1);
    while (!(AT91C_BASE_SPI->SPI_SR & AT91C_SPI_TDRE)){};
    AT91F_SPI_PutChar(AT91C_BASE_SPI,0x81,1);
    while (!(AT91C_BASE_SPI->SPI_SR & AT91C_SPI_TDRE)){};
    AT91F_SPI_PutChar(AT91C_BASE_SPI,0x0000,2);
   // N Register (R0)
    while (!(AT91C_BASE_SPI->SPI_SR & AT91C_SPI_TDRE)){};
    AT91F_SPI_PutChar(AT91C_BASE_SPI,0x57,1);
    while (!(AT91C_BASE_SPI->SPI_SR & AT91C_SPI_TDRE)){};
    AT91F_SPI_PutChar(AT91C_BASE_SPI,0x80,1);
    while (!(AT91C_BASE_SPI->SPI_SR & AT91C_SPI_TDRE)){};
    AT91F_SPI_PutChar(AT91C_BASE_SPI,0x00,1);
    while (!(AT91C_BASE_SPI->SPI_SR & AT91C_SPI_TDRE)){};
    AT91F_SPI_PutChar(AT91C_BASE_SPI,0x0000,2);
}
//*-----------------------------------------------------------------------------
//* Function Name       : Init_RX_RF
//* Object              : initialization RX_RF PLL(hittie)
//* autor               : zhu dong po  
//* Input Parameters    : none
//* Output Parameters   : none
//*-----------------------------------------------------------------------------
void Init_RX_RF(void)
{
    //	Noise Register (R3)
    while (!(AT91C_BASE_SPI->SPI_SR & AT91C_SPI_TDRE)){};
    AT91F_SPI_PutChar(AT91C_BASE_SPI,0x00,3);    
    while (!(AT91C_BASE_SPI->SPI_SR & AT91C_SPI_TDRE)){};
    AT91F_SPI_PutChar(AT91C_BASE_SPI,0x00,3);
    while (!(AT91C_BASE_SPI->SPI_SR & AT91C_SPI_TDRE)){};
    AT91F_SPI_PutChar(AT91C_BASE_SPI,0x03,3);
    while (!(AT91C_BASE_SPI->SPI_SR & AT91C_SPI_TDRE)){};
    AT91F_SPI_PutChar(AT91C_BASE_SPI,0x0000,2);
    //	Control Register  (R2)
    while (!(AT91C_BASE_SPI->SPI_SR & AT91C_SPI_TDRE)){};
    AT91F_SPI_PutChar(AT91C_BASE_SPI,0x00,3);
    while (!(AT91C_BASE_SPI->SPI_SR & AT91C_SPI_TDRE)){};
    AT91F_SPI_PutChar(AT91C_BASE_SPI,0x04,3);
    while (!(AT91C_BASE_SPI->SPI_SR & AT91C_SPI_TDRE)){};
    AT91F_SPI_PutChar(AT91C_BASE_SPI,0xA2,3);
    while (!(AT91C_BASE_SPI->SPI_SR & AT91C_SPI_TDRE)){};
    AT91F_SPI_PutChar(AT91C_BASE_SPI,0x0000,2);
    // R Register   (R1)
    while (!(AT91C_BASE_SPI->SPI_SR & AT91C_SPI_TDRE)){};
    AT91F_SPI_PutChar(AT91C_BASE_SPI,0x14,3);
    while (!(AT91C_BASE_SPI->SPI_SR & AT91C_SPI_TDRE)){};
    AT91F_SPI_PutChar(AT91C_BASE_SPI,0x42,3);
    while (!(AT91C_BASE_SPI->SPI_SR & AT91C_SPI_TDRE)){};
    AT91F_SPI_PutChar(AT91C_BASE_SPI,0x81,3);
    while (!(AT91C_BASE_SPI->SPI_SR & AT91C_SPI_TDRE)){};
    AT91F_SPI_PutChar(AT91C_BASE_SPI,0x0000,2);
   // N Register (R0)
    while (!(AT91C_BASE_SPI->SPI_SR & AT91C_SPI_TDRE)){};
    AT91F_SPI_PutChar(AT91C_BASE_SPI,0x57,3);
    while (!(AT91C_BASE_SPI->SPI_SR & AT91C_SPI_TDRE)){};
    AT91F_SPI_PutChar(AT91C_BASE_SPI,0x80,3);
    while (!(AT91C_BASE_SPI->SPI_SR & AT91C_SPI_TDRE)){};
    AT91F_SPI_PutChar(AT91C_BASE_SPI,0x00,3);
    while (!(AT91C_BASE_SPI->SPI_SR & AT91C_SPI_TDRE)){};
    AT91F_SPI_PutChar(AT91C_BASE_SPI,0x0000,2);
}

//*-----------------------------------------------------------------------------
//* Function Name       : Set_TX_RX_RF0
//* Object              : set TX_RF/RX_RF  PLL frequency(hittie),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_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)
      while (!(AT91C_BASE_SPI->SPI_SR & AT91C_SPI_TDRE)){};
      AT91F_SPI_PutChar(AT91C_BASE_SPI,0x14,1);
      while (!(AT91C_BASE_SPI->SPI_SR & AT91C_SPI_TDRE)){};      
      AT91F_SPI_PutChar(AT91C_BASE_SPI,0x42,1);
      while (!(AT91C_BASE_SPI->SPI_SR & AT91C_SPI_TDRE)){};
      AT91F_SPI_PutChar(AT91C_BASE_SPI,0x81,1);
      while (!(AT91C_BASE_SPI->SPI_SR & AT91C_SPI_TDRE)){};
      AT91F_SPI_PutChar(AT91C_BASE_SPI,0x0000,2);
      // N Register (R0)
      while (!(AT91C_BASE_SPI->SPI_SR & AT91C_SPI_TDRE)){};
      AT91F_SPI_PutChar(AT91C_BASE_SPI,msb,1);
      while (!(AT91C_BASE_SPI->SPI_SR & AT91C_SPI_TDRE)){};
      AT91F_SPI_PutChar(AT91C_BASE_SPI,nsb,1);
      while (!(AT91C_BASE_SPI->SPI_SR & AT91C_SPI_TDRE)){};
      AT91F_SPI_PutChar(AT91C_BASE_SPI,lsb,1);
      while (!(AT91C_BASE_SPI->SPI_SR & AT91C_SPI_TDRE)){};
      AT91F_SPI_PutChar(AT91C_BASE_SPI,0x0000,2);
      break;
    case 3:
      // R Register   (R1)
      while (!(AT91C_BASE_SPI->SPI_SR & AT91C_SPI_TDRE)){};
      AT91F_SPI_PutChar(AT91C_BASE_SPI,0x14,3);
      while (!(AT91C_BASE_SPI->SPI_SR & AT91C_SPI_TDRE)){};
      AT91F_SPI_PutChar(AT91C_BASE_SPI,0x42,3);
      while (!(AT91C_BASE_SPI->SPI_SR & AT91C_SPI_TDRE)){};
      AT91F_SPI_PutChar(AT91C_BASE_SPI,0x81,3);
      while (!(AT91C_BASE_SPI->SPI_SR & AT91C_SPI_TDRE)){};
      AT91F_SPI_PutChar(AT91C_BASE_SPI,0x0000,2);
      // N Register (R0)
      while (!(AT91C_BASE_SPI->SPI_SR & AT91C_SPI_TDRE)){};
      AT91F_SPI_PutChar(AT91C_BASE_SPI,msb,3);//msb
      while (!(AT91C_BASE_SPI->SPI_SR & AT91C_SPI_TDRE)){};
      AT91F_SPI_PutChar(AT91C_BASE_SPI,nsb,3);//nsb
      while (!(AT91C_BASE_SPI->SPI_SR & AT91C_SPI_TDRE)){};
      AT91F_SPI_PutChar(AT91C_BASE_SPI,lsb,3);//lsb
      while (!(AT91C_BASE_SPI->SPI_SR & AT91C_SPI_TDRE)){};
      AT91F_SPI_PutChar(AT91C_BASE_SPI,0x0000,2);      
      break;
    default:
      break;
  }
}


//*-----------------------------------------------------------------------------
//* Function Name       : SPI_int2531
//* Object              : initiate the SPI device(vco embeded,2531)
//* autor               : zhu dong po
//* Input Parameters    : none
//* Output Parameters   : none
//*-----------------------------------------------------------------------------
void SPI_int2531(void)
{
    AT91F_SPI_CfgPMC();
    AT91F_PIO_CfgPeriph( AT91C_BASE_PIOA, // PIO controller base address
		((unsigned int) AT91C_PA13_MOSI    ) |
		((unsigned int) AT91C_PA31_NPCS1   ) |
		((unsigned int) AT91C_PA14_SPCK    ) |
		((unsigned int) AT91C_PA11_NPCS0   ), // Peripheral A
		((unsigned int) AT91C_PA3_NPCS3   ));  // Peripheral B
          	
 
      // 复位SPI
      AT91F_SPI_Reset(AT91C_BASE_SPI);
      AT91C_BASE_SPI->SPI_CR = AT91C_SPI_LASTXFER;
      // 配置 SPI 工作在主模式
      AT91F_SPI_CfgMode(AT91C_BASE_SPI, AT91C_SPI_MSTR |AT91C_SPI_PS_VARIABLE| (0x44<<24));
      AT91F_SPI_CfgCs(AT91C_BASE_SPI,0, AT91C_SPI_NCPHA|AT91C_SPI_CPOL|AT91C_SPI_BITS_16|22<<8);
      AT91F_SPI_CfgCs(AT91C_BASE_SPI,2, AT91C_SPI_NCPHA|AT91C_SPI_CPOL|AT91C_SPI_BITS_16|120<<8);
      AT91F_SPI_CfgCs(AT91C_BASE_SPI,TX_RF, AT91C_SPI_NCPHA|AT91C_SPI_CSAAT|AT91C_SPI_BITS_8|240<<8|40<<16|10<<24);
      AT91F_SPI_CfgCs(AT91C_BASE_SPI,RX_RF, AT91C_SPI_NCPHA|AT91C_SPI_CSAAT|AT91C_SPI_BITS_8|240<<8|40<<16|10<<24);
      // 启动 SPI0
      AT91F_SPI_Enable(AT91C_BASE_SPI);
}

//*-----------------------------------------------------------------------------
//* Function Name       : wirte_rigester2531
//* Object              : write the registers of the pll(vco embeded,2531)

⌨️ 快捷键说明

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