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

📄 main.c

📁 基于TI的TMS240x系列DSP与nrf905的无线通信程序源码
💻 C
字号:
#include "reg2407A.h"

typedef unsigned int uint;
typedef unsigned char uchar;

#define WC 	0X0000	//Write configuration register command
#define RC 	0X1000	//Read  configuration register command
#define WTP 0X2000	//Write Tx Payload command
#define RTP 0X2100	//Read  Tx Payload command
#define WTA 0X2200	//Write Tx Address command
#define RTA 0X2300	//Read  Tx Address command
#define RRP 0X2400 	//Read  Rx Payload command 

#define SPI_TLK_ENA  0x0002
#define SPI_TLK_DIS  0xFFFD

/* global variable */

// the data sent via SPI to NRF905
uint TxBuf[6] ={0x0000,0x0001,0x0001,0x0001,0x0001,0x0001};

// the configure written to NRF905
uint RxTxConf[10] ={0x7600, 0x2E00, 0x4400, 0x0600, 0x0600, 0x0E700,
	0x0E700, 0x0E700, 0x0E800, 0x5800};

// the data received from NRF905
uint RxBuf[6] ={0x0000,0x0000,0x0000,0x0000,0x0000,0x0000};

uint RxData;
uint RC_config[10];
uint RTx_Payload[6] = {0x0000,0x0000,0x0000,0x0000,0x0000,0x0000};

uint DRflag=0, AMflag=0, CDflag=0;


/*********************************************************************
初始化函数定义区
*********************************************************************/

/*禁止全局中断*/
void inline disable()
{
	asm(" setc INTM");
}

/* 使能全局中断*/
void inline enable()
{
	asm(" clrc INTM");
}

/* 延时程序, 100us */
void delay(uint t)
{
    uint n, f;
    for(n = 0; n < t; n ++)
    {
    	for(f = 0; f < 1000; f ++)
    	{  
	     	asm (" nop");
       		asm (" nop");
       		asm (" nop");
       		asm (" nop");
       		asm (" nop");
       	}
    }
}

/*系统初始化*/
void initial()
{
	asm(" setc SXM");				//符号位扩展
	asm(" clrc OVM");				//累加器中结果正常溢出
	asm(" clrc CNF");				//B0被配置为数据存储空间
	SCSR1 = 0X81FE;					//CLKIN = 10M, CLKOUT = 4 * CLKIN = 40M
	WDCR = 0X0E8;					//禁止看门狗
	IMR = 0X0017;					//允许INT1、INT2、INT3、INT5中断
	IFR = 0X0FFFF;
	WSGR = 0X00;
}

// intialize the nrf905
void NRF905_IO_Initial( void )
{
	uchar i;
	
	// set IOPB
	MCRA &= 0x7EFF;			// PB1, PB2, PB3, PB7 out; 0111 1110 1111 1111
	PBDATDIR |= 0x8E00;		// output is 0; 1000  1110 0000 0000

	// set IOPC
	MCRB |= 0x001C;			// PC2, PC3, PC4 SPI relation; 0000 0000 0001 1100
	MCRB &= 0x0FFDF;		// PC5 in;	1111 1111 1101 1111
	PCDATDIR &= 0x0DFFF;	// 1101 1111 1111 1111

	// set IOPE
	MCRC &= 0x0FF9F;		// PE5, PE6 in; 1111 1111 1001 1111
	PEDATDIR &= 0x9FFF;		// 1001 1111 1111 1111

	// standby mode and program mode
	PBDATDIR |= 0x0080;		// CSN=1
	PBDATDIR |= 0x0008;		// PWR=1 0000 0000 0000 1000
	PBDATDIR &= 0x0FFFB;	// TRX_CE=0 1111 1111 1111 1011
	PBDATDIR &= 0x0FFFD;	// TXEN=0   1111 1111 1111 1101

	delay(30);				// 3ms

	for(i=0; i<10; i++) {    
    	RC_config[i] = 0;
   	}
}

// initialize the SPI module
void SPI_Initial( void )
{
	SPICCR = 0x0007;		// 0000 0000 0000 0111 数据长度为8 char bits,
							// 在SPICLK的上升沿发送数据,
							// PTR在下降沿接收数据
	SPICTL = 0x000E;		//0000 0000 0000 1110 有延时的上
							// 升沿 使能主动模式,
							// 一般的时钟方式,
							// 使能TALK(允许发送),
							// 禁止SPI中断
	SPIBRR = 0x0009;		// 波特率为4M,CLKOIUT=40M
	
	SPIPRI = 0x0040;		// 0100 0000
	
	SPICCR |= 0x0080;		// 使SPI退出复位状态
}

// write data via SPI bus
void SPI_Write(uint data)
{
	uint flag;
	SPITXBUF = data;
	while(1) {
		flag = SPISTS & 0x40;	//	flag=SPI的中断标志
		// 如果SPI的中断标志为1,则证明SPI已经发送成功,
		// 则停止等待
		if(flag == 0x40)
			break;
	}
	SPIRXBUF = SPIRXBUF;		// 虚读SPIRXBUF寄存器,
								// 以清除SPI中断标志
	return;
}

