?? ad9854.c
字號(hào):
#ifndef uchar
#define uchar unsigned char
#endif
//#define msp430 FQ439
#define msp430 F16
//#define parameter parrel
#define parameter seri
#define seri 1
#define parrel 0
#define FQ439 1
#define F16 0
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define bool char
#define true 1
#define false 0
#define SINGLETONE 0
#define FSK 1
#define RAMPEDFSK 2
#define CHIRP 3
#define BPSK 4
#if( msp430 == 1 )
#include <msp430x43x.h>
#endif
#if( msp430 == 0 )
#include <msp430x16x.h>
#endif
//////////////////////////////////////
/*
定義引腳
*/
#define MRESET P2DIR |= BIT0
#define RESETHIGH P2OUT |= BIT0
#define RESETLOW P2OUT &= ~BIT0
#define SHAPEKEYING P3DIR |= BIT6
#define SHAPEKEYINGHIGH P3OUT |= BIT6
#define SHAPEKEYINGLOW P3OUT &= ~BIT6
#define FBH P3DIR |= BIT4
#define FBHHIGH P3OUT |= BIT4
#define FBHLOW P3OUT &= ~BIT4
#define UPDATE P3DIR |= BIT0
#define UPDATEHIGH P3OUT |= BIT0
#define UPDATELOW P3OUT &= ~BIT0
////// P2.7 ~ P2.2 ADDR
////// P2.1 -- > RD
////// P2.0 -- > MASTER_RESET
////// P1 --- > DATA
/////
#if( parameter == 0 ) // parrel
#define DOUT P1DIR |= 0xff
#define DIN P1DIR &= ~0xff
#define DATAOUT P1OUT
#define DATAIN P1IN
#define SADDR P2DIR |= 0xfc
#define ADDR P2OUT
#define RD P2DIR |= BIT1
#define RDHIGH P2OUT |= BIT1
#define RDLOW P2OUT &= ~BIT1
#define WR P3DIR |= BIT2
#define WRHIGH P3OUT |= BIT2
#define WRLOW P3OUT &= ~BIT2
#endif
#if( parameter == 1 ) // mode = 1 serries mode
//-------------IO PRESET--------------//
// P2.0- UD_CLK; P2.1(SIMO)- SDIO;
// P2.2(SOMI)-SDO; P2.3- UCLK;
// P2.4- /CS; P2.5- SHAPED KEY;
// P2.6- IO RST; P2.7- RST;
//------------------------------------//
#define HADEINIT P2OUT = 0xff;P2DIR = 0xff;P3OUT=0xff;P3DIR=0xFe
#define IORESET P2DIR |= BIT4
#define IORESETHIGH P2OUT |= BIT4
#define IORESETLOW P2OUT &= ~BIT4
#define SDO P2DIR |= BIT3
#define SDOHIGH P2OUT |= BIT3
#define SDOLOW P2OUT &= ~BIT3
#define SDIO P2DIR |= BIT2
#define SDIOHIGH P2OUT |= BIT2
#define SDIOLOW P2OUT &= ~BIT2
#define SCLK P3DIR |= BIT2
#define SCLKHIGH P3OUT |= BIT2
#define SCLKLOW P3OUT &= ~BIT2
#define CSB P2DIR |= BIT1
#define CSBHIGH P2OUT |= BIT1
#define CSBLOW P2OUT &= ~BIT1
#define SDIO_IN P2DIR&=~BIT2 //數(shù)據(jù)線選擇輸入
#define SDIO_OUT P2DIR|=BIT2 //數(shù)據(jù)線選擇輸出
#define SDIO_DATA P2IN&BIT2 //數(shù)據(jù)線上的輸入數(shù)據(jù)
#define ORAMP_H P3OUT |= BIT7
#define ORAMP_L P3OUT &= ~BIT7
#define IOSYNC_H P2OUT|=BIT4 //i/o操作同步,為高時(shí)當(dāng)前I/O操作立即結(jié)束
#define IOSYNC_L P2OUT&=~BIT4
#endif
/////////////////////////////////////
/*
公用函數(shù) delay_9854 ( uint ) MRST() IOUpdata()
*/
void delay_9854(uint time)
{
uint i;
for(i = 0; i < time; i++)
{
_NOP();
_NOP();
_NOP();
_NOP();
}
}
void MRST(void)
{
RESETHIGH;
delay_9854(5000);
RESETLOW;
}
void IOUpdate(void)
{
UPDATELOW;
delay_9854(5);
UPDATEHIGH;
delay_9854(5);
UPDATELOW;
}
#if( parameter == 0 ) // parrel
uint systemclk;
void ParallelSendByte(uchar addr, uchar data)
{
DOUT;
WRHIGH;
ADDR = (addr & 0x3f);
WRLOW;
DATAOUT = data;
WRHIGH;
}
uchar ParallelReadByte(uchar addr)
{
uchar result;
DIN;
RDHIGH;
ADDR = (addr & 0x3f);
RDLOW;
result = DATAIN;
RDHIGH;
return result;
}
void ParallelSetReg(uchar saddr, uchar *data, uchar n)
{
uchar i;
for(i = 0; i < n; i++)
{
ParallelSendByte(saddr + i, *data);
data++;
}
IOUpdate();
}
void ParallelSetPhase(uchar saddr, float phase)
{
uchar temp[2];
uchar ph;
ph = (uint) (phase * 45.51111111);
ph = ph & 0x3fff;
temp[0] = ph / 256;
temp[1] = ph % 256;
ParallelSetReg(saddr, temp, 2);
}
void ParallelSetPhase1(float phase)
{
ParallelSetPhase(0, phase);
}
void ParallelSetPhase2(float phase)
{
ParallelSetPhase(2, phase);
}
void ParallelSetFreq(uchar saddr, double freq)
{
double ftw1;
double t;
uchar i;
uchar temp[6];
ftw1 = (freq * 281474976.710656 / (double) systemclk);
t = (double) (1099511627776);
for(i = 0; i < 6; i++)
{
temp[i] = (uchar) (ftw1 / t);
ftw1 = ftw1 - temp[i] * t;
t = t / 256.0;
}
ParallelSetReg(saddr, temp, 6);
}
void ParallelSetFTW1(double freq)
{
ParallelSetFreq(4, freq);
}
void ParallelSetFTW2(double freq)
{
ParallelSetFreq(0x0a, freq);
}
void ParallelSetDFW(double freq)
{
ParallelSetFreq(0x10, freq);
}
void ParallelSetUDClk(ulong clk)
{
uchar temp[4];
long t;
uchar i;
t = 16777216;
for (i = 0; i < 4; i++)
{
temp[i] = clk / t;
clk = clk % t;
t = t >> 8;
}
ParallelSetReg(0x16, temp, 4);
}
void ParallelSetRRClk(ulong clk)
{
uchar temp[3];
long t;
uchar i;
t = 65536;
for (i = 0; i < 3; i++)
{
temp[i] = clk / t;
clk = clk % t;
t = t >> 8;
}
ParallelSetReg(0x1a, temp, 3);
}
void ParallelSetOutShapeKey(uchar saddr, uint amplitude)
{
uchar temp[2];
temp[0] = amplitude / 256;
temp[1] = amplitude % 256;
ParallelSetReg(saddr, temp, 2);
}
void ParallelSetOSKI(uint amplitude)
{
ParallelSetOutShapeKey(0x21, amplitude);
}
void ParallelSetOSKQ(uint amplitude)
{
ParallelSetOutShapeKey(0x23, amplitude);
}
void ParallelSetOSKRAMPRATE(uchar rate)
{
ParallelSetReg(0x25, &rate,1);
}
void ParallelSetQDAC(uint data)
{
uchar temp[2];
temp[0] = data / 256;
temp[1] = data % 256;
ParallelSetReg(0x26, temp, 2);
}
void ParallelPowerDown(bool flag)
{
uchar data;
if (flag == true)
data = 0x17;
else
data = 0x00;
ParallelSetReg(0x1d, &data, 1);
}
void ParallelSetRefClk(uchar times)
{
uchar data;
if(times >= 4)
{
data = 0x20;
if (times >= 10)
data |= 0x40;
data |= times;
systemclk = systemclk * times;
ParallelSetReg(0x1e, &data, 1);
}
}
void ParallelSetMode(bool triangle, bool qdac, uchar mode)
{
uchar data;
data = (mode << 1);
if (triangle == true)
data |= 0x20;
if (qdac == true)
data |= 0x10;
ParallelSetReg(0x1f, &data, 1);
}
void ParallelSetOSK(bool bypass, bool osken, bool oskint)
{
uchar data;
data = 0;
if (bypass == true)
data |= 0x40;
if (osken == true)
data |= 0x20;
if (oskint == true)
data |= 0x10;
ParallelSetReg(0x20, &data, 1);
}
void Init9854(void)
{
DOUT;
SADDR;
RD;
WR;
MRESET;
SHAPEKEYING;
FBH;
UPDATE;
MRST();
SHAPEKEYINGLOW;
FBHLOW;
WRHIGH;
RDHIGH;
systemclk = 20;
ParallelPowerDown(false);
ParallelSetRefClk(4);
ParallelSetMode(false, false, SINGLETONE);
ParallelSetOSK(false, false, false);
}
void SingleTone(float freq, ulong amplitude)
{
ParallelSetMode(false, false, SINGLETONE);
ParallelSetFTW1(freq);
ParallelSetOSKI(amplitude);
ParallelSetOSKQ(amplitude);
}
void UnrampedFSK(float freq1, float freq2)
{
ParallelSetMode(false, false, FSK);
ParallelSetFTW1(freq1);
ParallelSetFTW2(freq2);
}
void RampedFSK(bool triangle, float freq1, float freq2, float rampedfreq, ulong rrclk)
{
ParallelSetMode(triangle, false, RAMPEDFSK);
ParallelSetFTW1(freq1);
ParallelSetFTW2(freq2);
ParallelSetDFW(rampedfreq);
ParallelSetRRClk(rrclk);
}
void PSK(float freq, float phase1, float phase2)
{
ParallelSetMode(false, false, BPSK);
ParallelSetFTW1(freq);
ParallelSetPhase1(phase1);
ParallelSetPhase2(phase2);
}
void AM(void)
{
}
#endif
//char CTRL_REG[]={0x10,0x64,0x00,0x00};
char CTRL_REG[]={0x00,0x6f,0x01,0x20};
#if ( parameter == 1 )
void CS( void )
{
CSBHIGH;
delay_9854(20);
CSBLOW;
}
void BreakOperation( void )//中斷一次I/O操作
{
IORESETHIGH;
delay_9854(20);
IORESETLOW;
}
void SPISendByte(uchar data) //發(fā)送一個(gè)字節(jié)數(shù)據(jù)
{
uchar databuffer[9],i;
SDIO_OUT;
/******以下一段用來得到每次發(fā)送一位時(shí)的應(yīng)發(fā)送的數(shù)據(jù)************************/
for(i=8;i>0;i--)
{
if(data%2)
{databuffer[i]=4;}
else
databuffer[i]=0;
data = data>>1;
}
SCLKHIGH;
for(i=1;i<9;i++)
{
SCLKLOW;
if(databuffer[i])
SDIOHIGH;
else
SDIOLOW;
delay_9854(1);
SCLKHIGH;
delay_9854(1);
}
SCLKLOW;
}
uchar SPIRecieveByte( void ) //接收一個(gè)字節(jié)數(shù)據(jù)
{
uchar databuffer,i;
SDIO_IN;
databuffer=0;
for(i=1;i<9;i++)
{
databuffer=databuffer<<1;
SCLKLOW;
SCLKHIGH;
if(SDIO_DATA)
databuffer+=1;
}
SCLKLOW;
delay_9854 ( 10 );
return databuffer;
}
void Init9854 ( void )
{
uchar k;
HADEINIT;
BreakOperation( );
MRST( );
CS( );
SPISendByte( 0x07 ); // set Control Register addr.
for( k = 0; k < 4; k++ )
{
SPISendByte( CTRL_REG[k] ); // set Control Register
}
//IOUpdate( );
delay_9854 ( 5000 );
}
#endif
#if( msp430 == 1 )
void InitSystemClock(void) // 初始化系統(tǒng)時(shí)鐘
{
WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
SCFI0 |= FN_4;
SCFQCTL = 121; // 7.99MHz 120 * 32.768k
FLL_CTL0 = DCOPLUS + OSCCAP1;
P1DIR = 0x22;
P1SEL = 0x22;
}
#endif
#if( msp430 == 0 )
void InitSystemClock(void) // 初始化系統(tǒng)時(shí)鐘
{
unsigned char i;
WDTCTL=WDTPW+WDTHOLD;//關(guān)閉看門狗
BCSCTL1 &= ~XT2OFF; // XT2on
do
{
IFG1 &= ~OFIFG; // Clear OSCFault flag
for (i = 0xFF; i > 0; i--); // Time for flag to set
}
while ((IFG1 & OFIFG)); // OSCFault flag still set?
BCSCTL2 |= SELM_2 + SELS;
}
#endif
#if( parameter == 0 )
void main( void )
{
uchar k,temp,readword;
InitSystemClock ( );
Init9854 ( );
MRST( );
Init9854 ( );
SingleTone ( 200000, 0xFFF );
temp = 0x1d;
for ( k = 4; k; k-- )
{
readword = ParallelReadByte ( temp ++ );
}
LPM0;
}
#endif
#if( parameter == 1 )
void main( void )
{
uchar k,temp;
InitSystemClock ( );
Init9854 ( );
MRST( );
while ( 1 )
SPISendByte( 0xff );
//it9854 ( );
SPISendByte(0x02); // set Frequency 1 addr.
SPISendByte(0x03); // set Frequency 1 NO.
for(k=0;k<5;k++)
{
SPISendByte(0x33); // set Frequency 1 NO.
}
//IOUpdate( );
delay_9854 ( 5000 );
SPISendByte( 0x87 );
for(k=0;k<4;k++)
{
temp = SPIRecieveByte( );
}
SPISendByte(0x82); // set Frequency 1 addr.
for(k=0;k<6;k++)
{
temp = SPIRecieveByte( ); // set Frequency 1 NO.
}
LPM0;
}
#endif
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -