'**************************************************************** '* Name : RFM_Transmit_16F690_V01.BAS * '* Author : [select VIEW...EDITOR OPTIONS] * '* Notice : Copyright (c) 2012 [select VIEW...EDITOR OPTIONS] * '* : All Rights Reserved * '* Date : 04.02.2012 * '* Version : 0.1 * '* Notes : * '* : * '**************************************************************** ;------------------------------------------------------------------------------- ;**** Added by Fuse Configurator **** ; Use the Fuse Configurator plug-in to change these settings Device = 16F690 Config FOSC_INTRCIO, WDTE_ON, PWRTE_OFF, MCLRE_OFF, CP_OFF, CPD_OFF, BOREN_ON, IESO_OFF, FCMEN_OFF ;**** End of Fuse Configurator Settings **** ;------------------------------------------------------------------------------- Xtal 8 Declare Watchdog = On ;Calculated Baudrate = 9615 @ Xtal 8MHz, Error = 0,16% Hserial_RCSTA = 144 ; Enable continuous receive Hserial_TXSTA = 32 ; Enable transmit, BRGH = 0 Hserial_SPBRG = 12 ; Baud Rate Generator Value Hserial_Clear = On ; Clear overflow automatically '--------------------------------------------------------------------- '--------------------регистры и таймеры------------------------------- '--------------------------------------------------------------------- OSCCON = %01111111 ' 8 Mhz While OSCCON.2 = 0 : Wend 'wait for frequency to stabilise OPTION_REG = %10000000 ' TMR0 1/16, FOSC_INTRCIO, WEAK PULL-UPS disabled ANSEL = %00000000 'All_Digital ANSELH = %00000000 'All_Digital '--------------------------------------------------------------------- '----------------------------- Настройки SPI ------------------------- '--------------------------------------------------------------------- 'To enable the serial port, SSP Enable bit SSPEN of the 'SSPCON register must be set. To reset or reconfigure 'SPI mode, clear the SSPEN bit, re-initialize the 'SSPCON registers and then set the SSPEN bit. This 'configures the SDI, SDO, SCK and SS pins as serial 'port pins. For the pins to behave as the serial port 'function, some must have their data direction bits (in 'the TRISB and TRISC registers) appropriately 'programmed. That is: '• SDI is automatically controlled by the SPI module ??? '• SDO must have TRISC<7> bit cleared '• SCK (Master mode) must have TRISB<6> bit cleared '• SCK (Slave mode) must have TRISB<6> bit set '• SS must have TRISC<6> bit set (The SS pin allows a Synchronous Slave mode) TRISA = %00000100 ' IRQ - IN TRISC = %00000000 TRISB = %00010000 ' MISO-->SDI --> IN Symbol SSPEN = SSPCON.5 'SSP Enable bit Symbol CKP = SSPCON.4 'Clock Polarity Select bit Symbol SSPM3 = SSPCON.3 'Synchronous Serial Port Mode Select bits Symbol SSPM2 = SSPCON.2 'Synchronous Serial Port Mode Select bits Symbol SSPM1 = SSPCON.1 'Synchronous Serial Port Mode Select bits Symbol SSPM0 = SSPCON.0 'Synchronous Serial Port Mode Select bits Symbol CKE = SSPSTAT.6 'SPI Clock Edge Select bit Symbol SMP = SSPSTAT.7 'SPI Data Input Sample Phase bit Symbol SSPIF = PIR1.3 Symbol GIE = INTCON.7 Symbol PEIE = INTCON.6 '--------------------------------------------------------------------- '--------------------------- Подключение RFM70 ----------------------- ' ---PIC16F690--- ---RFM70--- Symbol CE = PORTC.5 ' --> CE Symbol CSN = PORTC.6 ' --> CSN Symbol IRQ = PORTA.2 ' <-- IRQ 'Symbol SCK = PORTB.6 --> SCK 'Symbol SDI = PORTB.4 <-- MISO 'Symbol SDO = PORTC.7 --> MOSI '--------------------------------------------------------------------- '-------------------------- Служебные подключения -------------------- Symbol TX = PORTB.7 Symbol LED = PORTC.3 '--------------------------------------------------------------------- SSPEN = 0 ' disable SPI pins CKP = 0 ' clock idle low CKE = 1 ' Data transmitted on rising edge of SCK (Microwire alternate) SMP = 0 ' Input data sampled at middle of data output time (Microwire) in Master Mode SSPM3 = 0 ' ************************************ SSPM2 = 0 ' **SPI Master mode, clock = FOSC/64** SSPM1 = 1 ' ** ** SSPM0 = 0 ' ************************************ SSPIF = 0 ' clear buffer flag full status SSPEN = 1 ' enable SPI pins '================================================================================ '--------------------------- RFM70 COMMAND and REGISTER ------------------------- '================================================================================ '============================ // SPI(RFM70) commands Symbol W_REGISTER = $20 ' Для записи в регистр --> Register | W_REGISTER Symbol RD_RX_PLOAD = $61 ' читает принятые данные из буфера приёма от 1 до 32 байт, ' в зависимости от того сколько получили. 'Данные из приёмного буфера удалятся, только если будет прочитано 'столько байт, сколько там есть(это можно узнать командой R_RX_PL_WID). 'Иначе в следующий раз мы будем читать тот-же самый пакет. Symbol WR_TX_PLOAD = $A0 'пишет данные в буфер передачи от 1 до 32 байт, в зависимости от того, 'какая длина пакета выбрана. Symbol FLUSH_TX = $E1 'очищает буфер передачи. Нужно вызывать перед тем, как поместить данные для 'новой передачи после неудавшейся попытки и после смены адреса передатчика. Symbol FLUSH_RX = $E2 'очищает буфер приёмника, если мы не хотим читать принятое сообщение. Symbol REUSE_TX_PL = $E3 'передать последнее переданное сообщение еще раз. Symbol ACTIVATE_CMD = $50 'если вызвать эту команду с «магическим» параметром $73, 'то у нас включается режим переменной длинны пакетов. 'Если с параметром $53 у нас переключится текущий банк регистров, 'с которым работают R_REGISTER и W_REGISTER. 'Использовать ее можно только в power down и stand by режимах, 'при низком уровне на линии CE. Symbol R_RX_PL_WID_CMD = $60 'возвращает длину первого в очереди принятого пакета. Symbol W_ACK_PAYLOAD = $A8 '(%1010 1PPP) записывает данные, которые нужно отправить вместе с пакетом подтверждения приёма. 'PPP — номер конечной точки от 000 до 101. 'Можно записать для трёх конечных точек одновременно. Symbol W_TX_PAYLOAD_NOACK = $b0 'пишет данные в буфер передачи от 1 до 32 байт. 'Для этого пакета не будет выслано подтверждение 'о получении и передатчик на будет его ждать. Symbol NOP_NOP = %11111111 'Ничего не делает. Может использоваться для чтения статусного регистра. '============================// SPI(RFM70) registers(addresses) Symbol CONF_REG $00 'Config' register address Symbol EN_AA $01 'Enable Auto Acknowledgment' register address Symbol EN_RXADDR $02 'Enabled RX addresses' register address Symbol SETUP_AW $03 'Setup address width' register address Symbol SETUP_RETR $04 'Setup Auto. Retrans' register address Symbol RF_CH $05 'RF channel' register address Symbol RF_SETUP $06 'RF setup' register address Symbol STATUS_REG $07 'Status' register address Symbol OBSERVE_TX $08 'Observe TX' register address Symbol CD $09 'Carrier Detect' register address Symbol RX_ADDR_P0 $0A 'RX address pipe0' register address Symbol RX_ADDR_P1 $0B 'RX address pipe1' register address Symbol RX_ADDR_P2 $0C 'RX address pipe2' register address Symbol RX_ADDR_P3 $0D 'RX address pipe3' register address Symbol RX_ADDR_P4 $0E 'RX address pipe4' register address Symbol RX_ADDR_P5 $0F 'RX address pipe5' register address Symbol TX_ADDR $10 'TX address' register address Symbol RX_PW_P0 $11 'RX payload width, pipe0' register address Symbol RX_PW_P1 $12 'RX payload width, pipe1' register address Symbol RX_PW_P2 $13 'RX payload width, pipe2' register address Symbol RX_PW_P3 $14 'RX payload width, pipe3' register address Symbol RX_PW_P4 $15 'RX payload width, pipe4' register address Symbol RX_PW_P5 $16 'RX payload width, pipe5' register address Symbol FIFO_STATUS $17 'FIFO Status Register' register address Symbol PAYLOAD_WIDTH $1f 'payload length of 256 bytes modes register address '============================//interrupt status Symbol STATUS_RX_DR $40 Symbol STATUS_TX_DS $20 Symbol STATUS_MAX_RT $10 Symbol STATUS_TX_FULL $01 '============================//FIFO_STATUS Symbol FIFO_STATUS_TX_REUSE $40 Symbol FIFO_STATUS_TX_FULL $20 Symbol FIFO_STATUS_TX_EMPTY $10 Symbol FIFO_STATUS_RX_FULL $02 Symbol FIFO_STATUS_RX_EMPTY $01 '================================================================================================== '---------------------------- RFM70 Variables Declare --------------------------------------------* '================================================================================================== Dim Tmp1 As Byte ' Переменная для счётчика в основном цикле Dim Tmp2 As Byte ' Переменная для счётчика в основном цикле Dim Tmp_Sub1 As Byte ' Переменная для подпрограмм Dim Cnt_OTL1 As Byte ' Переменная для счётчика при отладке Dim Cnt_Sub1 As Byte ' Переменная для счётчика в подпрограммах Dim Cnt_Sub2 As Byte ' Переменная для счётчика в подпрограммах Dim Cnt_Sub3 As Byte ' Переменная для счётчика в подпрограммах Dim Register As Byte Dim bit_ctr As Byte Dim N_byte As Byte ' Число бит в записи Dim Value_Reg As Byte Dim Data_in[32] As Byte Dim Data_out[32] As Byte Dim B_ank As Byte ' Номер банка Dim S_tatus As Byte ' Содержимое регистра STATUS_REG Dim SendData[32] As Byte ' данные для посылки Dim Recieve_Data[32] As Byte ' полученные данные Dim B_ank_bit As Bit Dim Fifo_sta As Byte ' Содержимое регистра FIFO_STATUS Dim Chanel As Byte ' FR Chanel Dim Packet_Length As Byte ' Длина пакета Dim Full As Bit Dim Wrong_Packet As Bit Packet_Length = 32 ' Длина пакета !!! '************************************ !!!!!!!!!!!! ************************************************ GoTo Main ' Jump To Main Code '* '************************************************************************************************** '================================================================================================== '------------------------------------ Подпрограммы ------------------------------------------------ '================================================================================================== '================================================================================================== '----------------------- Запись-чтение в RFM70 SPI ----------------------- SPI_Write_Short: '( Register ) Low CSN SSPBUF = Register 'send Register No to Write GoSub Buffer_ok 'wait until buffer ready High CSN Return SPI_Write: '( Register, Value_Reg ) Low CSN SSPBUF = Register 'send Register No to Write GoSub Buffer_ok 'wait until buffer ready SSPBUF = Value_Reg 'send variable GoSub Buffer_ok 'wait until buffer ready High CSN Return SPI_Read: '( Register, = Value_Reg ) Low CSN SSPBUF = Register GoSub Buffer_ok 'wait until buffer ready SSPBUF = $00 'write to SSPBUF to start clock GoSub Buffer_ok 'wait for receipt Value_Reg = SSPBUF 'store received character in array High CSN Return SPI_Buffer_Write: '( Register, N_byte, Data_out[] ) Low CSN SSPBUF = Register GoSub Buffer_ok 'wait until buffer ready For bit_ctr = 0 To N_byte 'loop for # byte SSPBUF = Data_out[bit_ctr] 'send array variable GoSub Buffer_ok 'wait until buffer ready Next bit_ctr 'next location High CSN Return SPI_Buffer_Read: '( Register, N_byte, Data_in[] ) Low CSN SSPBUF = Register GoSub Buffer_ok 'wait until buffer ready For bit_ctr = 0 To N_byte 'loop for # byte SSPBUF = $00 'write to SSPBUF to start clock GoSub Buffer_ok 'wait for receipt Data_in[bit_ctr] = SSPBUF 'store received character in array Next bit_ctr 'get next byte High CSN Return Buffer_ok: If SSPIF = 0 Then Buffer_ok 'wait for SPI interupt flag SSPIF = 0 'reset flag Return '----------------------- Запись-чтение в RFM70 SPI ----------------------- '================================================================================================== '----------------------- Безусловное Переключение банка B_ank Change_Bank: Low CE Register = ACTIVATE_CMD Value_Reg = $53 GoSub SPI_Write DelayMS 100 Return '----------------------- Переключение банка B_ank rfm70_bank: Register = STATUS_REG GoSub SPI_Read If Value_Reg & $80 <> B_ank <<7 Then GoSub Change_Bank EndIf Return SwitchToRxMode: Low CE Register = FLUSH_RX '//flush Rx GoSub SPI_Write_Short Register = STATUS_REG '// clear RX_DR or TX_DS or MAX_RT interrupt flag GoSub SPI_Read '// read register STATUS's value S_tatus = Value_Reg ' Для памяти и наглядности Value_Reg = S_tatus ' Для памяти и наглядности Register = STATUS_REG | W_REGISTER GoSub SPI_Write Register = CONF_REG GoSub SPI_Read '//PRX Value_Reg = Value_Reg | $01 Register = CONF_REG | W_REGISTER GoSub SPI_Write DelayMS 2 High CE Return SwitchToTxMode: Low CE Register = FLUSH_TX GoSub SPI_Write_Short Register = CONF_REG GoSub SPI_Read '//PTX Value_Reg = Value_Reg & $FE '//set bit 0 Register = CONF_REG | W_REGISTER GoSub SPI_Write '// Set PWR_UP bit, enable CRC(2 length) & Prim:RX. RX_DR enabled. DelayMS 2 Return ' Установить рабочий радиоканал SetChannelNum: ' F0= 2400 + RF_CH (MHz) Register = RF_CH | W_REGISTER Value_Reg = Chanel & $7F GoSub SPI_Write Return '----------------------- rfm70_mode_powerdown Mode_powerdown: Low CE Register = CONF_REG 'CONFIG REG GoSub SPI_Read Value_Reg = Value_Reg & $FD ' // clear PWR_UP bit Register = CONF_REG | W_REGISTER GoSub SPI_Write Return '----------------------- rfm70_mode_standby Mode_standby: Low CE Register = CONF_REG 'CONFIG REG GoSub SPI_Read Value_Reg = Value_Reg |$02 ' // set PWR_UP bit Register = CONF_REG | W_REGISTER GoSub SPI_Write '----------------------- Посылка пакета ------------------------------------ Send_Packet: Register = FIFO_STATUS 'FIFO_STATUS GoSub SPI_Read Fifo_sta = Value_Reg '// read register FIFO_STATUS's value If Fifo_sta & FIFO_STATUS_TX_FULL = 0 Then '//if not full, send data (write buff) Toggle LED Register = WR_TX_PLOAD N_byte = Packet_Length - 1 For Cnt_Sub3 = 0 To N_byte Data_out[Cnt_Sub3] = SendData[Cnt_Sub3] Next Cnt_Sub3 GoSub SPI_Buffer_Write '// Writes data to buffer High CE DelayUS 50 ' Инициализация передачи Low CE EndIf Waitloop: If IRQ = 0 Then 'check for IRQ Register = STATUS_REG 'STATUS_REG GoSub SPI_Read Tmp_Sub1 = Value_Reg & %01110000 'mask IRQ bits '----------------------------------------------- ОТЛАДКА ------------------------------------ ' HRSOut "RF Status- ",Bin8 Tmp_Sub1,13 '----------------------------------------------- ОТЛАДКА ------------------------------------ Select Tmp_Sub1 Case STATUS_MAX_RT 'max no of retries exceeded '----------------------------------------------- ОТЛАДКА ------------------------------------ HRSOut "Max number of retries ,Flushing buffer",13 '----------------------------------------------- ОТЛАДКА ------------------------------------ Register = FLUSH_TX 'empty TX Buffer GoSub SPI_Write_Short Register = STATUS_REG | W_REGISTER 'clear status register Value_Reg = %00010000 GoSub SPI_Write Set LED Return Case STATUS_TX_DS ' send ok ack received '----------------------------------------------- ОТЛАДКА ------------------------------------ HRSOut "Packet sent OK ",13 '----------------------------------------------- ОТЛАДКА ------------------------------------ Register = STATUS_REG | W_REGISTER 'clear status register Value_Reg = %001010000 'clear status register GoSub SPI_Write Return Case Else '----------------------------------------------- ОТЛАДКА ------------------------------------ HRSOut "Other IRQ ",Bin8 Tmp_Sub1,13 'empty tx buffer '----------------------------------------------- ОТЛАДКА ------------------------------------ Register = FLUSH_TX GoSub SPI_Write_Short Register = STATUS_REG | W_REGISTER ''clear status register Value_Reg = %00110000 GoSub SPI_Write Set LED Return End Select Else GoTo Waitloop End If Return '----------------------- Приём пакета ------------------------------------ Receive_Packet: Register = STATUS_REG 'STATUS GoSub SPI_Read '// read register STATUS's value S_tatus = Value_Reg If STATUS_RX_DR & S_tatus = 40 Then Register = RD_RX_PLOAD N_byte = Packet_Length - 1 GoSub SPI_Buffer_Read '// read receive payload from RX_FIFO buffer For Cnt_Sub2 = 0 To N_byte Recieve_Data[Cnt_Sub2] = Data_in[Cnt_Sub2] ' LSByte First!!! Next Cnt_Sub2 EndIf Register = W_REGISTER | STATUS_REG '// clear RX_DR or TX_DS or MAX_RT interrupt flag S_tatus = Value_Reg '// read register STATUS's value GoSub SPI_Write Return '================================================================================================== '================================================================================================== '------------- INIT BANK0 ------------------------------------------------------------------------- Init_BANK_0: B_ank = 0 GoSub rfm70_bank '------------------------------------------- ОТЛАДКА ---------------------------------------------- Register = $07 GoSub SPI_Read B_ank_bit = Value_Reg.7 HRSOut "Bank: ",Bin B_ank_bit, $0D, $0A '------------------------------------------- ОТЛАДКА ---------------------------------------------- '========================================= '------------------------------ INIT Values Bank0 Declare-----------------------------------------* '========================================= Dim Reg0_INIT_9[9] As Byte Reg0_INIT_9[0] = $0F ' // receive, enabled, CRC 2, enable interupts Reg0_INIT_9[1] = $00 ' // auto-ack on all pipes disabled Reg0_INIT_9[2] = $03 ' // Enable pipe 0 & 1 Reg0_INIT_9[3] = $03 ' // 5 bytes addresses Reg0_INIT_9[4] = $00 ' // no auto retransmission Reg0_INIT_9[5] = 40 ' // RF channel register channel 10 Reg0_INIT_9[6] = $37 ' // RF setup register data rate 1Mbit, power 5dbm, LNA gain high Reg0_INIT_9[7] = $07 ' // why write this at all?? but seems required to work... Reg0_INIT_9[8] = $00 ' // Observe TX register clear Tx packet counters '========================================= '--------------------------------- ACTIVATE RFM70 !!! --------------------------------------------* '========================================= ' Register = $1D ' 0 showed that chip has been actived. So do Not active again ' GoSub SPI_Read ' This write command followed by data 0x73 activates ' If Value_Reg <> $00 Then ' the following features: ' Register = ACTIVATE_CMD ' R_RX_PL_WID ' Value_Reg = $73 ' W_ACK_PAYLOAD ' GoSub SPI_Write ' W_TX_PAYLOAD_NOACK ' EndIf For Cnt_Sub1 = 0 To 8 Register = Cnt_Sub1 | W_REGISTER Value_Reg = Reg0_INIT_9[Cnt_Sub1] GoSub SPI_Write Next Register = $0A | W_REGISTER ' RX_ADDR_P0 LSByte To MSByte N_byte = 4 Data_out[0] = $01 ' Receive address data pipe 0. 5 Bytes Data_out[1] = $10 ' maximum length. (LSB byte is written first Data_out[2] = $10 ' Write the number of bytes defined by Data_out[3] = $43 ' SETUP_AW) Data_out[4] = $34 ' GoSub SPI_Buffer_Write ' Register = $0B ' RX_ADDR_P1 LSByte To MSByte ' N_byte = 4 ' Data_out[0] = $02 ' Receive address data pipe 1. 5 Bytes ' Data_out[1] = $10 ' maximum length. (LSB byte is written first ' Data_out[2] = $10 ' Write the number of bytes defined by ' Data_out[3] = $43 ' SETUP_AW) ' Data_out[4] = $35 ' ' GoSub SPI_Buffer_Write ' Register = $0C | W_REGISTER ' RX_ADDR_P2 ' Value_Reg = $03 ' Receive address data pipe 2. Only LSB ' GoSub SPI_Write ' MSB bytes is equal to RX_ADDR_P1[39:8] ' Register = $0D | W_REGISTER ' RX_ADDR_P3 ' Value_Reg = $04 ' Receive address data pipe 3. Only LSB ' GoSub SPI_Write ' MSB bytes is equal to RX_ADDR_P1[39:8] ' Register = $0E | W_REGISTER ' RX_ADDR_P4 ' Value_Reg = $05 ' Receive address data pipe 4. Only LSB ' GoSub SPI_Write ' MSB bytes is equal to RX_ADDR_P1[39:8] ' Register = $0F | W_REGISTER ' RX_ADDR_P5 ' Value_Reg = $06 ' Receive address data pipe 5. Only LSB ' GoSub SPI_Write ' MSB bytes is equal to RX_ADDR_P1[39:8] Register = $10 | W_REGISTER ' TX_ADDR LSByte To MSByte N_byte = 4 Data_out[0] = $01 ' Transmit address. Used for a PTX device Data_out[1] = $10 ' only. (LSB byte is written first) Data_out[2] = $10 ' Set RX_ADDR_P0 equal to this address to Data_out[3] = $43 ' handle automatic acknowledge if this is a Data_out[4] = $34 ' PTX device GoSub SPI_Buffer_Write ' For Cnt_Sub1 = $11 To $16 ' Number of bytes in RX payload in data pipe 0 to 5 ' Register = Cnt_Sub1 | W_REGISTER ' 6 bytes !!! ' Value_Reg = Packet_Length ' GoSub SPI_Write ' Next Register = RX_PW_P0 | W_REGISTER ' Number of bytes in RX payload in data pipe Value_Reg = Packet_Length ' 7:6 - Only '00' allowed GoSub SPI_Write Register = $17 | W_REGISTER ' // Reg$17 - FIFO status Value_Reg = $00 GoSub SPI_Write Register = $1C | W_REGISTER ' // Reg$17 - FIFO status Value_Reg = $00 GoSub SPI_Write ' Register = $1D | W_REGISTER ' 0 showed that chip has been actived. So do Not active again ' Value_Reg = %00000001 ' GoSub SPI_Write ' This write command followed by data 0x73 activates Return '------------- INIT BANK1 ----------------------------------- Init_BANK_1: B_ank = 1 GoSub rfm70_bank '------------------------------------------- ОТЛАДКА ---------------------------------------------- Register = STATUS_REG GoSub SPI_Read B_ank_bit = Value_Reg.7 HRSOut "Bank: ",Bin B_ank_bit, $0D, $0A '------------------------------------------- ОТЛАДКА ---------------------------------------------- N_byte = 3 Register = 0 | W_REGISTER ' MSByte to LSByte Data_out[3] = $E2 Data_out[2] = $01 Data_out[1] = $4B Data_out[0] = $40 GoSub SPI_Buffer_Write N_byte = 3 Register = 1 | W_REGISTER ' MSByte to LSByte Data_out[3] = $00 Data_out[2] = $00 Data_out[1] = $4B Data_out[0] = $C0 GoSub SPI_Buffer_Write N_byte = 3 Register = 2 | W_REGISTER ' MSByte to LSByte Data_out[3] = $02 Data_out[2] = $8C Data_out[1] = $FC Data_out[0] = $D0 GoSub SPI_Buffer_Write N_byte = 3 Register = 3 | W_REGISTER ' MSByte to LSByte Data_out[3] = $41 Data_out[2] = $39 Data_out[1] = $00 Data_out[0] = $99 GoSub SPI_Buffer_Write N_byte = 3 Register = 4 | W_REGISTER ' MSByte to LSByte Data_out[3] = $0B Data_out[2] = $86 Data_out[1] = $9E Data_out[0] = $D9 GoSub SPI_Buffer_Write N_byte = 3 Register = 5 | W_REGISTER ' MSByte to LSByte <> Data_out[3] = $A6 Data_out[2] = $7F Data_out[1] = $06 Data_out[0] = $24 GoSub SPI_Buffer_Write N_byte = 3 Register = 6 | W_REGISTER ' MSByte to LSByte Data_out[3] = $00 Data_out[2] = $00 Data_out[1] = $00 Data_out[0] = $00 GoSub SPI_Buffer_Write N_byte = 3 Register = 12 | W_REGISTER ' LSByte To MSByte Data_out[0] = $00 Data_out[1] = $12 Data_out[2] = $73 Data_out[3] = $00 GoSub SPI_Buffer_Write N_byte = 3 Register = 13 | W_REGISTER ' LSByte To MSByte Data_out[0] = $36 Data_out[1] = $B4 Data_out[2] = $80 Data_out[3] = $00 GoSub SPI_Buffer_Write N_byte = 10 Register = 14 | W_REGISTER ' LSByte To MSByte Data_out[0] = $41 Data_out[1] = $20 Data_out[2] = $08 Data_out[3] = $04 Data_out[4] = $81 Data_out[5] = $20 Data_out[6] = $CF Data_out[7] = $F7 Data_out[8] = $FE Data_out[9] = $FF Data_out[10] = $FF GoSub SPI_Buffer_Write DelayMS 50 Return '================================================================================================== '------------------------------------------- ОТЛАДКА ---------------------------------------------- '================================================================================================== '------------- Display BANK0 ------------------------------------------------------------------ Display_Bank0: For Cnt_OTL1 = 0 To $09 Register = Cnt_OTL1 GoSub SPI_Read HRSOut "REG ",Dec2 Register,"(",Hex2 Register,") = ", Hex2 Value_Reg, $0D, $0A Next Cnt_OTL1 N_byte = 4 Register = $0A GoSub SPI_Buffer_Read HRSOut "REG ",Dec2 Register,"(",Hex2 Register,") = " For Cnt_OTL1 = 4 To 0 Step -1 HRSOut Hex2 Data_in[Cnt_OTL1] Next Cnt_OTL1 HRSOut $0D, $0A N_byte = 4 Register = $0B GoSub SPI_Buffer_Read HRSOut "REG ",Dec2 Register,"(",Hex2 Register,") = " For Cnt_OTL1 = 4 To 0 Step -1 HRSOut Hex2 Data_in[Cnt_OTL1] Next Cnt_OTL1 HRSOut $0D, $0A For Cnt_OTL1 = $0C To $0F Register = Cnt_OTL1 GoSub SPI_Read HRSOut "REG ",Dec2 Register,"(",Hex2 Register,") = ", Hex2 Value_Reg, $0D, $0A Next Cnt_OTL1 N_byte = 4 Register = $10 GoSub SPI_Buffer_Read HRSOut "REG ",Dec2 Register,"(",Hex2 Register,") = " For Cnt_OTL1 = 4 To 0 Step -1 HRSOut Hex2 Data_in[Cnt_OTL1] Next Cnt_OTL1 HRSOut $0D, $0A For Cnt_OTL1 = $11 To $17 Register = Cnt_OTL1 GoSub SPI_Read HRSOut "REG ",Dec2 Register,"(",Hex2 Register,") = ", Hex2 Value_Reg, $0D, $0A Next Cnt_OTL1 For Cnt_OTL1 = $1C To $1D Register = Cnt_OTL1 GoSub SPI_Read HRSOut "REG ",Dec2 Register,"(",Hex2 Register,") = ", Hex2 Value_Reg, $0D, $0A Next Cnt_OTL1 HRSOut $0D, $0A Return '------------- Display BANK1 ----------------------------------- Display_Bank1: Register = 7 GoSub SPI_Read HRSOut "StATUS REG ",Dec2 Register,"(",Hex2 Register,") = %", Bin8 Value_Reg, $0D, $0A N_byte = 3 Register = 8 GoSub SPI_Buffer_Read HRSOut "REG ",Dec2 Register,"(",Hex2 Register,") = " For Cnt_OTL1 = 3 To 0 Step -1 HRSOut Hex2 Data_in[Cnt_OTL1] Next Cnt_OTL1 HRSOut $0D, $0A N_byte = 10 Register = $0E GoSub SPI_Buffer_Read HRSOut "REG ",Dec2 Register,"(",Hex2 Register,") = " For Cnt_OTL1 = 10 To 0 Step -1 HRSOut Hex2 Data_in[Cnt_OTL1] Next Cnt_OTL1 HRSOut $0D, $0A Return '================================================================================================== '--------------------------------------- Main Code ------------------------------------------------ '================================================================================================== Main: High TX High LED Low CE High CSN '------------------------------------------- ОТЛАДКА ---------------------------------------------- HRSOut $0D, $0A, "RFM70 INIT ", $0D, $0A, $0D, $0A DelayMS 200 Low LED '------------------------------------------- ОТЛАДКА ---------------------------------------------- GoSub Init_BANK_0 GoSub Display_Bank0 GoSub Init_BANK_1 GoSub Display_Bank1 HRSOut "MAIN CONFIG COMLETED!!!",$0D, $0A, $0D, $0A B_ank = 0 GoSub rfm70_bank Register = STATUS_REG GoSub SPI_Read B_ank_bit = Value_Reg.7 HRSOut "Bank: ",Bin B_ank_bit, $0D, $0A GoSub SwitchToTxMode '------------------------------------------- ОТЛАДКА ---------------------------------------------- Register = CONF_REG GoSub SPI_Read HRSOut "CONF_REG ",Dec2 Register,"(",Hex2 Register,") = %", Bin8 Value_Reg, $0D, $0A '------------------------------------------- ОТЛАДКА ---------------------------------------------- While 1=1 Clrwdt SendData[0] = $21 SendData[1] = $22 SendData[2] = $23 SendData[3] = $24 SendData[4] = $25 For Tmp2 = 5 To 31 SendData[Tmp2] = $00 Next Tmp2 GoSub Send_Packet ' HRSOut "SendData= " ' For Tmp1 = 0 To Packet_Length -1 ' HRSOut Hex2 Data_out[Tmp1],": " ' Next Tmp1 ' HRSOut $0D, $0A ' Register = STATUS_REG ' GoSub SPI_Read ' HRSOut "STATUS_REG ",Dec2 Register,"(",Hex2 Register,") = %", Bin8 Value_Reg, $0D, $0A DelayMS 1000 ' Посылать каждую секунду ' Toggle LED Wend '------------------------------------------- ОТЛАДКА ---------------------------------------------- 'While 1=1 'DelayMS 1000 'Toggle LED 'Wend '------------------------------------------- ОТЛАДКА ---------------------------------------------- End