lcodu_spi.c
来自「卫星接受机控制卫星和LCD显示」· C语言 代码 · 共 519 行 · 第 1/2 页
C
519 行
}
#endif
//*----------------------------------------------------------------------------
//* 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,r1_frac; //R0的INT、FRAC
unsigned char msb_r0, nsb_r0, lsb_r0,msb_r1, nsb_r1, lsb_r1;
unsigned int R0,R1;
float temp1, temp2;
unsigned char N_r1=0x00; // N [10:8]
temp1 = freq / 10.0;
r0_int = (unsigned int)temp1; //INT
if (r0_int > 255)//龚俊 10月21日改,为了修正频率设置上限问题
{
N_r1 = (unsigned char)(r0_int>>8)&0x07;
//N=(unsigned char)(r0_int|0xFF);
}
temp2 = (temp1 - r0_int)*240.0; //剩下的小数部分
r0_frac = (unsigned int)temp2; //FRAC
if ((temp2 - r0_frac)>=0.5)
{
r0_frac+= 1;
}
r1_frac=(r0_frac & 0x003FF000)>>12;
R0 = ((r0_int & 0xFF)<<16)|(r0_frac<<4);
msb_r0 = (R0>>16) & 0x000000FF;
nsb_r0 = (R0>>8) & 0x000000FF;
lsb_r0 = R0 & 0x000000FF;
R1= (unsigned int)((N_r1<<14)|(0x10<<17)|(r1_frac<<4)|0x01);
msb_r1 = (R1>>16) & 0x000000FF;
nsb_r1 = (R1>>8) & 0x000000FF;
lsb_r1 = R1 & 0x000000FF;
switch (channel)
{
case TX_RF:
// R1
wirte_rigester2531(msb_r1, nsb_r1, lsb_r1, TX_RF);
// R0
wirte_rigester2531(msb_r0, nsb_r0, lsb_r0, TX_RF);
break;
case RX_RF:
// R1
wirte_rigester2531(msb_r1, nsb_r1, lsb_r1, RX_RF);
// R0
wirte_rigester2531(msb_r0, nsb_r0, lsb_r0, 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 spi_init()
{
if(syn_select)
{
SPI_int();//初始化SPI为人口输出
//开启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 + =
减小字号Ctrl + -
显示快捷键?