⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 DSP与CC2400连接.做的无线数据发送程序.程序现在没有加入校验部分.也可以当接收程序使用.不用修改
💻 C
字号:
//#define	XRDY	0X0002
//#define	RRDY	0X0002
#define	nop		asm(" NOP ")
#define set_spi_cs()	SPSD |= 0X0008  
#define clr_spi_cs() 	SPSD &= 0XFFF7  
#define set_spi_clk()	SPSD |= 0X0002  
#define clr_spi_clk()	SPSD &= 0XFFFD 
#define set_spi_di()	SPSD |= 0X0020
#define clr_spi_di()	SPSD &= 0XFFDF
#define read_spi_do		SPSD & 0X0010	
#define	reset	          15
ioport unsigned char port1;
//int i=0; 
unsigned int counter=0;
#include "mcbsp.h"
#include "HPI.H"
#include "CC2400.H"
unsigned char CC2400status;
unsigned int sramaddr = 0x8000;//发送数据起始地址
unsigned int READ_DATA = 0x8100;//发送数据起始地址
void init_pll();
void Init_HPI();
void data_buffer(void);
void write_fifo();
void mcbsp_gpio();
interrupt void xint0();
interrupt void xint1();
void SPI_STROBE(unsigned char Address);
void SPI_RX_ADDR(unsigned char Address);
void  spi_write(unsigned char spi_bValue);  
void SPI_SETREG(unsigned char Address,unsigned char Var_High,unsigned char Var_Low);
void rfInit();
void SPI_UPD_STATUS(unsigned char spi_bValue);  
void spi_write_data_16(unsigned int out_data);
void Init_cc2400();
void rfon(void);
void SPI_GETREG(unsigned char spi_bValue);
void SPI_RX_ADDR(unsigned char spi_bValue);
void read_fifo();
void delay();
void delay_Nms(unsigned int n);
/*********************************************************************************
*                     无线发送主函数
*********************************************************************************/
void main(void) 
{
	//int i;
	PMST = 0XA8;
	port1 = 0x08;
	init_pll();
	Init_HPI();
	mcbsp_gpio();
	data_buffer();
	Init_cc2400();
	asm (" SSBX  INTM ");//关中断
	IMR = 1;//允许INT0中断
//	IMR = 2;//允许INT1中断
	IFR =0XFF;//清除所有挂起的中断
	asm (" RSBX	 INTM ");//开中断	
	//发送
	//GPIOSR |=RX_HIGH;
//	SPI_GETREG(CC2400_FSMSTATE);
	//SPI_STROBE(CC2400_STX);
	//for(;;)
	//{
//	write_fifo();
	SPI_SETREG(0X70, 0X00,0X01);
	SPI_SETREG(0X70, 0X02,0X03);
	SPI_SETREG(0X70, 0X04,0X05);
	SPI_SETREG(0X70, 0X06,0X07);
	SPI_SETREG(0X70, 0X08,0X09);
	SPI_SETREG(0X70, 0X0A,0X0B);
	SPI_SETREG(0X70, 0X0C,0X0D);
	SPI_SETREG(0X70, 0X0E,0X0F);	
	//}
	//for (i=0;i<100;i++)
//	{
//	for(;;)
	SPI_GETREG(0X70);
	SPI_GETREG(0X70);
	SPI_GETREG(0X70);
	SPI_GETREG(0X70);
	SPI_GETREG(0X70);
	SPI_GETREG(0X70); 
	SPI_GETREG(0X70); 
	SPI_GETREG(0X70); 
//	{
//	read_fifo();
//	}
//	write_fifo();
	//}
	SPI_STROBE(CC2400_STX);
//	SPI_GETREG(CC2400_FSMSTATE);
	//发送
	//GPIOSR |=RX_LOW;
	for(;;)
	{
	}
}
/*********************************************************************************
*                     设置DSP工作频率
*********************************************************************************/
void init_pll()
{
	int i;
	CLKMD = 0;
	do{
	i=0x01&CLKMD;
	}
	while(i!=0);
	CLKMD = 0x47ff;//1倍16MHZ
	i=0;
}
/*********************************************************************************
*                     发送数据缓冲区填充
*********************************************************************************/
//144*180字=0X6540字
void  data_buffer(void)
{
	unsigned int i;	
	for(i =0; i<0xff;i++)//0x6540
	{
		*(unsigned int *)sramaddr++ = i+0x4412;
	}
	sramaddr=0X8000;
	i=0;
}
/*********************************************************************************
*                     将HPI配置为IO接口
*********************************************************************************/
void Init_HPI()
{ 	
	GPIOCR = GPIOCR & 0X0F9;//HD1(GIO6)、 HD2(GIO1)输入
	GPIOCR = GPIOCR | 0X009;//HD0(TX)、  DD3(RX)输出
}
/*********************************************************************************
*                     将MCBSP配置为SPI接口
*********************************************************************************/
void mcbsp_gpio()
{
	//地1步XRST=RRST=0;
	SPSA=SPCR1;
	SPSD = 0X0000;
	SPSA=SPCR2;
	SPSD = 0X0000;
	SPSA=PCR;
	SPSD = 0X3F00;
}
/*********************************************************************************
*                     FIFO写函数
*********************************************************************************/
void write_fifo()
{
	int i;
	//CS=0;
	clr_spi_cs();
	//FIFO寄存器地址;
	spi_write(CC2400_FIFOREG);
	//连续写入要发送的15个字+1个长度字节,31字节
	for(i=0;i<8;i++)
	{
		spi_write_data_16(*((unsigned int *)sramaddr++));
		if(sramaddr >= 0X80FF)
		{
			sramaddr=0X8000;
		}
		//sramaddr +=1;	
	}
	delay();
	set_spi_cs();
}
/*******************************************************************************
}**
*                    中断0服务函数
*********************************************************************************/
interrupt void xint0()	// XINT0中断服务程序(发送完毕中断)
{
	delay_Nms(1000);
	counter=counter+1;
//	SPI_GETREG(CC2400_FSMSTATE);
	//关闭
//	SPI_STROBE(CC2400_SRFOFF);
	//返回FS;
	//GPIOSR |=RX_HIGH;
//	SPI_GETREG(CC2400_FSMSTATE);
	SPI_STROBE(CC2400_SFSON);		
	
	// 等待频率合成器锁定 
	do 
	{ 
		SPI_UPD_STATUS(CC2400_MAIN);	 
	} while (!(CC2400status & FS_LOCK));
//	SPI_GETREG(CC2400_FSMSTATE);
	//GPIOSR |=RX_LOW;
	//write_fifo();    
	SPI_SETREG(0X70, 0X00,0X01);
	SPI_SETREG(0X70, 0X02,0X03);
	SPI_SETREG(0X70, 0X04,0X05);
	SPI_SETREG(0X70, 0X06,0X07);
	SPI_SETREG(0X70, 0X08,0X09);
	SPI_SETREG(0X70, 0X0A,0X0B);
	SPI_SETREG(0X70, 0X0C,0X0D);
	SPI_SETREG(0X70, 0X0E,0X0F);	
	SPI_STROBE(CC2400_STX);
//	SPI_GETREG(CC2400_FSMSTATE);
}
interrupt void xint1()	// XINT1中断服务程序(FIFO空中断)
{
	counter=counter+1;
}
	


