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

📄 nrf905_jinju._c

📁 监测高压电电流
💻 _C
📖 第 1 页 / 共 2 页
字号:
{
 	BYTE	i;

	nrF905_Standby_Mode();
	ms(10);
	while(1)	{
		CSN_L;
	 	SPI_Char(0,W_CONFIG);
		for ( i=0; i<10; i++ )	{
		 	SPI_Char(0,Register[i]);
		}

		CSN_H;

		if ( !SPI_R_CONFIG() )	break;
	}

	nrF905_RX_Mode();
}

/////////////////////////////////////////////////////////////
BYTE SPI_R_TX_PAYLOAD()
{
 	BYTE	i,len;

	spi_rxpt = 0;
	spi_handlept = 0;
	nrF905_Standby_Mode();
	CSN_L;
 	SPI_Char(0,R_TX_PAYLOAD);
	len = Register[4] & 0x3F;
	for ( i=0; i<len; i++ ) 	SPI_Char(1,0xff);

	CSN_H;
	return spi_handle(R_TX_PAYLOAD);
}

/////////////////////////////////////////////////////////////
void SPI_W_TX_PAYLOAD()
{
 	BYTE	i,len;

	CSN_L;
	SPI_Char(0,W_TX_PAYLOAD);

	len = Register[4] & 0x3F;
	for ( i=0; i<16; i++ )	{
		SPI_Char(0,tx_buf[i]);
//uart_TxChar(tx_buf[i]);
	}
	CSN_H;
}

/////////////////////////////////////////////////////////////
BYTE SPI_R_TX_ADDRESS()
{
 	BYTE	i,len;

	spi_rxpt = 0;
	spi_handlept = 0;
	nrF905_Standby_Mode();
	CSN_L;
 	SPI_Char(0,R_TX_ADDRESS);
	len = (Register[2] >> 4) & 0x07;
	for ( i=0; i<len; i++ ) 	SPI_Char(1,0xff);

	CSN_H;
	return spi_handle(R_TX_ADDRESS);
}

/////////////////////////////////////////////////////////////
void SPI_W_TX_ADDRESS()
{
 	BYTE	i,len;

	CSN_L;
 	SPI_Char(0,W_TX_ADDRESS);
	len = (Register[2] >> 4) & 0x07;
	for ( i=0; i<len; i++ )	{
		SPI_Char(0,tx_addr[i]);
	}
	CSN_H;
}

/////////////////////////////////////////////////////////////
BYTE SPI_R_RX_PAYLOAD()
{
 	BYTE	i,len;

	spi_rxpt = 0;
	spi_handlept = 0;
	TRX_CE_L;
//	nrF905_Standby_Mode();
	CSN_L;
 	SPI_Char(0,R_RX_PAYLOAD);
	len = Register[3] & 0x3f;
	while(DR)	{
		SPI_Char(1,0xff);
	}

	CSN_H;
	return spi_handle(R_RX_PAYLOAD);
}

/*////////////////////////////////////////////////////////////
void MakeFrame(BYTE cmd)
{
	BYTE	i;
 	switch(cmd)		{
	case CMD_ASKDATA:
//		CallData();
		break;
	case CMD_RETDATA:
//		ReportData();
		break;
	case CMD_DOWNPARA:
//		SetPara();
		break;
	case CMD_RETPARA:
//		RetPara();
		break;
	}

	for ( i=0; i<tx_len; i++ )	uart_TxChar(tx_buf[i]);

	for ( i=tx_len; i<16; i++ )	tx_buf[i] = 0;
}

/////////////////////////////////////////////////////////////
*/
//void SendGram(BYTE cmd)
void SendGram()
{
// 	MakeFrame(cmd);
	nrF905_RX_Mode();

//	uart_TxChar('1');
	while(CD)	{;}
//	uart_TxChar('2');
	while(AM)	{;}
//	uart_TxChar('3');

	nrF905_TX_Mode();
	SPI_W_TX_ADDRESS();
	SPI_W_TX_PAYLOAD();
//	uart_TxChar('4');
	TRX_CE_H;
	us(20);
//	uart_TxChar('5');
	TRX_CE_L;
	while (!DR);

	nrF905_RX_Mode();
}

/////////////////////////////////////////////////////////////
void handle(void)
{
	BYTE	len,i,num,startno;
//	WORD	id;
//	BYTE	lpc;
	if ( spi_rxbuf[0] != 0xeb )		return;
	if ( spi_rxbuf[1] != 0x90 )		return;

	switch(spi_rxbuf[2])	{
	case CMD_RETDATA:
		num = spi_rxbuf[5];
		startno = spi_rxbuf[6];
		if(num > 3){
			if(startno == 0) len = 16;
			else  len = 8+(num-startno)*2;
			}
		else  len = 8+num*2;
		break;
	case CMD_RETPARA:
		len=14;
		break;

	case CMD_SETID_OK:
		 len = 6;
		 break;
	case CMD_READID:
		 len = 6;
		 break,
	default:
		return;
	}

/*	if ( GetLPC(spi_rxbuf,len) )		return;

	switch(spi_rxbuf[2])	{
	case CMD_RETDATA:
//		put_bytes(spi_rxbuf,len);
		break;
	case CMD_RETPARA:
//		put_bytes(spi_rxbuf,len);
		break;
	}
*/
//uart_TxChar(len);
  put_bytes(spi_rxbuf,len);  
}

/////////////////////////////////////////////////////////////
void ReceiveGram()
{
 	if ( !DR )	return;

//	SPI_R_CONFIG();
	SPI_R_RX_PAYLOAD();
}

/////////////////////////////////////////////////////////////
void timer1_init(void)
{
	WORD	timer;

	timer=fosc/1024;
	TCNTData=0xffff-timer;
	TIMSK |= 0x04;
	NOP();
	TCCR1B = 0x00;
	TCNT1H = (TCNTData>>8)&0xff;
	TCNT1L = TCNTData&0xff;
	OCR1AH = 0x00;
	NOP();
	OCR1AL = 0x00;
	NOP();
	OCR1BH = 0x00;
	NOP();
	OCR1BL = 0x00;
	NOP();
	TCCR1A = 0x00;
	NOP();
	TCCR1B = 0x05;
}

/////////////////////////////////////////////////////////////////////////////////
#pragma interrupt_handler timer1_ovf_isr:iv_TIMER1_OVF
void timer1_ovf_isr(void)
{
	TCNT1H = (TCNTData>>8)&0xff;;
	NOP();
	TCNT1L = TCNTData&0xff;

	Count++;
	if ( Count < 120 )	WDR();

	if ( FlashFlag )	{
		if ( FlashFlag % 2 )	LED_L;
		else					LED_H;

		FlashFlag--;
	}
	else	LED_H;

	SecondCount++;
	if ( SecondCount % 2 )		SendDataFlag  = 1;

	if ( SecondCount >= SENDTIMER )	{
		SecondCount = 0;
//		spi_txflag = 1;
	}


	NoDataCount++;
}
/////////////////////////////////////////////////////////////////////////////////
void put_str(char *str)
{
	int	i,len;
	len = strlen(str);
	for ( i=0; i<len; i++ )
		uart_TxChar(str[i]);
}

/////////////////////////////////////////////////////////////////////////////////
void put_str_CRLF(char *str)
{
	put_str(str);
	uart_TxChar(0x0d);
	uart_TxChar(0x0a);
}

/////////////////////////////////////////////////////////////////////////////////
void wdt_init(void)
{
	WDR();//喂狗
	WDTCR|=(BIT(WDCE)|BIT(WDE));
	WDTCR=BIT(WDP2)|BIT(WDP1)|BIT(WDP0)|BIT(WDE);
}
/////////////////////////////////////////////////////////////////////////////////
//uart完成中断
#pragma interrupt_handler uart_Rx_isr:iv_USART_RXC
void uart_Rx_isr(void)
{
	rxbuf[rxpt] = UDR;
//	uart_TxChar(rxbuf[rxpt]);
	rxpt++;
	rxpt &= RXBUF_LEN1;

}

