'------------------------------------------------------------------------------- 'Name : nRF905.bas 'Copyright : http://www.avrbase.com 'Micro : AtMega8 'Author : slyt '------------------------------------------------------------------------------- Declare Sub Config905() Declare Sub Set_rx_mode() Declare Sub Set_tx_mode() Declare Sub Rf905_send(byval Address As Byte , Byval Bytes As Byte) Declare Sub Rf905_receieve(byval Bytes As Byte) Declare Function Waterlevel() As Byte Declare Sub Spiwrite(byval Spishuju As Byte) Declare Function Spiread() As Byte 'Spiinit 初始化 SPI 状态和引脚. Mosi Alias Portd.6 : Ddrd.6 = 1 Miso Alias Pind.7 : Ddrd.7 = 0 : Portd.7 = 1 Clk Alias Portc.5 : Ddrc.5 = 1 : Clk = 0 '定义RF905管脚 Dr Alias Pinb.0 : Ddrb.0 = 0 : Portb.0 = 1 '接收或发射数据完成 Trx_ce Alias Portb.1 : Ddrb.1 = 1 '使能发射或接收 Tx_en Alias Portb.2 : Ddrb.2 = 1 '选择发射或接收模式 Gsn Alias Portd.5 : Ddrd.5 = 1 : Gsn = 1 'SPI使能 '=====定义变量===== Dim Spi_data(10) As Byte Dim Dosend As Byte '===========================程序开始=============================== Call Config905() Call Set_rx_mode() Do If Dr = 1 Then '检查nRF905是否接收到数据 Rf905_receieve 2 '读取2个字节数据 End If If Dosend = 2 Then Dosend = 0 Rf905_send &HAA , 2 '发送2个字节数据 End If Loop End '############################################################### '===============SPI_WRITE=============== Sub Spiwrite(spishuju As Byte) Local Sii As Byte For Sii = 7 To 0 Step -1 Mosi = Spishuju.sii Clk = 1 nop Clk = 0 Next End Sub '===============SPI_READ=============== Function Spiread() As Byte Local Sii As Byte Local Ssrr As Byte For Sii = 7 To 0 Step -1 Clk = 1 nop Ssrr.sii = Miso Clk = 0 Next Spiread = Ssrr End Function '==============初始化RF905模块============= Sub Config905() Trx_ce = 0 Gsn = 0 'CSN 片选信号,SPI 使能 Waitms 1 Spiwrite &H00 '向905 芯片写配置命令 Restore Config905_data For I = 1 To 10 Read Spi_data(i) Spiwrite Spi_data(i) '写入配置信息 Next Waitms 1 Gsn = 1 '结束SPI 数据传输 End Sub '==============设置RF905为接收模式========== Sub Set_rx_mode() Tx_en = 0 Trx_ce = 1 Waitms 1 End Sub '==============设置RF905为发送模式========== Sub Set_tx_mode() Tx_en = 1 Trx_ce = 0 Waitms 1 End Sub '==============RF905发送数据============== Sub Rf905_send(byval Address As Byte , Byval Bytes As Byte) Local Rrss As Byte Trx_ce = 0 'TRX_CE置低,进入待机和SPI操作模式 Tx_en = 1 'TX_EN置高 ,进入发送模式 Waitms 1 Gsn = 0 'CSN置低,进入SPI操作模式 Spiwrite &H22 '向nRF905写入"写TX地址"指令 Spiwrite Address '写入TX地址 Spiwrite Address '写入TX地址 Spiwrite Address '写入TX地址 Spiwrite Address '写入TX地址 Gsn = 1 'CSN置高,退出SPI操作模式 nop Gsn = 0 'CSN置低,进入SPI操作模式 Spiwrite &H20 '向nRF905写入"写TX数据"指令 Nop : Nop For Rrss = 1 To Bytes Spiwrite Spi_data(rrss) '写入待发送数据 Next Gsn = 1 'CSN置高,退出SPI操作模式 Trx_ce = 1 'TRX_CE置高,启动射频发送 While Dr = 0 : Wend '等待DR置高,发送完成 Tx_en = 0 'TX_EN置低 ,进入接收模式 Waitms 1 End Sub '=============RF905接收数据============= Sub Rf905_receieve(byval Bytes As Byte) As Byte Local Rrr As Byte Trx_ce = 0 'TRX_CE置低,进入待机和SPI操作模式 Waitms 1 Gsn = 0 'CSN置低,进入SPI操作模式 Spiwrite &H24 '向nRF905写入准备读取接收到的数据指令 Nop : Nop For Rrr = 1 To Bytes Spi_data(rrr) = Spiread() '读取接收到的数据 Next While Dr = 1 : Wend '等待DR置低,读取数据完成 Gsn = 1 'CSN置高,退出SPI操作模式 Trx_ce = 1 'TRX_CE置高,进入工作模式 End Sub '=============RF905配置数据============= Config905_data: Data &H4C , &H0C , &H44 , &H02 , &H02 , &HBB , &HBB , &HBB , &HBB , &H58 '( 字节0:&H4c -&B01001100 430.0m 字节1:&H0c -&B00001100 工作在430m频率段、输出功率10dm、正常接收模式、不重发。 字节2:&H11 -&B00010001 1字节rx地址宽度、1字节tx地址宽度。 字节3:&H01 -&B00000001 1字节rx接收有效数据宽度 字节4:&H01 -&B00000001 1字节tx发送有效数据宽度 字节5:&Hee -&B11101110 Rx地址0字节 字节6:&Hee -&B11101110 Rx地址1字节 字节7:&Hee -&B11101110 Rx地址2字节 字节8:&Hee -&B11101110 Rx地址3字节 字节9:&H58 -&B01011000 输出频率4mhz、没有外部时钟、外部晶体振荡频率16mhz、允许crc校验、8位crc校验模式 ') |
欢迎光临 圣龙扬特-AVR电子 (http://avr.cnta.net/) | Powered by Discuz! X2.5 |