コード例 #1
0
static void eskylinkInitPairing(void)
{
  int i;
  
  //Power the radio, Enable the DR interruption, set the radio in PRX mode with 2bytes CRC
  nrfWrite1Reg(REG_CONFIG, 0x3F);
  vTaskDelay(M2T(2)); //Wait for the chip to be ready
  
   //Set the radio channel, pairing channel is 50
  nrfSetChannel(50);
  //Set the radio data rate
  nrfSetDatarate(RADIO_RATE_1M);

  nrfWrite1Reg(REG_SETUP_AW, VAL_SETUP_AW_3B); // 3 bytes address
  address[0] = address[1] = address[2] = 0;
  nrfWriteReg(REG_RX_ADDR_P0, address, 3);     // Pipe address == 0
  nrfWrite1Reg(REG_EN_RXADDR, 0x01);
  nrfWrite1Reg(REG_FEATURE, 0x00);             // No dynamic size payload
  nrfWrite1Reg(REG_DYNPD, 0x00);
  nrfWrite1Reg(REG_RX_PW_P0, 13);              //13 bytes payload
  nrfWrite1Reg(REG_EN_AA, 0);                  //Disable shockburst

  //Flush RX
  for(i=0;i<3;i++)
    nrfFlushRx();
  //Flush TX
  for(i=0;i<3;i++)
    nrfFlushTx();
}
コード例 #2
0
void nrfSetAddress(unsigned int pipe, char* address)
{
  int len = 5;

  ASSERT(pipe<6);

  if (pipe > 1)
    len = 1;

  nrfWriteReg(REG_RX_ADDR_P0 + pipe, address, len);
}
コード例 #3
0
static void eskylinkInitPaired(int channel)
{
  nrfSetChannel(channel);
  nrfSetDatarate(RADIO_RATE_1M);

  nrfWrite1Reg(REG_SETUP_AW, VAL_SETUP_AW_4B); // 4 bytes address
  nrfWriteReg(REG_RX_ADDR_P0, address, 4);     // Pipe address == from pairing packet
  nrfWrite1Reg(REG_EN_RXADDR, 0x01);
  nrfWrite1Reg(REG_FEATURE, 0x00);             // No dynamic size payload
  nrfWrite1Reg(REG_DYNPD, 0x00);
  nrfWrite1Reg(REG_RX_PW_P0, 13);              //13 bytes payload
  nrfWrite1Reg(REG_EN_AA, 0);                  //Disable shockburst
}
コード例 #4
0
ファイル: nrf24L01.c プロジェクト: TangGuoHua/smarthome
/****************************检测应答信号******************************/
unsigned char nrfCheckACK()
{  //用于发射
	sta=nrfReadReg(R_REGISTER+STATUS); // 返回状态寄存器
	if(TX_DS||MAX_RT) //发送完毕中断
	{
		nrfWriteReg(W_REGISTER+STATUS,0xff);  // 清除TX_DS或MAX_RT中断标志
		CSN=0;
		nrfSPI(FLUSH_TX);//用于清空FIFO !!关键!!不然会出现意想不到的后果!!!大家记住!!  
		CSN=1; 
		return(0);
	}
	else
	{
		return(1);
	}
}
コード例 #5
0
ファイル: nrf24L01.c プロジェクト: TangGuoHua/smarthome
// 设置24L01为接收模式PRX准备接收数据
// 本节点的接收射频通道、地址、地址宽度、数据宽度均在"nrf24L01Node.h"头文件里面设置
void nrfSetRxMode( void )
{
    CE=0;
  	nrfWriteTxData( W_REGISTER+RX_ADDR_P0, MY_ADDR, ADDRESS_WIDTH ); //接收设备接收通道0使用和发送设备相同的发送地址
  	nrfWriteReg( W_REGISTER+EN_AA, 0x01 ); //使能接收通道0自动应答
  	nrfWriteReg( W_REGISTER+EN_RXADDR, 0x01 ); //使能接收通道0

	nrfWriteReg( W_REGISTER+RF_CH, RECEIVE_RF_CHANNEL ); //设置射频通道
  	nrfWriteReg( W_REGISTER+RX_PW_P0, RECEIVE_DATA_WIDTH ); //接收通道0选择和发送通道相同有效数据宽度

	nrfWriteReg( W_REGISTER+RF_SETUP, 0x26 ); // 数据传输率250Kbps,发射功率0dBm
	nrfWriteReg( W_REGISTER+CONFIG, 0x3f ); //使能RX_DR中断,屏蔽TX_DS和MAX_RT中断,CRC使能,2字节CRC校验,上电,接收模式
  	CE = 1; 
}
コード例 #6
0
ファイル: nrf24L01.c プロジェクト: TangGuoHua/smarthome
//获取24L01接收到的数据。
//当24L01收到数据触发中断后,调用本方法来取得24L01收到的数据
byte* nrfGetReceivedData()				 
{
	static byte dataBuffer[RECEIVE_DATA_WIDTH];
	
	sta=nrfReadReg(R_REGISTER+STATUS);//发送数据后读取状态寄存器
	if(RX_DR)				// 判断是否接收到数据
	{
		//CE=0;//待机Standby-I
		
		// 从RXFIFO读取数据
		nrfReadRxData( R_RX_PAYLOAD, dataBuffer, RECEIVE_DATA_WIDTH);
		
		//接收到数据后RX_DR置高为来清除中断标
		nrfWriteReg( W_REGISTER+STATUS, 0x40 );

		//用于清空FIFO !!关键!!不然会出现意想不到的后果!!!大家记住!!
		//我经过试验发现,不清FIFO的话,发送方有时候会出现收不到ACK的现象
		CSN=0;
		nrfSPI(FLUSH_RX); 
		CSN=1;
	}
	return dataBuffer;
} 
コード例 #7
0
ファイル: nrf24L01.c プロジェクト: TangGuoHua/smarthome
//获取24L01接收到的数据。
//当24L01收到数据触发中断后,调用本方法来取得24L01收到的数据
unsigned char* nrfGetReceivedData()				 
{
	static unsigned char dataBuffer[RECEIVE_DATA_WIDTH];
	
	sta=nrfReadReg(R_REGISTER+STATUS);//发送数据后读取状态寄存器
	if(RX_DR) // 判断是否接收到数据
	{
		//CE=0;//进入Standby-I模式
		
		nrfReadRxData(R_RX_PAYLOAD,dataBuffer,RECEIVE_DATA_WIDTH);// 从RXFIFO读取数据
		
		//接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清除中断标
		//nrfWriteReg(W_REGISTER+STATUS,0xff);
		//网上找到的例子是用0xff来清中断标志,我通过试验发现用0x40也可以清掉RX_DR
		nrfWriteReg(W_REGISTER+STATUS,0x40);
		
		//用于清空FIFO !!关键!!不然会出现意想不到的后果!!!大家记住!!
		//我经过试验发现,不清FIFO的话,发送方有时候会出现收不到ACK的现象
		CSN=0;
		nrfSPI(FLUSH_RX); 
		CSN=1;
	}
	return dataBuffer;
} 
コード例 #8
0
ファイル: nrf24L01.c プロジェクト: TangGuoHua/smarthome
// 将24L01设置为发送模式PTX,并发送数据
// 参数如下:
// rfChannel: 无线电频道  取值范围是0-125(即,0x00到0x7d)
// addrWidth: 发送地址宽度
// txAddr: 发送的地址(接收方地址)
// dataWidth: 发送数据的宽度
// txData: 发送的数据
// 例子:
// byte rfChannel = 0x64; //选择无线电频道
// byte rec_addr[3]= { 0x54, 0x53, 0x95 };  //接收方地址
// byte data_to_send[5] = {0x01, 0x02, 0x03, 0x04, 0x05 }; //要发送的数据
// nrfSendData( rfChannel, 3, rec_addr, 5, data_to_send );  //发送
//
void nrfSendData( byte rfChannel, byte addrWidth, byte *txAddr, byte dataWidth, byte *txData )
{
	CE=0; 
	nrfWriteTxData( W_REGISTER+TX_ADDR, txAddr, addrWidth );//写寄存器指令+接收地址使能指令+接收地址+地址宽度
	nrfWriteTxData( W_REGISTER+RX_ADDR_P0, txAddr,addrWidth );//为了应答接收设备,接收通道0地址和发送地址相同
	nrfWriteTxData( W_TX_PAYLOAD, txData, dataWidth );//写入数据 
	/******下面有关寄存器配置**************/
	nrfWriteReg( W_REGISTER+EN_AA, 0x01 );       // 使能接收通道0自动应答
	nrfWriteReg( W_REGISTER+EN_RXADDR, 0x01 );   // 使能接收通道0
	
	//NRFWriteReg(W_REGISTER+SETUP_RETR,0x0a);  // 自动重发延时等待250us+86us,自动重发10次
	nrfWriteReg( W_REGISTER+SETUP_RETR,0x7a );  // 自动重发延时等待2000us+86us,自动重发10次
	nrfWriteReg( W_REGISTER+RF_CH, rfChannel ); // 选择射频通道0x64
	
	nrfWriteReg( W_REGISTER+RF_SETUP,0x26 ); // 数据传输率250Kbps,发射功率0dBm
	nrfWriteReg( W_REGISTER+CONFIG,0x7e ); //屏蔽3个中断,CRC使能,2字节CRC校验,上电,PTX
	CE=1;
	delay(5);//保持10us秒以上
	CE=0; //待发送完毕后转为Standby-1模式
	
	while(nrfCheckACK());	//检测是否发送完毕
}
コード例 #9
0
ファイル: nrf24L01.c プロジェクト: TangGuoHua/smarthome
// 将24L01设置为发送模式PTX,并发送数据
// 参数如下:
// rfChannel: 无线电频道  取值范围是0-125(即,0x00到0x7d)
// addrWidth: 发送地址宽度
// txAddr: 发送的地址(接收方地址)
// dataWidth: 发送数据的宽度
// txData: 发送的数据
// 例子:
// unsigned char rfChannel = 0x64; //选择无线电频道
// unsigned char rec_addr[3]= { 0x54, 0x53, 0x95 };  //接收方地址
// unsigned char data_to_send[5] = {0x01, 0x02, 0x03, 0x04, 0x05 }; //要发送的数据
// nrfSendData( rfChannel, 3, rec_addr, 5, data_to_send );  //发送
void nrfSendData( unsigned char rfChannel, unsigned char addrWidth, unsigned char *txAddr, unsigned char dataWidth, unsigned char *txData )
{
	CE=0;
	//delayUS( 10 ); // 本条语句由实验得出 STC12c5608AD 1T 11.0592MHz
	delayFor24L01();

	nrfWriteTxData( W_REGISTER+TX_ADDR, txAddr, addrWidth );//写寄存器指令+接收地址使能指令+接收地址+地址宽度
	nrfWriteTxData( W_REGISTER+RX_ADDR_P0, txAddr,addrWidth );//为了应答接收设备,接收通道0地址和发送地址相同
	nrfWriteTxData( W_TX_PAYLOAD, txData, dataWidth );//写入数据 

	/******下面有关寄存器配置**************/
	nrfWriteReg( W_REGISTER+EN_AA, 0x01 );       // 使能接收通道0自动应答
	nrfWriteReg( W_REGISTER+EN_RXADDR, 0x01 );   // 使能接收通道0
	
	
	//NRFWriteReg(W_REGISTER+SETUP_RETR,0x0a);  // 自动重发延时等待250us+86us,自动重发10次
	nrfWriteReg( W_REGISTER+SETUP_RETR,0x7a );  // 自动重发延时等待2000us+86us,自动重发10次
	nrfWriteReg( W_REGISTER+RF_CH, rfChannel ); // 选择射频通道0x64
	
	nrfWriteReg( W_REGISTER+RF_SETUP,0x26 ); // 数据传输率250Kbps,发射功率0dBm
	nrfWriteReg( W_REGISTER+CONFIG,0x7e ); //屏蔽3个中断,CRC使能,2字节CRC校验,上电,PTX
	
	CE=1;
	//delay10us();//保持10us秒以上
	//delay10us();
	//delayUS( 250 );  //本条语句由实验得出 STC12c5608AD 1T 11.0592MHz
	delayFor24L01();


	CE=0; //待发送完毕后转为Standby-1模式

	delayFor24L01(); //本条语句由实验得出 STC12c5608AD 1T 11.0592MHz
	//delayFor24L01();

	
	while(nrfCheckACK());	//检测是否发送完毕
}
コード例 #10
0
/* Write only one byte (useful for most of the reg.) */
unsigned char nrfWrite1Reg(unsigned char address, char byte)
{
  return nrfWriteReg(address, &byte, 1);
}