📄 main.c
字号:
#include "msp430x22x4.h"
#define DELTA_1MHZ 244 // 244 x 4096Hz = 999.4Hz
#define DELTA_2MHZ 488 // 488 x 4096Hz = ~2MHz
#define DELTA_8MHZ 1953 // 1953 x 4096Hz = 7.99MHz
#define DELTA_12MHZ 2930 // 2930 x 4096Hz = 12.00MHz
#define DELTA_16MHZ 3906 // 3906 x 4096Hz = 15.99MHz
//定义FM1702SL各管脚。采用SPI接口。
#define TI_FM_NSS_PxOUT P3OUT //CS管脚采用P3.0
#define TI_FM_NSS_PxDIR P3DIR
#define TI_FM_NSS_PIN BIT7
//SPI使用MSP430的USCIB0,P3.1:SIMO;P3.2:SOMI;P3.3:CLK
#define TI_FM_SPI_USCIB0_PxSEL P3SEL
#define TI_FM_SPI_USCIB0_PxDIR P3DIR
#define TI_FM_SPI_USCIB0_PxIN P3IN
#define TI_FM_SPI_USCIB0_SIMO BIT1
#define TI_FM_SPI_USCIB0_SOMI BIT2
#define TI_FM_SPI_USCIB0_UCLK BIT3
//;==============================================
//;FM1702SL控制寄存器定义
//;==============================================
#define Page_Reg 0x00
#define Command_Reg 0x01
#define FIFO_Reg 0x02
#define FIFOLength_Reg 0x04
#define SecondaryStatus_Reg 0x05
#define InterruptEn_Reg 0x06
#define InterruptRq_Reg 0x07
#define Control_Reg 0x09
#define ErrorFlag_Reg 0x0A
#define BitFraming_Reg 0x0F
#define TxControl_Reg 0x11
#define CwConductance_Reg 0x12
#define RxControl2_Reg 0x1E
#define ChannelRedundancy_Reg 0x22
#define RxWait_Reg 0x21
char temp[512];
unsigned char ccc;
unsigned char acktemp;
void Delayms(int n)
{//在SMCLK为2MHz时,延时1ms
char i;
while(n--)
for(i=0;i<155;i++);
}
void Set_DCO(unsigned int Delta) // Set DCO to selected frequency
{
unsigned int Compare, Oldcapture = 0;
BCSCTL1 |= DIVA_3; // ACLK = LFXT1CLK/8
TACCTL2 = CM_1 + CCIS_1 + CAP; // CAP, ACLK
TACTL = TASSEL_2 + MC_2 + TACLR; // SMCLK, cont-mode, clear
while (1)
{
while (!(CCIFG & TACCTL2)); // Wait until capture occured
TACCTL2 &= ~CCIFG; // Capture occured, clear flag
Compare = TACCR2; // Get current captured SMCLK
Compare = Compare - Oldcapture; // SMCLK difference
Oldcapture = TACCR2; // Save current captured SMCLK
if (Delta == Compare)
break; // If equal, leave "while(1)"
else if (Delta < Compare)
{
DCOCTL--; // DCO is too fast, slow it down
if (DCOCTL == 0xFF) // Did DCO roll under?
if (BCSCTL1 & 0x0f)
BCSCTL1--; // Select lower RSEL
}
else
{
DCOCTL++; // DCO is too slow, speed it up
if (DCOCTL == 0x00) // Did DCO roll over?
if ((BCSCTL1 & 0x0f) != 0x0f)
BCSCTL1++; // Sel higher RSEL
}
}
TACCTL2 = 0; // Stop TACCR2
TACTL = 0; // Stop Timer_A
BCSCTL1 &= ~DIVA_3; // ACLK = LFXT1CLK
}
/****************************************************************************
* 名称:SetUCB0_SPIMode()
* 功能:初始化与DS1390的SPI接口
* 入口参数:无
* 出口参数:无
****************************************************************************/
void SetUCB0_SPIMode(void)
{
UCB0CTL1 = UCSWRST;
TI_FM_NSS_PxDIR |= TI_FM_NSS_PIN;
TI_FM_NSS_PxOUT |= TI_FM_NSS_PIN; //NSS,MSP430 USCIBSET 是最合适的选择,但是为了USCIA作为SPI,USCIBSET复用为USCIBCLK。
TI_FM_SPI_USCIB0_PxSEL |= TI_FM_SPI_USCIB0_SIMO | TI_FM_SPI_USCIB0_SOMI | TI_FM_SPI_USCIB0_UCLK;
// SPI option select
TI_FM_SPI_USCIB0_PxDIR |= TI_FM_SPI_USCIB0_SIMO + TI_FM_SPI_USCIB0_UCLK;
// SPI TX out direction
// UCB0CTL0 = UCSYNC + UCMST + UCMSB; //8-bit SPI Master **SWRST**
UCB0CTL0 = UCSYNC + UCMST + UCMSB;
//+ UCCKPH
UCB0CTL1 = UCSSEL_2; //
UCB0BR0 = 0x10; //
UCB0BR1 = 0x00; //
UCB0CTL1 &= ~UCSWRST; // Initialize USART state machine
}
//从SPI接口读入数据
char SPIRead(char SpiAddress,char *ramadr,char width)
{
char j,adrtemp;
adrtemp = SpiAddress;
if((adrtemp&0xc0)==0)
{adrtemp=((adrtemp<<1)|0x80);
TI_FM_NSS_PxOUT &= ~TI_FM_NSS_PIN; //NSS enable
IFG2 &= ~UCB0RXIFG;
UCB0TXBUF = adrtemp;
while (!(IFG2&UCB0RXIFG)); // Wait for TX to finish
IFG2&=~ UCB0RXIFG;
for(j=0;j<width;j++)
{if(j!=width-1) adrtemp=(SpiAddress|0x40)<<1;
else adrtemp=0;
ramadr[j]=0;
UCB0TXBUF = adrtemp;
while (!(IFG2&UCB0RXIFG)); // Wait for TX to finish
;
IFG2&=~ UCB0RXIFG;
ramadr[j] = UCB0RXBUF;
}
TI_FM_NSS_PxOUT |= TI_FM_NSS_PIN; //NSS disable
return(0);
}
else return(1);
}
char SPIWrite(char SpiAddress,char *ramadr,char width)
{
char j,adrtemp;
adrtemp=SpiAddress;
if ((adrtemp & 0xc0) == 0)
{
adrtemp = ((adrtemp << 1) & 0x7e);
TI_FM_NSS_PxOUT &= ~TI_FM_NSS_PIN; //NSS enable
UCB0TXBUF = adrtemp;
while (!(IFG2&UCB0RXIFG)); // Wait for TX to finish
for(j = 0; j < width; j++)
{
adrtemp= ramadr[j];
IFG2 &= ~UCB0RXIFG;
UCB0TXBUF = adrtemp;
while (!(IFG2&UCB0RXIFG)); // Wait for TX to finish
}
TI_FM_NSS_PxOUT |= TI_FM_NSS_PIN; //NSS disable
return(0);
}
else return(1);
}
//从SPI接口写入数据
void WriteRawIO(unsigned char Address, unsigned char value)
{
TI_FM_NSS_PxOUT &= ~TI_FM_NSS_PIN; //NSS enable
IFG2 &= ~ UCB0RXIFG;
UCB0TXBUF = (Address<<1);
while (!(IFG2&UCB0RXIFG)); // Wait for TX to finish
;
IFG2&=~ UCB0RXIFG;
UCB0TXBUF = value;
while (!(IFG2&UCB0RXIFG));
;
TI_FM_NSS_PxOUT |= TI_FM_NSS_PIN; //NSS disable
}
//从SPI接口读出数据
unsigned char ReadRawIO(unsigned char Address)
{
unsigned char c_R;
c_R = (Address<<1)|0x80;
TI_FM_NSS_PxOUT &= ~TI_FM_NSS_PIN; //NSS enable
IFG2 &= ~UCB0RXIFG;
UCB0TXBUF = c_R;
while (!(IFG2&UCB0RXIFG)); // Wait for TX to finish
IFG2 &= ~UCB0RXIFG; // Clear flag set during last write
UCB0TXBUF = 0; // Dummy write so we can read data
//UCB0TXBUF =(Address<<1)|0x80;
while (!(IFG2&UCB0RXIFG)); // Wait for RX to finish
c_R = UCB0RXBUF;
IFG2 &= ~UCB0RXIFG;
TI_FM_NSS_PxOUT |= TI_FM_NSS_PIN; //NSS disable
return c_R;
}
///////////////////////////////////////////////////////////////////////////////
// G E N E R I C W R I T E
///////////////////////////////////////////////////////////////////////////////
void WriteIO(unsigned char Address, unsigned char value)
{
WriteRawIO(Address,value); // write value at the specified
// address
}
///////////////////////////////////////////////////////////////////////////////
// G E N E R I C R E A D
///////////////////////////////////////////////////////////////////////////////
unsigned char ReadIO(unsigned char Address)
{
unsigned char c;
c = ReadRawIO(Address); // read value at the specified
// address
return c;
}
#define SEC_NO_MICORE
#ifndef SEC_NO_MICORE
///////////////////////////////////////////////////////////////////////////////
// W R I T E S E V E R A L M E M O R Y L O C A T I O N S
///////////////////////////////////////////////////////////////////////////////
void WriteIOBlock(unsigned char *Addr_Data, unsigned short len)
{
unsigned short cnt;
for (cnt = 0; cnt < len; cnt++)
{
// write value at the specified address
WriteRawIO(Addr_Data[cnt*2],Addr_Data[cnt * 2 + 1]);
}
}
///////////////////////////////////////////////////////////////////////////////
// R E A D S E V E R A L M E M O R Y L O C A T I O N S
///////////////////////////////////////////////////////////////////////////////
void ReadIOBlock(unsigned char* Addr_Data, unsigned short len)
{
unsigned short cnt;
for (cnt = 0; cnt < len; cnt)
{
Addr_Data[cnt*2 + 1] = ReadRawIO(Addr_Data[cnt*2]);// read value at the
// specified address
}
}
#endif
char FM1702SL_Init()
{char temp[1];
temp[0]=0x7f;
WriteIO(InterruptEn_Reg,temp[0]);
WDTCTL = WDTPW+WDTCNTCL+WDTSSEL; // wdt 定时1S
acktemp = ReadRawIO(InterruptEn_Reg);
Delayms(50); // 延时,等待DCO稳定
Delayms(50);
temp[0]=0x7f;
WriteIO(InterruptRq_Reg,temp[0]);
WDTCTL = WDTPW+WDTCNTCL+WDTSSEL; // wdt 定时1S
acktemp = ReadRawIO(InterruptEn_Reg);
Delayms(50); // 延时,等待DCO稳定
Delayms(50);
WDTCTL = WDTPW+WDTCNTCL+WDTSSEL; // wdt 定时1S
acktemp = ReadRawIO(InterruptEn_Reg);
Delayms(50); // 延时,等待DCO稳定
Delayms(50);
temp[0]=0x5b;
WriteIO(TxControl_Reg,temp[0]);
WDTCTL = WDTPW+WDTCNTCL+WDTSSEL; // wdt 定时1S
acktemp = ReadRawIO(InterruptEn_Reg);
Delayms(50); // 延时,等待DCO稳定
Delayms(50);
temp[0]=0x1;
WriteIO(RxControl2_Reg,temp[0]);
WDTCTL = WDTPW+WDTCNTCL+WDTSSEL; // wdt 定时1S
Delayms(50);
acktemp =ReadRawIO (InterruptEn_Reg);
Delayms(50); // 延时,等待DCO稳定
Delayms(50);
temp[0]=0x7;
WriteIO(RxWait_Reg,temp[0]);
Delayms(50);
acktemp = ReadRawIO(RxWait_Reg);
Delayms(50); // 延时,等待DCO稳定
Delayms(50);
// acktemp=SPIRead(RxWait_Reg,temp,1);
// if(acktemp) return(1);
return(0);
}
void ResetFM()
{
P1DIR |= BIT2;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -