

	//SPIнӿԪ;λǰ;λں
	spi.SCK_DIR = CLK.D0_DIR; spi.SCK_IN = CLK.D0_IN; spi.SCK_OUT = CLK.D0_OUT;
	spi.MISO_DIR = MISO.D0_DIR; spi.MISO_IN = MISO.D0_IN; spi.MISO_OUT = MISO.D0_OUT;
	spi.MOSI_DIR = MOSI.D0_DIR; spi.MOSI_IN = MOSI.D0_IN; spi.MOSI_OUT = MOSI.D0_OUT;

	#include "AVR_11MHZ.txt"
	
	public void target_init()
	{
		//ʼӲ
		port_init();
		spi.init();
		set( CONFIG, 0b0000_1111 );		//CRCʹܣ16λCRCУ飬ϵ,ģʽ
		set( EN_AA, 0x01 );			//ʹܽͨ0ԶӦ
		set( EN_RXADDR, 0x01 );			//ʹܽͨ0
		set( SETUP_AW, 0x03 );			//õַ 5ֽ
		set( SETUP_RETR, 0xff );		//Զطʱȴ4000us+86usԶط15
		
		set( RF_CH, 40 );				//ѡƵͨ40
		
		set( RF_SETUP, 0x07 );			//ݴ1Mbps书0dBmŴ
		uint8 status = get( STATUS );		//״̬Ĵ
		write_command( FLUSH_TX);
		write_command( FLUSH_RX);
		set( STATUS, status|0b0111_0000 );	//TX_DSMAX_RTжϱ־
		
		//
		//ͨ0ѡͷͨͬЧݿ
		set( RX_PW_P0, LENGTH );
		
		//д뷢͵ַ
		write_buffer( WRITE_REG+TX_ADDR, target_address, 5 );
		
		//ģʽΪշʽ(ݲл)
		OS_set_receive_mode();
		
		//ϵͳʼģʽл(ģʽ)
		CE.D0_OUT = 1;
	}
	
	//---------------------------------------------------
	//ͳɹ true, ʧܷ false
	//[i] function_void send_buffer;
	public void send_buffer()
	{
		isSend = true;
		
		//л׼ģʽ
		CE.D0_OUT = 0;
		
		//ģʽΪͷʽ(ݲл)
		OS_set_send_mode();
		
		//ΪӦ豸ͨ0ַͷ͵ַͬ
		write_buffer( WRITE_REG+RX_ADDR_P0, target_address, 5 );
		
		//дݰTX FIFO
		write_buffer( WR_TX_PLOAD, Tbuffer, LENGTH );
		
		//ϵͳʼģʽл(ģʽ)
		CE.D0_OUT = 1;
		
		//ȴӦ
		while( IRQ.D0_IN == 1 ) {}
		
		//л׼ģʽ
		CE.D0_OUT = 0;
		
		uint8 status = get( STATUS );	//״̬Ĵ
		set( STATUS, status );  	//TX_DSMAX_RTжϱ־
		write_command( FLUSH_TX );
		
		//ģʽΪշʽ(ݲл)
		OS_set_receive_mode();
		
		//ϵͳʼģʽл(ģʽ)
		CE.D0_OUT = 1;
		
		isSend = false;
		
		//return status & 0B0010_0000 != 0;
	}
	//---------------------------------------------------
	//[i] function_void OS_run;
	public uint8 OS_run()
	{
		if( !isSend && IRQ.D0_IN == 0 ) {
			
			//ģжȡ
			read_buffer( RD_RX_PLOAD, Rbuffer, LENGTH );
			uint8 sta = get( STATUS );
			set( STATUS, sta );
			write_command( FLUSH_RX );
			
			OS_EventFlag.0(bit) = 1;
			
			return sta;
		}
		return 0;
	}
	//---------------------------------------------------
	//[i] function_bool OS_isOK;
	public bool OS_isOK_For_Temp()
	{
		set( RF_CH, 0x03 );
		if( get( RF_CH ) != 0x03 ) return false;
		set( RF_CH, 0x40 );
		if( get( RF_CH ) != 0x40 ) return false;
		return true;
	}
	//=================================================================================
	void OS_to_normal_mode()
	{
		uint8 c = get( CONFIG );
		c | 0b0000_0010;
		set( CONFIG, c );
	}
	void OS_to_power_down_mode()
	{
		uint8 c = get( CONFIG );
		c & 0b1111_1101;
		set( CONFIG, c );
	}
	//---------------------------------------------------
	//עлģʽʱҪӱ׼ģʽ
	void OS_set_receive_mode()
	{
		//дַͨ
		write_buffer( WRITE_REG+RX_ADDR_P0, local_address, 5 );
		uint8 c = get( CONFIG );
		c | 0b0000_0001;
		set( CONFIG, c );
	}
	//---------------------------------------------------
	//עлģʽʱҪӱ׼ģʽ
	void OS_set_send_mode()
	{
		uint8 c = get( CONFIG );
		c & 0b1111_1110;
		set( CONFIG, c );
	}
	//---------------------------------------------------
	void write_command( uint8 cmd )
	{
		CSN.D0_OUT = 0;
		spi.write_byte( cmd );
		CSN.D0_OUT = 1;
	}
	//p_bufед뵽nRF24L01ͨд뷢ͨݻ/͵ַ
	void write_buffer( uint8 reg, [uint8*?] p_buf, uint8 length )
	{
		CSN.D0_OUT = 0;
		spi.write_byte( reg );
		for( uint8 i = 0; i < length; i + 1 ) {
			spi.write_byte( p_buf[i] );
		}
		CSN.D0_OUT = 1;
	}
	//ȡnRF2401ĳ
	void read_buffer( uint8 reg, [uint8*?]p_buf, uint8 length)
	{
		CSN.D0_OUT = 0;
		spi.write_byte( reg );
		for( uint8 i = 0; i < length; i + 1 ) {
			p_buf[i] = spi.read_byte();
		}
		CSN.D0_OUT = 1;
	}
	//---------------------------------------------------
	//дĴ
	void set( uint8 addr, uint8 data )
	{
		CSN.D0_OUT = 0;
		spi.write_byte( WRITE_REG + addr );
		spi.write_byte( data );
		CSN.D0_OUT = 1;
	}
	//Ĵ
	uint8 get( uint8 addr )
	{
		CSN.D0_OUT = 0;
		spi.write_byte( READ_REG + addr );
		uint8 data = spi.read_byte();
		CSN.D0_OUT = 1;
		return data;
	}
	//=================================================================================
	const uint8 CONFIG = 		0x00;  //'Config'
	const uint8 EN_AA = 		0x01;  //'Enable Auto Acknowledgment'
	const uint8 EN_RXADDR = 	0x02;  //'Enabled RX addresses'
	const uint8 SETUP_AW = 		0x03;  //'Setup address width'
	const uint8 SETUP_RETR = 	0x04;  //'Setup Auto. Retrans'
	const uint8 RF_CH = 		0x05;  //'RF channel'
	const uint8 RF_SETUP = 		0x06;  //'RF setup'
	const uint8 STATUS = 		0x07;  //'Status'
	const uint8 OBSERVE_TX = 	0x08;  //'Observe TX'
	const uint8 CD = 			0x09;  //'Carrier Detect'
	const uint8 RX_ADDR_P0 = 	0x0A;  //Ƶ0ݵַ
	const uint8 RX_ADDR_P1 = 	0x0B;  //'RX address pipe1'
	const uint8 RX_ADDR_P2 = 	0x0C;  //'RX address pipe2'
	const uint8 RX_ADDR_P3 = 	0x0D;  //'RX address pipe3'
	const uint8 RX_ADDR_P4 = 	0x0E;  //'RX address pipe4'
	const uint8 RX_ADDR_P5 = 	0x0F;  //'RX address pipe5'
	const uint8 TX_ADDR = 		0x10;  //'TX address'
	const uint8 RX_PW_P0 = 		0x11;  //Ƶ0ݳ
	const uint8 RX_PW_P1 = 		0x12;  //'RX payload width; pipe1'
	const uint8 RX_PW_P2 = 		0x13;  //'RX payload width; pipe2'
	const uint8 RX_PW_P3 = 		0x14;  //'RX payload width; pipe3'
	const uint8 RX_PW_P4 = 		0x15;  //'RX payload width; pipe4'
	const uint8 RX_PW_P5 = 		0x16;  //'RX payload width; pipe5'
	const uint8 FIFO_STATUS = 	0x17;  //'FIFO Status Register'
	//SPI nRF24L01 commands
	const uint8 READ_REG =		0x00;  //Define read command to register
	const uint8 WRITE_REG =		0x20;  //Define write command to register
	const uint8 RD_RX_PLOAD =	0x61;  //Define RX payload register address
	const uint8 WR_TX_PLOAD =	0xA0;  //Define TX payload register address
	const uint8 FLUSH_TX =		0xE1;  //Define flush TX register command
	const uint8 FLUSH_RX =		0xE2;  //Define flush RX register command
	const uint8 REUSE_TX_PL =	0xE3;  //Define reuse TX payload register command
	const uint8 NOP =			0xFF;  //Define No Operation; might be used to read status register
	
	
	