📄 lcodu_spi.c
字号:
//* 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 + -