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