/*********************************************************************************
*                    CC2400初始化
*********************************************************************************/
void Init_cc2400()
{
	// RF default state
//	GPIOSR = GPIOSR & RX_LOW;//RX = 0;	
//	GPIOSR = GPIOSR & TX_LOW;//TX = 0;


	rfInit();

	rfon();
}	
/*********************************************************************************
*                     CC2400寄存器配置
*********************************************************************************/
void SPI_SETREG(unsigned char Address,unsigned char Var_High,unsigned char Var_Low)
{
	clr_spi_cs();
	spi_write(Address);
	
	spi_write(Var_High);

	spi_write(Var_Low);
	set_spi_cs();
}

/*********************************************************************************
*                     无线初始化(初始化寄存器)
*********************************************************************************/
void rfInit()
{
//	unsigned int j;
	//for(;;)
	//{
	// Optional reset
	
		SPI_SETREG(CC2400_MAIN,0x00,0X00);
		SPI_SETREG(CC2400_MAIN,0x80,0X00);
	

	// Register settings
	SPI_SETREG(CC2400_FSDIV, FSDIV_Var_HIGH,FSDIV_Var_LOW);
	SPI_SETREG(CC2400_MDMCTRL, MDMCTRL_Var_HIGH,MDMCTRL_Var_LOW);
	SPI_SETREG(CC2400_FREND, FREND_Var_HIGH,FREND_Var_LOW);	
	SPI_SETREG(CC2400_IOCFG, IOCFG_Var_HIGH,IOCFG_Var_LOW);		
	SPI_SETREG(CC2400_MDMTST0, MDMTST0_Var_HIGH,MDMTST0_Var_LOW);	
	SPI_SETREG(CC2400_GRMDM, GRMDM_Var_HIGH,GRMDM_Var_LOW);		 
	SPI_SETREG(CC2400_FSMTC, FSMTC_Var_HIGH,FSMTC_Var_LOW);
	SPI_SETREG(CC2400_MANAND, MANAND_Var_HIGH,MANAND_Var_LOW);
	SPI_SETREG(CC2400_LMTST, LMTST_Var_HIGH,LMTST_Var_LOW);
	SPI_SETREG(CC2400_MDMTST1,MDMTST1_Var_HIGH,MDMTST1_Var_LOW);
	SPI_SETREG(CC2400_GRDEC,GRDEC_Var_HIGH,GRDEC_Var_LOW);	
	//SPI_SETREG(CC2400_INT,INT_Var_HIGH,INT_Var_LOW);	
	//}	
	//for(;;)
	//{
//读取寄存器值
	SPI_GETREG(CC2400_MAIN);
	SPI_GETREG(CC2400_FSCTRL);
	SPI_GETREG(CC2400_FSDIV);
	SPI_GETREG(CC2400_MDMCTRL);
	SPI_GETREG(CC2400_AGCCTRL);
	SPI_GETREG(CC2400_FREND);
	SPI_GETREG(CC2400_RSSI);
	SPI_GETREG(CC2400_FREQEST);
	SPI_GETREG(CC2400_IOCFG);
	SPI_GETREG(CC2400_FSMTC);
	SPI_GETREG(CC2400_MANAND);
	SPI_GETREG(CC2400_FSMSTATE);
	SPI_GETREG(CC2400_ADCTST);
	SPI_GETREG(CC2400_RXBPFTST);
	SPI_GETREG(CC2400_PAMTST);
	SPI_GETREG(CC2400_LMTST);
	SPI_GETREG(CC2400_MANOR);
	SPI_GETREG(CC2400_MDMTST0);
	SPI_GETREG(CC2400_MDMTST1);
	SPI_GETREG(CC2400_DACTST);
	SPI_GETREG(CC2400_AGCTST0);
	SPI_GETREG(CC2400_AGCTST1);
	SPI_GETREG(CC2400_AGCTST2);
	SPI_GETREG(CC2400_FSTST0);
	SPI_GETREG(CC2400_FSTST1);
	SPI_GETREG(CC2400_FSTST2);
	SPI_GETREG(CC2400_FSTST3);
	SPI_GETREG(CC2400_MANFIDL);
	SPI_GETREG(CC2400_MANFIDH);
	SPI_GETREG(CC2400_GRMDM);
	SPI_GETREG(CC2400_GRDEC);
	SPI_GETREG(CC2400_PKTSTATUS);
	SPI_GETREG(CC2400_INT);
	SPI_GETREG(CC2400_SYNCL);
	SPI_GETREG(CC2400_SYNCH);
//	}	
	
}
/*********************************************************************************
*                     发送打开
*********************************************************************************/ 
void rfon(void)
{

	// 晶振工作
	SPI_STROBE(CC2400_SXOSCON);	

	// 等待晶振稳定
	do 
	{ 
		SPI_UPD_STATUS(CC2400_MAIN);
	} while (!(CC2400status & XOSC16M_STABLE));   

	// 打开频率合成器
	//R_RX = 1;
	//GPIOSR |=RX_HIGH;
	//R_TX = 1;	
	//GPIOSR |=TX_HIGH;	
	SPI_STROBE(CC2400_SFSON);		
	
	// 等待频率合成器锁定 
	do 
	{ 
		SPI_UPD_STATUS(CC2400_MAIN);	 
	} while (!(CC2400status & FS_LOCK));

	// 开始接收
	//if (M_MASTER) {
	//	R_TX = 0;
	//}
}

//向控制选通寄存器写地址
/*********************************************************************************
*                     CC2400指令选通寄存器访问
*********************************************************************************/	
void SPI_STROBE(unsigned char Address)
{
	clr_spi_cs();
	spi_write(Address);
	set_spi_cs();
}
//PCR = 0011 1111 00 DX_TAT(DX输出) DR_STAT(DR输入)  FSXP(FSX片选) 0 CLKXP(CLKX时钟) 0
/*********************************************************************************
*                     获取CC2400芯片状态
*********************************************************************************/

//获取芯片的状态位CC2400status
void  SPI_UPD_STATUS(unsigned char spi_bValue)  
{  
	unsigned int i;
	CC2400status=0;
	for(i=0;i<8;i++)  
	{  
		//时钟低
		clr_spi_clk();  
		CC2400status = (CC2400status <<1);
		  
		if ((spi_bValue&0x80)==0x80)  
		{
			set_spi_di();
		}
		else  
		{
			clr_spi_di();
		} 
		//上升沿 
		set_spi_clk(); 
		//读取输入状态
		if ((read_spi_do)==0X10)
		{
			CC2400status |= 0X01;
		}
		else
		{
			CC2400status &= ~0X01;
		}
		//下一位  
		spi_bValue = (spi_bValue << 1);  
 	}  

} 
 