// read data from SPI bus
uchar SPI_Read(void)
{
	uint flag;
	SPITXBUF = 0x0FF00;    		//start SPI
    while(1)
    {
    	flag =(SPISTS & 0x40);        
        if( flag == 0x40 ) break;
    }       	
	RxData = SPIRXBUF & 0x00FF;
	return RxData;
}

// set the NRF905 as Standby mode
void SetSt_ByMode()
{
	PBDATDIR |= 0x0008;		// PWR=1; 0000 0000 0000 1000
	PBDATDIR &= 0x0FFFB;	// TRX_CE=0; 1111 1111 1111 1011
	delay(10);
}

// set the NRF905 as Send mode
void SetTxMode(void)
{
	PBDATDIR |= 0x0008;		// PWR=1; 0000 0000 0000 1000
	PBDATDIR |= 0x0004;		// TRX_CE=1; 0000 0000 0000 0100
	PBDATDIR |= 0x0002;		// TXEN=1;  0000 0000 0000 0010
	delay(10);
}

// set the NRF905 as Receive mode, begin to receive data
void SetRxMode(void)
{
	PBDATDIR |= 0x0008; 	// PWR=1; 0000 0000 0000 1000
	PBDATDIR |= 0x0004;		// TRX_CE=1; 0000 0000 0000 0100
	PBDATDIR &= 0x0FFFD;	// TXEN=0; 1111 1111 1111 1101	
	delay(10);
}

// setting NRF905, writting the configure register
void Config905(void)
{
	uchar i;

	// standby mode and write cofigure
	SetSt_ByMode();
	PBDATDIR &= 0x0FF7F;	// CSN=0; 1111 1111 0111 1111
	SPI_Write(WC);
	
 	for(i=0;i<10;i++) {
		SPI_Write(RxTxConf[i]);
	}
	
	PBDATDIR|=0x0080;		// CSN=1; 0000 0000 1000 0000
	
}

// read the cofigure register
void RConfig()
{
	uchar i;
	
	SetSt_ByMode();			// standymode
	PBDATDIR &=0x0FF7F;		// CSN=0
	SPI_Write(RC);
	   	
   	for(i=0; i<10; i++) {
    	SPI_Read();
    	RC_config[i] = RxData;
    }
    PBDATDIR |= 0x0080;		// CSN=1
}

// send packet via NRF905
void TxPacket()
{
	uchar i;

	SetSt_ByMode();

	// write data
	PBDATDIR &= 0x0FF7F;	// CSN=0
	SPI_Write(WTP);
	for(i=0; i<6; i++) {
		SPI_Write(TxBuf[i]);
	}
	PBDATDIR|=0x0080;		// CSN=1
	delay(10);

	// write address
	PBDATDIR &= 0x0FF7F;	// CSN=0
	SPI_Write(WTA);
	for(i=0; i<4; i++) {
		SPI_Write(RxTxConf[i+5]);
	}
	PBDATDIR |= 0x0080;		// CSN=1

	// SetTxMode();			// Tx mode, send data
	PBDATDIR |= 0x0004;	// TRX_CE=1
	delay(10);//
}

// read Tx Payload
void RTxPayload()
{
	uchar i=0;
	
	SetSt_ByMode();
	PBDATDIR &=0x0FF7F;		// CSN=0
	SPI_Write(RTP);
	   	
   	for(i=0; i<6; i++) {
   	  	SPI_Read();
    	RTx_Payload[i] = RxData;
    }
    PBDATDIR|=0x0080;		// CSN=1
}

// receive the packet
void RxPacket(void)
{
	uchar i;
	
	SetSt_ByMode();
	PBDATDIR &=0x0FF7F;		// CSN=0
	SPI_Write(RRP);
	for(i=0; i<6; i++) {
		RxBuf[i] = SPI_Read();
    	RxBuf[i] &= 0x00FF;
	}
	PBDATDIR|=0x0080;		// CSN=1
}

void main( void )
{
	uchar i, ReadFlag;		// i -- counter, ReadFlag -- receive complete

	disable();
	initial();
	NRF905_IO_Initial();
	SPI_Initial();
	Config905();
	RConfig();
	enable();

	while(1) {
		CDflag = 0;
	    AMflag = 0;
	    DRflag = 0;
		ReadFlag = 0;

		TxBuf[0] = 0x0008;		// check comm
		TxPacket();
		delay(120);
		RTxPayload();

		
		// set Rx mode, wait for data coming
		SetRxMode();
		do {
			CDflag = ( ( PCDATDIR & 0x0020 ) >> 5 ) & 0x0001;
			AMflag = ( ( PEDATDIR & 0x0020 ) >> 5 ) & 0x0001;
			DRflag = ( ( PEDATDIR & 0x0040 ) >> 6 ) & 0x0001;
			ReadFlag = CDflag & AMflag & DRflag;
		} while( !ReadFlag );
		RxPacket();
	}
}

/*防止其它干扰因素导致程序进入中断*/
void interrupt nothing()
{
	enable();
	return;
}

⌨️ 快捷键说明

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