/////////////////////////////////////////////////////////////////////////////////
void Spi_InitRegister(void)
{
//	Register[0] = 0x6c;									// 433.2MHZ
//	Register[1] = 0x0c;									//不重发,正常模式,输出+10dBm,433M频段
	Register[0] = CH_NO_BYTE;							// 433.2MHZ
	Register[1] = PA_PWR_10dBm | HFREQ_PLL_433MHz;		//不重发,正常模式,输出+10dBm,433M频段
	Register[2] = 0x44;									//TX、RX地址宽度为4
	Register[3] = 0x10;									//收为16个有效数据
	Register[4] = 0x10;									//发为16个有效数据
	Register[5] = ADDR_1;									//本机收地址
	Register[6] = ADDR_2;
	Register[7] = ADDR_3;
	Register[8] = ADDR_4;
	Register[9] = 0xD8;   //CRC校验16位,16M晶振

	tx_addr[0] = ADDR_1;
	tx_addr[1] = ADDR_2;
	tx_addr[2] = ADDR_3;
	tx_addr[3] = ADDR_4;

	TxFlag[0] = 0;
	TxFlag[1] = 0;
	TxFlag[2] = 0;
	TxFlag[3] = 0;
	TxFlag[4] = 0;
	TxFlag[5] = 0;
}

/////////////////////////////////////////////////////////////
void InitSPI(void)
{
	Spi_InitRegister();
	SPI_MasterInit();
	SPI_W_CONFIG();
}
/////////////////////////////////////////////////////////////
void uart_handle(void)
{
	int		len,len1,i;
	BYTE	cmd,lpc=0xff;

	if ( handlept == rxpt )		return;
	len = (rxpt - handlept) & RXBUF_LEN1;

	if ( len < 4 )	return;
	
	for ( i=0; i<len; i++ )	buf[i] = rxbuf[(handlept+i) & RXBUF_LEN1];

	                            
	
	if ( buf[0] != 0xeb ) {
		handlept = (handlept + 1) & RXBUF_LEN1;
		return;
	}
	
	if ( buf[1] != 0x90 ) {
		handlept = (handlept + 2) & RXBUF_LEN1;
		return;
	}

	cmd = buf[2];
	if ( (cmd != CMD_ASKDATA)&&(cmd != CMD_DOWNPARA)&&(cmd != CMD_SETID)&&(cmd != CMD_READID) ) {
		handlept = (handlept + 3) & RXBUF_LEN1;
		return;
	}

	switch(cmd)	 {
	case CMD_ASKDATA:
		len1 = 7;
		break;
	case CMD_DOWNPARA:
		len1 = 14;
		break;
	case CMD_SETID:
		len1 = 6;
		break;
	case CMD_READID:
		len1 = 4;
		break;
	}

	if ( len < len1 ) 	return;
/*
	lpc = GetLPC(buf,len1);
	if ( lpc )	{
		handlept = (handlept + len1) & RXBUF_LEN1;
		return;
	}
*/
   	for ( i=0; i<len1;i++ )
		tx_buf[i] = rxbuf[(handlept+i) & RXBUF_LEN1];

	tx_len = len1;
	for ( i=tx_len; i<16; i++ )	tx_buf[i] = 0;

//	put_bytes(tx_buf,len1);

	SendGram();
	handlept = (handlept + len1) & RXBUF_LEN1;
}

/////////////////////////////////////////////////////////////
void SendData()
{
 	 tx_buf[0] = 0xeb;
 	 tx_buf[1] = 0x90;
 	 tx_buf[2] = 0x02;
 	 tx_buf[3] = 0x00;
 	 tx_buf[4] = 0x00;
 	 tx_buf[5] = 0x08;
 	 tx_buf[6] = 0x00;
 	 tx_buf[7] = 0x0c;
 	 tx_buf[8] = 0x02;
 	 tx_buf[9] = 0x0b;
 	 tx_buf[10] = 0x02;
 	 tx_buf[11] = 0x0b;
 	 tx_buf[12] = 0x02;
 	 tx_buf[13] = 0x87;
	 tx_len = 14;
}
/////////////////////////////////////////////////////////////
void main(void)
{
	int		count=0,i;
	BYTE	portb;

//	wdt_init();

	spi_rxpt = 0;
	spi_handlept = spi_rxpt;

	uart_init();
	timer1_init();

	InitSPI();
	SEI();//开中断
	Mode = 0;

//	uart_TxChar('0');
	while(1)	{
//		uart_TxChar('1');
		Count = 0;
		ReceiveGram();
/*
		if ( NoDataCount > NODATALIMIT )	{
			NoDataCount = 0;
			InitSPI();
//			put_str_CRLF("Reset");
		}
*/
		uart_handle();
/*		if ( Mode )	{
			if ( SendDataFlag )	{
				SendDataFlag = 0;
				SendData();
				put_bytes(tx_buf,tx_len);
//				SendGram(CMD_CALLDATA);
			}
		}
*/	}
}

⌨️ 快捷键说明

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