/*********************************************************************************
*                     单字节写(值或地址)
*********************************************************************************/
//向寄存器写值
void  spi_write(unsigned char spi_bValue)  
{  
	int timer;
	for(timer=0;timer<8;timer++)  
	{  
		//时钟低
		clr_spi_clk();  		  
		if ((spi_bValue&0x80)==0x80)  
		{
			set_spi_di();
		}
		else  
		{
			clr_spi_di();
		} 
		//上升沿 
		set_spi_clk(); 
		//下一位  
		spi_bValue = (spi_bValue << 1);  
 	}  

} 
 
/*********************************************************************************
*                     单字写函数(写数据)
*********************************************************************************/
void spi_write_data_16(unsigned int out_data)
{  
	int count;
	for(count=0;count<16;count++)  
	{  
		//时钟低
		clr_spi_clk();  		  
		if ((out_data&0x8000)==0x8000)  
		{
			set_spi_di();
		}
		else  
		{
			clr_spi_di();
		} 
		//上升沿 
		set_spi_clk(); 
		//下一位  
		out_data = (out_data << 1);  
 	}  

} 
/*********************************************************************************
*                     获得寄存器值或FIFO值?
*********************************************************************************/ 
//读取一寄存器数据(写寄存器后测试用)
unsigned int SPI_RX_WORD()
{
	int cishu;
	unsigned int In_data=0;
	for(cishu=0;cishu<17;cishu++)
	{
		clr_spi_clk();
		In_data=(In_data<<1);
		//set_spi_clk(); 
		if ((read_spi_do)==0X10)
		{
			In_data |= 0X0001;
		}
		else
		{
			In_data &= ~0X0001;
		}
		set_spi_clk(); 
	}
 	return(In_data);
}
void SPI_RX_ADDR(unsigned char spi_bValue)
{  
	int  shu;
	spi_bValue = spi_bValue | 0x80;
	for(shu=0;shu<8;shu++)  
	{  
		//时钟低
		clr_spi_clk();  		  
		if ((spi_bValue&0x80)==0x80)  
		{
			set_spi_di();
			//counter=counter+1;
		}
		else  
		{
			clr_spi_di();
		} 
		//上升沿 
		set_spi_clk(); 
		//下一位  
		spi_bValue = (spi_bValue << 1);  
 	}  

} 
	
void SPI_GETREG(unsigned char spi_bValue)
{
	clr_spi_cs();
	SPI_RX_ADDR(spi_bValue);
	*((unsigned int *)READ_DATA++) = SPI_RX_WORD();//jkdlsfjlasfjlskdjfsaldjfaksjf
	delay();
	set_spi_cs();
	//READ_DATA =READ_DATA+1;
}
void read_fifo()
{
	int jishu;
	//CS=0;
	clr_spi_cs();
	//FIFO寄存器地址;
	spi_write(CC2400_FIFOREG |0X80);
	//连续写读出要发送的15个字+1个长度字节,31字节
	for(jishu=0;jishu<8;jishu++)
	{
		*((unsigned int *)READ_DATA++) = SPI_RX_WORD();
		//READ_DATA =READ_DATA+1;
	}
	clr_spi_clk();
	delay();
	set_spi_cs();
}
//注:寄存器0X23的值需要变化,以使FIFO每次容纳31字节
void delay()
{
	int j;
	for(j=0;j<80;j++)
	{
	nop;
	}
}
void delay_Nms(unsigned int n)
{
	unsigned int i,j;
	for(i=0;i<n;i++)
	{
		for(j=0;j<1000;j++)
		{
			nop;
			nop;
			nop;
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -