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 + -
显示快捷键?