2.4G/NRF24l01/NRF24l01芯片/无线模块/无线收发模块(柱状天线)

[复制链接]
2268|0
 楼主| wang321 发表于 2008-7-10 10:17 | 显示全部楼层 |阅读模式
NRF24l01<br />产品性能:<br />1)&nbsp;2.4GHZ全球开放ISM频段免许可使用<br />2)&nbsp;最高工作速率1Mbps,GFSK高效调制<br />3)&nbsp;125个频道满足多点通讯和跳频通讯需求<br />4)&nbsp;1.9-3.6V工作,低功耗,待机模式仅1uA.<br />5)&nbsp;双通道数据接收,内置环行天线,体积仅17*34mm,通信距离在100m之内,软件编简单。<br />7)&nbsp;内置硬件8/16位CRC校验,收发中断标志,每次可发28字节<br />备注:1。免费提供开发源代码<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2。提供廉价开发套件<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3。提供全面技术支持和即使方案<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4。任何单片机都可实现对NRF系列模块的数据收发控制,<br /><br />#define&nbsp;uchar&nbsp;unsigned&nbsp;char<br />#define&nbsp;TX_ADR_WIDTH&nbsp;&nbsp;&nbsp;&nbsp;5&nbsp;&nbsp;&nbsp;//&nbsp;5&nbsp;bytes&nbsp;TX(RX)&nbsp;address&nbsp;width<br />#define&nbsp;TX_PLOAD_WIDTH&nbsp;&nbsp;20&nbsp;&nbsp;//&nbsp;20&nbsp;bytes&nbsp;TX&nbsp;payload<br /><br />uchar&nbsp;const&nbsp;TX_ADDRESS[TX_ADR_WIDTH]&nbsp;&nbsp;=&nbsp;{0x34,0x43,0x10,0x10,0x01};&nbsp;//&nbsp;Define&nbsp;a&nbsp;static&nbsp;TX&nbsp;address<br /><br />uchar&nbsp;rx_buf[TX_PLOAD_WIDTH];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//接收缓冲区<br />uchar&nbsp;tx_buf[TX_PLOAD_WIDTH];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//发送缓冲区<br /><br />uchar&nbsp;flag;<br />/**************************************************/<br /><br />//管脚定义<br />sbit&nbsp;CE&nbsp;=&nbsp;&nbsp;P1^0;<br />sbit&nbsp;CSN=&nbsp;&nbsp;P1^1;<br />sbit&nbsp;SCK=&nbsp;&nbsp;P1^2;<br />sbit&nbsp;MOSI=&nbsp;P1^3;<br />sbit&nbsp;MISO=&nbsp;P1^4;<br />sbit&nbsp;IRQ&nbsp;=&nbsp;P1^5;<br />/**************************************************/<br />uchar&nbsp;&nbsp;bdata&nbsp;sta;<br />sbit&nbsp;RX_DR&nbsp;=sta^6;<br />sbit&nbsp;TX_DS&nbsp;=sta^5;<br />sbit&nbsp;MAX_RT&nbsp;=sta^4;<br />/**************************************************/<br /><br />/**************************************************<br />Function:&nbsp;init_io();<br />Description:<br />&nbsp;&nbsp;flash&nbsp;led&nbsp;one&nbsp;time,chip&nbsp;enable(ready&nbsp;to&nbsp;TX&nbsp;or&nbsp;RX&nbsp;Mode),<br />&nbsp;&nbsp;Spi&nbsp;disable,Spi&nbsp;clock&nbsp;line&nbsp;init&nbsp;high<br />/**************************************************/<br />#define&nbsp;KEY&nbsp;0xaa<br />void&nbsp;init_io(void)<br />{<br />&nbsp;P0=KEY;&nbsp;&nbsp;//&nbsp;led&nbsp;light<br />&nbsp;CE=0;&nbsp;&nbsp;&nbsp;//&nbsp;chip&nbsp;enable<br />&nbsp;CSN=1;&nbsp;&nbsp;&nbsp;//&nbsp;Spi&nbsp;disable&nbsp;<br />&nbsp;SCK=0;&nbsp;&nbsp;&nbsp;//&nbsp;Spi&nbsp;clock&nbsp;line&nbsp;init&nbsp;high<br />&nbsp;P0=0xff;&nbsp;&nbsp;//&nbsp;led&nbsp;close<br />}<br />/**************************************************/<br /><br />/**************************************************<br />Function:&nbsp;Inituart();<br /><br />Description:<br />&nbsp;&nbsp;set&nbsp;uart&nbsp;working&nbsp;mode<br />/**************************************************/<br />void&nbsp;Inituart(void)<br />{<br />&nbsp;TMOD&nbsp;=&nbsp;0x20;&nbsp;&nbsp;&nbsp;&nbsp;//timer1&nbsp;working&nbsp;mode&nbsp;1<br />&nbsp;TL1&nbsp;=&nbsp;0xfd;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//f7=9600&nbsp;for&nbsp;16mhz&nbsp;Fosc,and&nbsp;...<br />&nbsp;TH1&nbsp;=&nbsp;0xfd;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//...fd=19200&nbsp;for&nbsp;11.0592mhz&nbsp;Fosc<br />&nbsp;SCON&nbsp;=&nbsp;0xd8;&nbsp;&nbsp;&nbsp;&nbsp;//uart&nbsp;mode&nbsp;3,ren==1<br />&nbsp;PCON&nbsp;=&nbsp;0x80;&nbsp;&nbsp;&nbsp;&nbsp;//smod=0<br />&nbsp;TR1&nbsp;=&nbsp;1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//start&nbsp;timer1<br />}<br />/**************************************************/<br /><br />/**************************************************<br />Function:&nbsp;init_int0();<br /><br />Description:<br />&nbsp;&nbsp;enable&nbsp;int0&nbsp;interrupt;<br />/**************************************************/<br />void&nbsp;init_int0(void)<br />{<br />&nbsp;EA=1;<br />&nbsp;EX0=1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Enable&nbsp;int0&nbsp;interrupt.<br />}<br />/**************************************************/<br /><br />/**************************************************<br />Function:&nbsp;delay100();<br /><br />Description:<br />&nbsp;&nbsp;delay&nbsp;100ms<br />/**************************************************<br />void&nbsp;delay(uchar&nbsp;)<br />{<br />&nbsp;uchar&nbsp;&nbsp;x;<br />&nbsp;uchar&nbsp;&nbsp;y;<br />&nbsp;for(x=0;x&lt100;x++)<br />&nbsp;{<br />&nbsp;&nbsp;for(y=0;y&lt100;y++)<br />&nbsp;&nbsp;_nop_();<br />&nbsp;}<br />}<br /><br />/**************************************************/<br />void&nbsp;delay_ms(unsigned&nbsp;int&nbsp;x)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;int&nbsp;i,j;<br />&nbsp;&nbsp;&nbsp;&nbsp;i=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;i&ltx;i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;j=108;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(j--);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br />/**************************************************/<br /><br />/**************************************************<br />Function:&nbsp;SPI_RW();<br /><br />Description:<br />&nbsp;&nbsp;Writes&nbsp;one&nbsp;byte&nbsp;to&nbsp;nRF24L01,&nbsp;and&nbsp;return&nbsp;the&nbsp;byte&nbsp;read<br />&nbsp;&nbsp;from&nbsp;nRF24L01&nbsp;during&nbsp;write,&nbsp;according&nbsp;to&nbsp;SPI&nbsp;protocol<br />/**************************************************/<br />uchar&nbsp;SPI_RW(uchar&nbsp;byte)<br />{<br />&nbsp;uchar&nbsp;bit_ctr;<br />&nbsp;&nbsp;&nbsp;&nbsp;for(bit_ctr=0;bit_ctr&lt8;bit_ctr++)&nbsp;&nbsp;&nbsp;//&nbsp;output&nbsp;8-bit<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOSI&nbsp;=&nbsp;(byte&nbsp;&&nbsp;0x80);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;output&nbsp;'byte',&nbsp;MSB&nbsp;to&nbsp;MOSI<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;byte&nbsp;=&nbsp;(byte&nbsp;&lt&lt&nbsp;1);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;shift&nbsp;next&nbsp;bit&nbsp;into&nbsp;MSB..<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SCK&nbsp;=&nbsp;1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Set&nbsp;SCK&nbsp;high..<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;byte&nbsp;|=&nbsp;MISO;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;capture&nbsp;current&nbsp;MISO&nbsp;bit<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SCK&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;..then&nbsp;set&nbsp;SCK&nbsp;low&nbsp;again<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;return(byte);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;return&nbsp;read&nbsp;byte<br />}<br />/**************************************************/<br /><br />/**************************************************<br />Function:&nbsp;SPI_RW_Reg();<br /><br />Description:<br />&nbsp;&nbsp;Writes&nbsp;value&nbsp;'value'&nbsp;to&nbsp;register&nbsp;'reg'<br />/**************************************************/<br />uchar&nbsp;SPI_RW_Reg(BYTE&nbsp;reg,&nbsp;BYTE&nbsp;value)<br />{<br />&nbsp;uchar&nbsp;status;<br /><br />&nbsp;&nbsp;&nbsp;CSN&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;CSN&nbsp;low,&nbsp;init&nbsp;SPI&nbsp;transaction<br />&nbsp;&nbsp;&nbsp;status&nbsp;=&nbsp;SPI_RW(reg);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;select&nbsp;register<br />&nbsp;&nbsp;&nbsp;SPI_RW(value);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;..and&nbsp;write&nbsp;value&nbsp;to&nbsp;it..<br />&nbsp;&nbsp;&nbsp;CSN&nbsp;=&nbsp;1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;CSN&nbsp;high&nbsp;again<br /><br />&nbsp;&nbsp;&nbsp;return(status);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;return&nbsp;nRF24L01&nbsp;status&nbsp;byte<br />}<br />/**************************************************/<br /><br />/**************************************************<br />Function:&nbsp;SPI_Read();<br /><br />Description:<br />&nbsp;&nbsp;Read&nbsp;one&nbsp;byte&nbsp;from&nbsp;nRF24L01&nbsp;register,&nbsp;'reg'<br />/**************************************************/<br />BYTE&nbsp;SPI_Read(BYTE&nbsp;reg)<br />{<br />&nbsp;BYTE&nbsp;reg_val;<br /><br />&nbsp;&nbsp;&nbsp;CSN&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;CSN&nbsp;low,&nbsp;initialize&nbsp;SPI&nbsp;communication...<br />&nbsp;&nbsp;&nbsp;SPI_RW(reg);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Select&nbsp;register&nbsp;to&nbsp;read&nbsp;from..<br />&nbsp;&nbsp;&nbsp;reg_val&nbsp;=&nbsp;SPI_RW(0);&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;..then&nbsp;read&nbsp;registervalue<br />&nbsp;&nbsp;&nbsp;CSN&nbsp;=&nbsp;1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;CSN&nbsp;high,&nbsp;terminate&nbsp;SPI&nbsp;communication<br /><br />&nbsp;&nbsp;&nbsp;return(reg_val);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;return&nbsp;register&nbsp;value<br />}<br />/**************************************************/<br /><br />/**************************************************<br />Function:&nbsp;SPI_Read_Buf();<br /><br />Description:<br />&nbsp;&nbsp;Reads&nbsp;'bytes'&nbsp;#of&nbsp;bytes&nbsp;from&nbsp;register&nbsp;'reg'<br />&nbsp;&nbsp;Typically&nbsp;used&nbsp;to&nbsp;read&nbsp;RX&nbsp;payload,&nbsp;Rx/Tx&nbsp;address<br />/**************************************************/<br />uchar&nbsp;SPI_Read_Buf(BYTE&nbsp;reg,&nbsp;BYTE&nbsp;*pBuf,&nbsp;BYTE&nbsp;bytes)<br />{<br />&nbsp;uchar&nbsp;status,byte_ctr;<br /><br />&nbsp;&nbsp;&nbsp;CSN&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Set&nbsp;CSN&nbsp;low,&nbsp;init&nbsp;SPI&nbsp;tranaction<br />&nbsp;&nbsp;&nbsp;status&nbsp;=&nbsp;SPI_RW(reg);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Select&nbsp;register&nbsp;to&nbsp;write&nbsp;to&nbsp;and&nbsp;read&nbsp;status&nbsp;byte<br /><br />&nbsp;&nbsp;&nbsp;for(byte_ctr=0;byte_ctr&ltbytes;byte_ctr++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pBuf[byte_ctr]&nbsp;=&nbsp;SPI_RW(0);&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Perform&nbsp;SPI_RW&nbsp;to&nbsp;read&nbsp;byte&nbsp;from&nbsp;nRF24L01<br /><br />&nbsp;&nbsp;&nbsp;CSN&nbsp;=&nbsp;1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Set&nbsp;CSN&nbsp;high&nbsp;again<br /><br />&nbsp;&nbsp;&nbsp;return(status);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;return&nbsp;nRF24L01&nbsp;status&nbsp;byte<br />}<br />/**************************************************/<br /><br />/**************************************************<br />Function:&nbsp;SPI_Write_Buf();<br /><br />Description:<br />&nbsp;&nbsp;Writes&nbsp;contents&nbsp;of&nbsp;buffer&nbsp;'*pBuf'&nbsp;to&nbsp;nRF24L01<br />&nbsp;&nbsp;Typically&nbsp;used&nbsp;to&nbsp;write&nbsp;TX&nbsp;payload,&nbsp;Rx/Tx&nbsp;address<br />/**************************************************/<br />uchar&nbsp;SPI_Write_Buf(BYTE&nbsp;reg,&nbsp;BYTE&nbsp;*pBuf,&nbsp;BYTE&nbsp;bytes)<br />{<br />&nbsp;uchar&nbsp;status,byte_ctr;<br /><br />&nbsp;&nbsp;&nbsp;CSN&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Set&nbsp;CSN&nbsp;low,&nbsp;init&nbsp;SPI&nbsp;tranaction<br />&nbsp;&nbsp;&nbsp;status&nbsp;=&nbsp;SPI_RW(reg);&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Select&nbsp;register&nbsp;to&nbsp;write&nbsp;to&nbsp;and&nbsp;read&nbsp;status&nbsp;byte<br />&nbsp;&nbsp;&nbsp;for(byte_ctr=0;&nbsp;byte_ctr&ltbytes;&nbsp;byte_ctr++)&nbsp;//&nbsp;then&nbsp;write&nbsp;all&nbsp;byte&nbsp;in&nbsp;buffer(*pBuf)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SPI_RW(*pBuf++);<br />&nbsp;&nbsp;&nbsp;CSN&nbsp;=&nbsp;1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Set&nbsp;CSN&nbsp;high&nbsp;again<br />&nbsp;&nbsp;&nbsp;return(status);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;return&nbsp;nRF24L01&nbsp;status&nbsp;byte<br />}<br />/**************************************************/<br /><br />/**************************************************<br />Function:&nbsp;RX_Mode();<br /><br />Description:<br />&nbsp;&nbsp;This&nbsp;function&nbsp;initializes&nbsp;one&nbsp;nRF24L01&nbsp;device&nbsp;to<br />&nbsp;&nbsp;RX&nbsp;Mode,&nbsp;set&nbsp;RX&nbsp;address,&nbsp;writes&nbsp;RX&nbsp;payload&nbsp;width,<br />&nbsp;&nbsp;select&nbsp;RF&nbsp;channel,&nbsp;datarate&nbsp;&&nbsp;LNA&nbsp;HCURR.<br />&nbsp;&nbsp;After&nbsp;init,&nbsp;CE&nbsp;is&nbsp;toggled&nbsp;high,&nbsp;which&nbsp;means&nbsp;that<br />&nbsp;&nbsp;this&nbsp;device&nbsp;is&nbsp;now&nbsp;ready&nbsp;to&nbsp;receive&nbsp;a&nbsp;datapacket.<br />/**************************************************/<br />void&nbsp;RX_Mode(void)<br />{<br />&nbsp;CE=0;<br />&nbsp;&nbsp;&nbsp;SPI_Write_Buf(WRITE_REG&nbsp;+&nbsp;RX_ADDR_P0,&nbsp;TX_ADDRESS,&nbsp;TX_ADR_WIDTH);&nbsp;//&nbsp;Use&nbsp;the&nbsp;same&nbsp;address&nbsp;on&nbsp;the&nbsp;RX&nbsp;device&nbsp;as&nbsp;the&nbsp;TX&nbsp;device<br /><br />&nbsp;&nbsp;&nbsp;SPI_RW_Reg(WRITE_REG&nbsp;+&nbsp;EN_AA,&nbsp;0x01);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Enable&nbsp;Auto.Ack:Pipe0<br />&nbsp;&nbsp;&nbsp;SPI_RW_Reg(WRITE_REG&nbsp;+&nbsp;EN_RXADDR,&nbsp;0x01);&nbsp;&nbsp;//&nbsp;Enable&nbsp;Pipe0<br />&nbsp;&nbsp;&nbsp;SPI_RW_Reg(WRITE_REG&nbsp;+&nbsp;RF_CH,&nbsp;40);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Select&nbsp;RF&nbsp;channel&nbsp;40<br />&nbsp;&nbsp;&nbsp;SPI_RW_Reg(WRITE_REG&nbsp;+&nbsp;RX_PW_P0,&nbsp;TX_PLOAD_WIDTH);&nbsp;//&nbsp;Select&nbsp;same&nbsp;RX&nbsp;payload&nbsp;width&nbsp;as&nbsp;TX&nbsp;Payload&nbsp;width<br />&nbsp;&nbsp;&nbsp;SPI_RW_Reg(WRITE_REG&nbsp;+&nbsp;RF_SETUP,&nbsp;0x07);&nbsp;&nbsp;&nbsp;//&nbsp;TX_PWR:0dBm,&nbsp;Datarate:2Mbps,&nbsp;LNA:HCURR<br />&nbsp;&nbsp;&nbsp;SPI_RW_Reg(WRITE_REG&nbsp;+&nbsp;CONFIG,&nbsp;0x0f);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Set&nbsp;PWR_UP&nbsp;bit,&nbsp;enable&nbsp;CRC(2&nbsp;bytes)&nbsp;&&nbsp;Prim:RX.&nbsp;RX_DR&nbsp;enabled..<br /><br />&nbsp;&nbsp;&nbsp;CE&nbsp;=&nbsp;1;&nbsp;//&nbsp;Set&nbsp;CE&nbsp;pin&nbsp;high&nbsp;to&nbsp;enable&nbsp;RX&nbsp;device<br /><br />&nbsp;&nbsp;//&nbsp;&nbsp;This&nbsp;device&nbsp;is&nbsp;now&nbsp;ready&nbsp;to&nbsp;receive&nbsp;one&nbsp;packet&nbsp;of&nbsp;16&nbsp;bytes&nbsp;payload&nbsp;from&nbsp;a&nbsp;TX&nbsp;device&nbsp;sending&nbsp;to&nbsp;address<br />&nbsp;&nbsp;//&nbsp;&nbsp;'3443101001',&nbsp;with&nbsp;auto&nbsp;acknowledgment,&nbsp;retransmit&nbsp;count&nbsp;of&nbsp;10,&nbsp;RF&nbsp;channel&nbsp;40&nbsp;and&nbsp;datarate&nbsp;=&nbsp;2Mbps.<br /><br />}<br />/**************************************************/<br /><br />/**************************************************<br />Function:&nbsp;TX_Mode();<br /><br />Description:<br />&nbsp;&nbsp;This&nbsp;function&nbsp;initializes&nbsp;one&nbsp;nRF24L01&nbsp;device&nbsp;to<br />&nbsp;&nbsp;TX&nbsp;mode,&nbsp;set&nbsp;TX&nbsp;address,&nbsp;set&nbsp;RX&nbsp;address&nbsp;for&nbsp;auto.ack,<br />&nbsp;&nbsp;fill&nbsp;TX&nbsp;payload,&nbsp;select&nbsp;RF&nbsp;channel,&nbsp;datarate&nbsp;&&nbsp;TX&nbsp;pwr.<br />&nbsp;&nbsp;PWR_UP&nbsp;is&nbsp;set,&nbsp;CRC(2&nbsp;bytes)&nbsp;is&nbsp;enabled,&nbsp;&&nbsp;PRIM:TX.<br /><br />&nbsp;&nbsp;ToDo:&nbsp;One&nbsp;high&nbsp;pulse(&gt10us)&nbsp;on&nbsp;CE&nbsp;will&nbsp;now&nbsp;send&nbsp;this<br />&nbsp;&nbsp;packet&nbsp;and&nbsp;expext&nbsp;an&nbsp;acknowledgment&nbsp;from&nbsp;the&nbsp;RX&nbsp;device.<br />/**************************************************/<br />void&nbsp;TX_Mode(void)<br />{<br />&nbsp;CE=0;<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;SPI_Write_Buf(WRITE_REG&nbsp;+&nbsp;TX_ADDR,&nbsp;TX_ADDRESS,&nbsp;TX_ADR_WIDTH);&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Writes&nbsp;TX_Address&nbsp;to&nbsp;nRF24L01<br />&nbsp;&nbsp;&nbsp;SPI_Write_Buf(WRITE_REG&nbsp;+&nbsp;RX_ADDR_P0,&nbsp;TX_ADDRESS,&nbsp;TX_ADR_WIDTH);&nbsp;//&nbsp;RX_Addr0&nbsp;same&nbsp;as&nbsp;TX_Adr&nbsp;for&nbsp;Auto.Ack<br />&nbsp;&nbsp;&nbsp;SPI_Write_Buf(WR_TX_PLOAD,&nbsp;tx_buf,&nbsp;TX_PLOAD_WIDTH);&nbsp;//&nbsp;Writes&nbsp;data&nbsp;to&nbsp;TX&nbsp;payload<br /><br />&nbsp;&nbsp;&nbsp;SPI_RW_Reg(WRITE_REG&nbsp;+&nbsp;EN_AA,&nbsp;0x01);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Enable&nbsp;Auto.Ack:Pipe0<br />&nbsp;&nbsp;&nbsp;SPI_RW_Reg(WRITE_REG&nbsp;+&nbsp;EN_RXADDR,&nbsp;0x01);&nbsp;&nbsp;//&nbsp;Enable&nbsp;Pipe0<br />&nbsp;&nbsp;&nbsp;SPI_RW_Reg(WRITE_REG&nbsp;+&nbsp;SETUP_RETR,&nbsp;0x1a);&nbsp;//&nbsp;500us&nbsp;+&nbsp;86us,&nbsp;10&nbsp;retrans...<br />&nbsp;&nbsp;&nbsp;SPI_RW_Reg(WRITE_REG&nbsp;+&nbsp;RF_CH,&nbsp;40);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Select&nbsp;RF&nbsp;channel&nbsp;40<br />&nbsp;&nbsp;&nbsp;SPI_RW_Reg(WRITE_REG&nbsp;+&nbsp;RF_SETUP,&nbsp;0x07);&nbsp;&nbsp;&nbsp;//&nbsp;TX_PWR:0dBm,&nbsp;Datarate:2Mbps,&nbsp;LNA:HCURR<br />&nbsp;&nbsp;&nbsp;SPI_RW_Reg(WRITE_REG&nbsp;+&nbsp;CONFIG,&nbsp;0x0e);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Set&nbsp;PWR_UP&nbsp;bit,&nbsp;enable&nbsp;CRC(2&nbsp;bytes)&nbsp;&&nbsp;Prim:TX.&nbsp;MAX_RT&nbsp;&&nbsp;TX_DS&nbsp;enabled..<br />&nbsp;CE=1;<br /><br />}<br />/**************************************************/<br /><br />/**************************************************<br />Function:&nbsp;check_ACK();<br /><br />Description:<br />&nbsp;&nbsp;check&nbsp;if&nbsp;have&nbsp;&quot;Data&nbsp;sent&nbsp;TX&nbsp;FIFO&nbsp;interrupt&quot;,if&nbsp;TX_DS=1,<br />&nbsp;&nbsp;all&nbsp;led&nbsp;light&nbsp;and&nbsp;after&nbsp;delay&nbsp;100ms&nbsp;all&nbsp;led&nbsp;close<br />/**************************************************<br />void&nbsp;check_ACK()<br />{<br />&nbsp;uchar&nbsp;test;<br />&nbsp;test=SPI_Read(READ_REG+STATUS);&nbsp;//&nbsp;read&nbsp;register&nbsp;STATUS's<br />&nbsp;test=test&0x20;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;check&nbsp;if&nbsp;have&nbsp;Data&nbsp;sent&nbsp;TX&nbsp;FIFO&nbsp;interrupt&nbsp;(TX_DS=1)<br />&nbsp;if(test==0x20)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;TX_DS&nbsp;=1<br />&nbsp;{<br />&nbsp;&nbsp;P0=0x00;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;turn&nbsp;on&nbsp;all&nbsp;led<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delay100();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;delay&nbsp;100ms<br />&nbsp;&nbsp;P0=0xff;<br />&nbsp;}<br />}<br />/**************************************************/<br /><br />/**************************************************<br />Function:&nbsp;TxData();<br /><br />Description:<br />&nbsp;&nbsp;write&nbsp;data&nbsp;x&nbsp;to&nbsp;SBUF<br />/**************************************************/<br />void&nbsp;TxData&nbsp;(uchar&nbsp;x)<br />{<br />&nbsp;SBUF=x;&nbsp;&nbsp;&nbsp;//&nbsp;write&nbsp;data&nbsp;x&nbsp;to&nbsp;SBUF<br />&nbsp;while(TI==0);<br />&nbsp;&nbsp;TI=0;<br />}<br />/**************************************************/<br /><br />/**************************************************<br />Function:&nbsp;CheckButtons();<br /><br />Description:<br />&nbsp;&nbsp;check&nbsp;buttons&nbsp;,if&nbsp;have&nbsp;press,read&nbsp;the&nbsp;key&nbsp;values,<br />&nbsp;&nbsp;turn&nbsp;on&nbsp;led&nbsp;and&nbsp;transmit&nbsp;it;&nbsp;&nbsp;after&nbsp;transmition,<br />&nbsp;&nbsp;if&nbsp;received&nbsp;ACK,&nbsp;clear&nbsp;TX_DS&nbsp;interrupt&nbsp;and&nbsp;enter&nbsp;RX&nbsp;Mode;<br />&nbsp;&nbsp;turn&nbsp;off&nbsp;the&nbsp;led<br />/**************************************************/<br />void&nbsp;CheckButtons()<br />{<br />&nbsp;uchar&nbsp;Temp,xx,Tempi;<br /><br />&nbsp;P0=0xff;<br />&nbsp;Temp=P0&KEY;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//read&nbsp;key&nbsp;value&nbsp;from&nbsp;port&nbsp;P0<br />&nbsp;if&nbsp;(Temp!=KEY)<br />&nbsp;{&nbsp;<br />&nbsp;&nbsp;delay_ms(10);<br />&nbsp;&nbsp;Temp=P0&KEY;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;read&nbsp;key&nbsp;value&nbsp;from&nbsp;port&nbsp;P0<br />&nbsp;&nbsp;if&nbsp;(Temp!=KEY)<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;xx=Temp;<br />&nbsp;&nbsp;&nbsp;&nbsp;Tempi=Temp&gt&gt1;&nbsp;&nbsp;//&nbsp;Left&nbsp;shift&nbsp;4&nbsp;bits<br />&nbsp;&nbsp;&nbsp;&nbsp;P0=Tempi;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Turn&nbsp;On&nbsp;the&nbsp;led<br />&nbsp;&nbsp;&nbsp;&nbsp;tx_buf[0]=Tempi;&nbsp;//&nbsp;Save&nbsp;to&nbsp;tx_buf[0]<br />&nbsp;&nbsp;&nbsp;&nbsp;TX_Mode();&nbsp;&nbsp;&nbsp;//&nbsp;set&nbsp;TX&nbsp;Mode&nbsp;and&nbsp;transmitting<br />&nbsp;&nbsp;&nbsp;&nbsp;TxData(xx);&nbsp;&nbsp;&nbsp;//&nbsp;send&nbsp;data&nbsp;to&nbsp;uart<br />&nbsp;&nbsp;&nbsp;&nbsp;//check_ACK();&nbsp;&nbsp;//&nbsp;if&nbsp;have&nbsp;acknowledgment&nbsp;from&nbsp;RX&nbsp;device,turn&nbsp;on&nbsp;all&nbsp;led<br />&nbsp;&nbsp;&nbsp;&nbsp;SPI_RW_Reg(WRITE_REG+STATUS,SPI_Read(READ_REG+STATUS));&nbsp;//&nbsp;clear&nbsp;interrupt&nbsp;flag(TX_DS)<br />&nbsp;&nbsp;&nbsp;&nbsp;delay_ms(500);<br />&nbsp;&nbsp;&nbsp;&nbsp;P0=0xff;&nbsp;&nbsp;&nbsp;//&nbsp;Turn&nbsp;off&nbsp;the&nbsp;led&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;RX_Mode();&nbsp;&nbsp;&nbsp;//&nbsp;set&nbsp;receive&nbsp;mode<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;while((P0&KEY)!=KEY);<br />&nbsp;&nbsp;}<br />&nbsp;}<br />}<br />/**************************************************/<br /><br />/**************************************************<br />Function:&nbsp;main();<br /><br />Description:<br />&nbsp;&nbsp;control&nbsp;all&nbsp;subprogrammes;<br />/**************************************************/<br />void&nbsp;main(void)<br />{<br />&nbsp;uchar&nbsp;xx;<br />&nbsp;init_io();&nbsp;&nbsp;//&nbsp;Initialize&nbsp;IO&nbsp;port<br />&nbsp;Inituart();&nbsp;&nbsp;//&nbsp;initialize&nbsp;232&nbsp;uart<br />&nbsp;//init_int0();&nbsp;//&nbsp;enable&nbsp;int0&nbsp;interrupt<br />&nbsp;RX_Mode();&nbsp;&nbsp;//&nbsp;set&nbsp;RX&nbsp;mode<br />&nbsp;while(1)<br />&nbsp;{<br />&nbsp;&nbsp;CheckButtons();&nbsp;//&nbsp;scan&nbsp;key&nbsp;value&nbsp;and&nbsp;transmit<br />&nbsp;&nbsp;sta=SPI_Read(STATUS);&nbsp;//&nbsp;read&nbsp;register&nbsp;STATUS's&nbsp;value<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(RX_DR)&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;if&nbsp;receive&nbsp;data&nbsp;ready&nbsp;(RX_DR)&nbsp;interrupt<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);//&nbsp;read&nbsp;receive&nbsp;payload&nbsp;from&nbsp;RX_FIFO&nbsp;buffer<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;flag=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(MAX_RT)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SPI_RW_Reg(FLUSH_TX,0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;SPI_RW_Reg(WRITE_REG+STATUS,sta);//&nbsp;clear&nbsp;RX_DR&nbsp;or&nbsp;TX_DS&nbsp;or&nbsp;MAX_RT&nbsp;interrupt&nbsp;flag<br />&nbsp;&nbsp;if(flag)&nbsp;&nbsp;//&nbsp;finish&nbsp;received<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;flag=0;&nbsp;&nbsp;//&nbsp;set&nbsp;flag=0<br />&nbsp;&nbsp;&nbsp;P0=rx_buf[0];&nbsp;//&nbsp;turn&nbsp;on&nbsp;led<br />&nbsp;&nbsp;&nbsp;delay_ms(500);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;P0=0xff;&nbsp;&nbsp;//&nbsp;turn&nbsp;off&nbsp;led<br />&nbsp;&nbsp;&nbsp;xx=rx_buf[0]&gt&gt1;//&nbsp;right&nbsp;shift&nbsp;4&nbsp;bits<br />&nbsp;&nbsp;&nbsp;TxData(xx);&nbsp;&nbsp;//&nbsp;send&nbsp;data&nbsp;to&nbsp;uart<br />&nbsp;&nbsp;}<br />&nbsp;}<br />}<br />/**************************************************/<br /><br />/**************************************************<br />Function:&nbsp;ISR_int0()&nbsp;interrupt&nbsp;0;<br /><br />Description:<br />&nbsp;&nbsp;if&nbsp;RX_DR=1&nbsp;or&nbsp;TX_DS&nbsp;or&nbsp;MAX_RT=1,enter&nbsp;this&nbsp;subprogram;<br />&nbsp;&nbsp;if&nbsp;RX_DR=1,read&nbsp;the&nbsp;payload&nbsp;from&nbsp;RX_FIFO&nbsp;and&nbsp;set&nbsp;flag;<br />/**************************************************/<br />void&nbsp;ISR_int0(void)&nbsp;interrupt&nbsp;0<br />{<br />&nbsp;sta=SPI_Read(STATUS);&nbsp;//&nbsp;read&nbsp;register&nbsp;STATUS's&nbsp;value<br />&nbsp;if(RX_DR)&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;if&nbsp;receive&nbsp;data&nbsp;ready&nbsp;(RX_DR)&nbsp;interrupt<br />&nbsp;{<br />&nbsp;&nbsp;SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);//&nbsp;read&nbsp;receive&nbsp;payload&nbsp;from&nbsp;RX_FIFO&nbsp;buffer<br />&nbsp;&nbsp;flag=1;<br />&nbsp;}<br />&nbsp;if(MAX_RT)<br />&nbsp;{<br />&nbsp;&nbsp;SPI_RW_Reg(FLUSH_TX,0);<br />&nbsp;}<br />&nbsp;&nbsp;SPI_RW_Reg(WRITE_REG+STATUS,sta);//&nbsp;clear&nbsp;RX_DR&nbsp;or&nbsp;TX_DS&nbsp;or&nbsp;MAX_RT&nbsp;interrupt&nbsp;flag<br />}<br />/**************************************************/<br /><br /> 相关链接:<a href='http://auction1.taobao.com/auction/item_detail-0db2-ef522ffb8cf07027670369efebbdec65.jhtml'>http://auction1.taobao.com/auction/item_detail-0db2-ef522ffb8cf07027670369efebbdec65.jhtml</a>
您需要登录后才可以回帖 登录 | 注册

本版积分规则

19

主题

73

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部