Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- '****************************************************************
- '* Name : UNTITLED.BAS *
- '* Author : [select VIEW...EDITOR OPTIONS] *
- '* Notice : Copyright (c) 2019 [select VIEW...EDITOR OPTIONS] *
- '* : All Rights Reserved *
- '* Date : 08/07/2019 *
- '* Version : 1.0 *
- '* Notes : *
- '* : *
- '****************************************************************
- '****************************************************************
- '* Name : UNTITLED.BAS *
- '* Author : [select VIEW...EDITOR OPTIONS] *
- '* Notice : Copyright (c) 2019 [select VIEW...EDITOR OPTIONS] *
- '* : All Rights Reserved *
- '* Date : 08/07/2019 *
- '* Version : 1.0 *
- '* Notes : *
- '* : *
- '****************************************************************
- Device = 16F1826
- $define test
- Config1 FOSC_INTOSC, WDTE_OFF, PWRTE_ON, MCLRE_ON, CP_ON, CPD_ON, BOREN_ON, CLKOUTEN_OFF, IESO_OFF, FCMEN_OFF
- Config2 WRT_OFF, PLLEN_ON, STVREN_OFF,LVP_OFF 'BORV_LO
- Xtal 16
- OSCCON = %01111000
- OPTION_REG = %00000111
- '---------------------------------------
- $define CC1101_IOCFG2 $00 ' GDO2 Output pin configuration
- $define CC1101_IOCFG1 $01 ' GDO1 Output pin configuration
- $define CC1101_IOCFG0 $02 ' GDO0 Output pin configuration
- $define CC1101_FIFOTHR $03 ' RX FIFO And TX FIFO thresholds
- $define CC1101_SYNC1 $04 ' 8 bit msb word SYNC
- $define CC1101_SYNC0 $05 ' 8 bit lsb word SYNC
- $define CC1101_PKTLEN $06
- $define CC1101_PKTCTRL1 $07 ' Packet automation control
- $define CC1101_PKTCTRL0 $08 ' Packet automation control
- $define CC1101_ADDR $09 ' Device address
- $define CC1101_CHANNR $0A ' Channel number 10
- $define CC1101_FSCTRL1 $0B ' Frequency synthesizer control
- $define CC1101_FSCTRL0 $0C ' Frequency synthesizer control
- $define CC1101_FREQ2 $0D ' Frequency control Word, High INT8U
- $define CC1101_FREQ1 $0E ' Frequency control Word, middle INT8U
- $define CC1101_FREQ0 $0F ' Frequency control Word, Low INT8U
- $define CC1101_MDMCFG4 $10 ' Modem configuration
- $define CC1101_MDMCFG3 $11 ' Modem configuration
- $define CC1101_MDMCFG2 $12 ' Modem configuration
- $define CC1101_MDMCFG1 $13 ' Modem configuration
- $define CC1101_MDMCFG0 $14 ' Modem configuration
- $define CC1101_DEVIATN $15 ' Modem deviation setting
- $define CC1101_MCSM2 $16 ' Main Radio Control State Machine configuration
- $define CC1101_MCSM1 $17 ' Main Radio Control State Machine configuration
- $define CC1101_MCSM0 $18 ' Main Radio Control State Machine configuration
- $define CC1101_FOCCFG $19 ' Frequency Offset Compensation configuration
- $define CC1101_BSCFG $1A ' Bit Synchronization configuration
- $define CC1101_AGCCTRL2 $1B ' AGC control
- $define CC1101_AGCCTRL1 $1C ' AGC control
- $define CC1101_AGCCTRL0 $1D ' AGC control
- $define CC1101_WOREVT1 $1E ' High INT8U Event 0 timeout
- $define CC1101_WOREVT0 $1F ' Low INT8U Event 0 timeout
- $define CC1101_WORCTRL $20 ' Wake On Radio control
- $define CC1101_FREND1 $21 ' Front End RX configuration
- $define CC1101_FREND0 $22 ' Front End TX configuration
- $define CC1101_FSCAL3 $23 ' Frequency synthesizer calibration
- $define CC1101_FSCAL2 $24 ' Frequency synthesizer calibration
- $define CC1101_FSCAL1 $25 ' Frequency synthesizer calibration
- $define CC1101_FSCAL0 $26 ' Frequency synthesizer calibration
- $define CC1101_RCCTRL1 $27 ' RC oscillator configuration
- $define CC1101_RCCTRL0 $28 ' RC oscillator configuration
- $define CC1101_FSTEST $29 ' Frequency synthesizer calibration control
- $define CC1101_PTEST $2A ' Production test
- $define CC1101_AGCTEST $2B ' AGC test
- $define CC1101_TEST2 $2C ' Various test settings
- $define CC1101_TEST1 $2D ' Various test settings
- $define CC1101_TEST0 $2E ' Various test settings
- 'CC1101 Strobe commands
- $define CC1101_SRES $30 ' Reset chip.
- $define CC1101_SFSTXON $31 ' Enable And calibrate frequency synthesizer (If MCSM0.FS_AUTOCAL=1).
- ' If in RX/TX: Go To a Wait state where only the synthesizer is
- ' running (For quick RX / TX turnaround).
- $define CC1101_SXOFF $32 ' Turn off crystal oscillator.
- $define CC1101_SCAL $33 ' Calibrate frequency synthesizer And turn it off
- ' (enables quick start).
- $define CC1101_SRX $34 ' Enable RX. Perform calibration first If coming from IDLE And
- ' MCSM0.FS_AUTOCAL=1.
- $define CC1101_STX $35 ' In IDLE state: Enable TX. Perform calibration first If
- ' MCSM0.FS_AUTOCAL=1. If in RX state And CCA is enabled:
- ' Only go To TX If channel is Clear.
- $define CC1101_SIDLE $36 ' Exit RX / TX, turn off frequency synthesizer And exit
- ' Wake-On-Radio mode If applicable.
- $define CC1101_SAFC $37 ' Perform AFC adjustment of the frequency synthesizer
- $define CC1101_SWOR $38 ' Start automatic RX polling sequence (Wake-on-Radio)
- $define CC1101_SPWD $39 ' Enter power down mode when CSn goes High.
- $define CC1101_SFRX $3A ' Flush the RX FIFO buffer.
- $define CC1101_SFTX $3B ' Flush the TX FIFO buffer.
- $define CC1101_SWORRST $3C ' Reset real time clock.
- $define CC1101_SNOP $3D ' No operation. May be used To pad strobe commands To two
- ' INT8Us For simpler software.
- 'CC1101 STATUS REGSITER
- $define CC1101_PARTNUM $30
- $define CC1101_VERSION $31
- $define CC1101_FREQEST $32
- $define CC1101_LQI $33
- $define CC1101_RSSI $34
- $define CC1101_MARCSTATE $35
- $define CC1101_WORTIME1 $36
- $define CC1101_WORTIME0 $37
- $define CC1101_PKTSTATUS $38
- $define CC1101_VCO_VC_DAC $39
- $define CC1101_TXBYTES $3A
- $define CC1101_RXBYTES $3B
- $define WRITE_BURST $40 ;
- $define READ_SINGLE $80 ;
- $define READ_BURST $C0 ;
- $define BYTES_IN_RXFIFO $7F 'Byte number in RXfifo
- 'CC1101 PATABLE,TXFIFO,RXFIFO
- $define CC1101_PATABLE $3E
- $define CC1101_TXFIFO $3F
- $define CC1101_RXFIFO $3F
- '-------Set symbol -------------------------------------------
- Symbol GIE = INTCON.7 ' Global Interrupt Enable
- Symbol PEIE = INTCON.6 ' Peripheral Interrupt Enable
- Symbol RCIE = PIE1.5 ' USART Receive Interrupt Enable
- Symbol RCIF = PIR1.5 ' USART Receive Interrupt flag
- Symbol SCK_PIN = PORTB.4 'SCK1
- Symbol MOSI_PIN = PORTA.1 'SDO1
- Symbol MISO_PIN = PORTA.0 'SDI1
- Symbol SS_PIN = PORTB.5 'SS1
- Symbol GDO0 = PORTB.0
- Symbol GDO2 = PORTB.3
- Symbol Tx_serial = PORTB.7
- Symbol Led = PORTA.4
- Symbol pul = PORTB.6
- '---Set Port----------------------------------------------------
- LATA = %00000000
- LATB = %00000000
- TRISA = %00100001
- TRISB = %01001011 'bit0 GDO0 - bit1 miso input - mosi bit2 out - bit3 GDO2 - clk bit4 out - SS bit5 out
- WPUA = %00100000
- WPUB = %01000000
- CM1CON0.7 = 0
- CM2CON0.7 = 0
- SRCON0.7 = 0
- Clear ANSELA
- Clear ANSELB
- APFCON0 = 0
- APFCON1 = 0
- INTCON = %00000000
- '-----------------Set input output---------------------------------
- Output MOSI_PIN '
- Output SS_PIN '
- Input MISO_PIN '
- Input GDO0 '
- Input GDO2
- '------------------------------------
- Dim rxBuffer[64] As Byte
- Dim x As Byte
- Dim PaTable[8] As Byte '
- Dim addr_SWR As Byte
- Dim Add_PTR As Word
- Dim value_SWR As Byte
- Dim txBuffer[64] As Byte Heap
- Dim add_BurstReg As Byte
- Dim i As Byte
- Dim temp As Byte
- Dim num As Byte
- Dim strobe As Byte
- Dim value_SRR As Byte
- Dim size As Byte
- Dim Ret_Val As Bit
- Dim CC1101_STATUS[2] As Byte
- Str PaTable = $60,$60,$60,$60,$60,$60,$60,$60
- DelayMS 200
- main:
- GoSub CC1101_init '
- GoSub CC1101_SetReceive '
- '-------- Rx Routine -------------------------------------
- rx_routine:
- Toggle Led
- GoSub CC1101_CheckReceiveFlag
- If Ret_Val = 1 Then
- GoSub CC1101_ReceiveData
- For i = 0 To size -1
- SerOut Tx_serial,84,[rxBuffer[i]]
- Next i
- GoSub CC1101_SetReceive
- End If
- GoTo rx_routine
- '----------------------------------------------------------
- CC1101_reset:
- Low SS_PIN '
- DelayMS 1
- High SS_PIN
- DelayMS 1
- Low SS_PIN
- While MISO_PIN = 1 : Wend
- SHOut MOSI_PIN,SCK_PIN,MsbFirst_H,[CC1101_SRES]
- While MISO_PIN = 1 : Wend
- High SS_PIN
- $ifdef test
- SerOut Tx_serial,84,["reset ok"]
- DelayMS 50
- SerOut Tx_serial,84,[CC1101_SRES]
- $endif
- Return
- '--------------------------------------------------------------
- CC1101_init:
- High SS_PIN
- High SCK_PIN
- Low MOSI_PIN
- GoSub CC1101_reset
- GoSub CC1101_RegConfigSettings
- add_BurstReg = CC1101_PATABLE
- Add_PTR = AddressOf(PaTable)
- num = 8
- GoSub CC1101_SpiWriteBurstReg
- $ifdef test
- SerOut Tx_serial,84,["PATABLE OK"]
- $endif
- Return
- '---------------------------------------------------
- CC1101_SpiWriteReg:
- Low SS_PIN
- While MISO_PIN = 1 : Wend
- SHOut MOSI_PIN,SCK_PIN,MsbFirst_H,[addr_SWR]
- SHOut MOSI_PIN,SCK_PIN,MsbFirst_H,[value_SWR]
- High SS_PIN
- Return
- '---------------------------------------------------------------------
- CC1101_SpiWriteBurstReg:
- Low SS_PIN
- While MISO_PIN = 1 : Wend
- 'SHOut MOSI_PIN,SCK_PIN,MsbFirst_H,[add_BurstReg | WRITE_BURST] 'add_BurstReg(3E) | WRITE_BURST($40) = $7E
- SHOut MOSI_PIN,SCK_PIN,MsbFirst_H,[add_BurstReg <PIPE>WRITE_BURST ]
- For i = 0 To num - 1
- value_SRR = Ptr8(Add_PTR++)
- SHOut MOSI_PIN,SCK_PIN,MsbFirst_H,[value_SRR]
- Next i
- High SS_PIN
- Return
- '---------------------------------------------------------
- CC1101_SpiStrobe:
- Low SS_PIN
- While MISO_PIN = 1 : Wend
- SHOut MOSI_PIN,SCK_PIN,MsbFirst_H,[strobe]
- High SS_PIN
- Return
- '----------------------------------------------------------
- CC1101_SpiReadReg:
- Low SS_PIN
- While MISO_PIN = 1 : Wend
- SHOut MOSI_PIN,SCK_PIN,MsbFirst_H,[addr_SWR<PIPE>READ_SINGLE]
- SHIn MISO_PIN,SCK_PIN,MsbPost_H,[value_SRR]
- High SS_PIN
- Return
- '---------------------------------------------------------------
- CC1101_SpiReadStatus:
- Low SS_PIN
- While MISO_PIN = 1 : Wend
- SHOut MOSI_PIN,SCK_PIN,MsbFirst_H,[addr_SWR<PIPE>READ_BURST]'READ_BURST $C0
- SHIn MISO_PIN,SCK_PIN,MsbPost_H,[value_SRR]
- High SS_PIN
- Return
- '----------------------------------------------------------------
- CC1101_SpiReadBurstReg:
- Low SS_PIN
- While MISO_PIN = 1 : Wend
- SHOut MOSI_PIN,SCK_PIN,MsbFirst_H,[add_BurstReg <PIPE>READ_BURST ]
- For i = 0 To num - 1
- SHIn MISO_PIN,SCK_PIN,MsbPost_H,[x]
- Ptr8(Add_PTR++) = x
- Next i
- High SS_PIN
- Return
- '----------------------------------------------------------------
- CC1101_RegConfigSettings:
- addr_SWR = CC1101_FSCTRL1 ' SpiWriteReg(CC1101_FSCTRL1 =%0B, 0x08)
- value_SWR = 0x08
- GoSub CC1101_SpiWriteReg
- addr_SWR = CC1101_FSCTRL0
- value_SWR = 0x00
- GoSub CC1101_SpiWriteReg ' SpiWriteReg(CC1101_FSCTRL0 =$0C, 0x00)
- addr_SWR = CC1101_FREQ2
- value_SWR = 0x10
- GoSub CC1101_SpiWriteReg ' SpiWriteReg(CC1101_FREQ2 =$0D ,0x10)
- addr_SWR = CC1101_FREQ1
- value_SWR = 0xA7
- GoSub CC1101_SpiWriteReg ' SpiWriteReg(CC1101_FREQ1 =$0E,0xA7)
- addr_SWR = CC1101_FREQ0
- value_SWR = 0x62
- GoSub CC1101_SpiWriteReg ' SpiWriteReg(CC1101_FREQ0=$0F,0x62)
- addr_SWR = CC1101_MDMCFG4
- value_SWR = 0x5B
- GoSub CC1101_SpiWriteReg ' SpiWriteReg(CC1101_MDMCFG4=$10,0x5B)
- addr_SWR = CC1101_MDMCFG3
- value_SWR = 0xF8
- GoSub CC1101_SpiWriteReg ' SpiWriteReg(CC1101_MDMCFG3=$11,0xF8)
- addr_SWR = CC1101_MDMCFG2
- value_SWR = 0x03
- GoSub CC1101_SpiWriteReg ' SpiWriteReg(CC1101_MDMCFG2=$12,0x03)
- addr_SWR = CC1101_MDMCFG1
- value_SWR = 0x22
- GoSub CC1101_SpiWriteReg ' SpiWriteReg(CC1101_MDMCFG1=$13,0x22)
- addr_SWR = CC1101_MDMCFG0
- value_SWR = 0xF8
- GoSub CC1101_SpiWriteReg ' SpiWriteReg(CC1101_MDMCFG0=$14,0xF8)
- addr_SWR = CC1101_CHANNR
- value_SWR = 0x00
- GoSub CC1101_SpiWriteReg ' SpiWriteReg(CC1101_CHANNR=$0A,0x00)
- addr_SWR = CC1101_DEVIATN
- value_SWR = 0x47
- GoSub CC1101_SpiWriteReg ' SpiWriteReg(CC1101_DEVIATN=$15,0x47)
- addr_SWR = CC1101_FREND1
- value_SWR = 0xB6
- GoSub CC1101_SpiWriteReg ' SpiWriteReg(CC1101_FREND1=$21,0xB6)
- addr_SWR = CC1101_FREND0
- value_SWR = 0x10
- GoSub CC1101_SpiWriteReg ' SpiWriteReg(CC1101_FREND0=$22,0x10)
- addr_SWR = CC1101_MCSM0
- value_SWR = 0x18
- GoSub CC1101_SpiWriteReg ' SpiWriteReg(CC1101_MCSM0=$18 ,0x18)
- addr_SWR = CC1101_FOCCFG
- value_SWR = 0x1D
- GoSub CC1101_SpiWriteReg ' SpiWriteReg(CC1101_FOCCFG=$19,0x1D)
- addr_SWR = CC1101_BSCFG
- value_SWR = 0x1C
- GoSub CC1101_SpiWriteReg ' SpiWriteReg(CC1101_BSCFG=$1A,0x1C)
- addr_SWR = CC1101_AGCCTRL2
- value_SWR = 0xC7
- GoSub CC1101_SpiWriteReg ' SpiWriteReg(CC1101_AGCCTRL2=$1B,0xC7)
- addr_SWR = CC1101_AGCCTRL1
- value_SWR = 0x00
- GoSub CC1101_SpiWriteReg ' SpiWriteReg(CC1101_AGCCTRL1=$1C,0x00)
- addr_SWR = CC1101_AGCCTRL0
- value_SWR = 0xB2
- GoSub CC1101_SpiWriteReg ' SpiWriteReg(CC1101_AGCCTRL0=$1D,0xB2)
- addr_SWR = CC1101_FSCAL3
- value_SWR = 0xEA
- GoSub CC1101_SpiWriteReg ' SpiWriteReg(CC1101_FSCAL3=$23,0xEA)
- addr_SWR = CC1101_FSCAL2
- value_SWR = 0x2A
- GoSub CC1101_SpiWriteReg ' SpiWriteReg(CC1101_FSCAL2=$24,0x2A)
- addr_SWR = CC1101_FSCAL1
- value_SWR = 0x00
- GoSub CC1101_SpiWriteReg ' SpiWriteReg(CC1101_FSCAL1=$25,0x00)
- addr_SWR = CC1101_FSCAL0
- value_SWR = 0x11
- GoSub CC1101_SpiWriteReg ' SpiWriteReg(CC1101_FSCAL0=$26,0x11)
- addr_SWR = CC1101_FSTEST
- value_SWR = 0x59
- GoSub CC1101_SpiWriteReg ' SpiWriteReg(CC1101_FSTEST=$29,0x59)
- addr_SWR = CC1101_TEST2
- value_SWR = 0x81
- GoSub CC1101_SpiWriteReg ' SpiWriteReg(CC1101_TEST2=$2C,0x81)
- addr_SWR = CC1101_TEST1
- value_SWR = 0x35
- GoSub CC1101_SpiWriteReg ' SpiWriteReg(CC1101_TEST1=2D,0x35)
- addr_SWR = CC1101_TEST0
- value_SWR = 0x09
- GoSub CC1101_SpiWriteReg ' SpiWriteReg(CC1101_TEST0=2E,0x09)
- addr_SWR = CC1101_IOCFG2
- value_SWR = 0x0B
- GoSub CC1101_SpiWriteReg ' SpiWriteReg(CC1101_IOCFG2=$00,0x0B)
- addr_SWR = CC1101_IOCFG0
- value_SWR = 0x06
- GoSub CC1101_SpiWriteReg ' SpiWriteReg(CC1101_IOCFG0=$02,0x06)
- 'two status bytes will be appended to the payload of the packet,
- 'including RSSI LQI and CRC OK
- 'No address check
- addr_SWR = CC1101_PKTCTRL1 '
- '
- value_SWR = 0x04
- GoSub CC1101_SpiWriteReg ' SpiWriteReg(CC1101_PKTCTRL1=$07, 0x04)
- 'whitening offCRC Enable£»variable length packets, packet length configured
- 'by the first byte after sync word
- addr_SWR = CC1101_PKTCTRL0
- value_SWR = 0x05 '
- GoSub CC1101_SpiWriteReg ' SpiWriteReg(CC1101_PKTCTRL0=$08,0x05)
- addr_SWR = CC1101_ADDR 'address used for packet filtration.
- value_SWR = 0x00
- GoSub CC1101_SpiWriteReg ' SpiWriteReg(CC1101_ADDR=$09,0x00)
- addr_SWR = CC1101_PKTLEN
- value_SWR = 0x3D '
- GoSub CC1101_SpiWriteReg '
- '
- SerOut Tx_serial,84,["config ok"] 'For Test
- Return
- '--------------------------------------------------------------------------------
- CC1101_SendData:
- addr_SWR = CC1101_TXFIFO '
- value_SWR = size '
- GoSub CC1101_SpiWriteReg '
- add_BurstReg = CC1101_TXFIFO
- Add_PTR = AddressOf(txBuffer) '
- num = size '
- GoSub CC1101_SpiWriteBurstReg; '
- strobe = CC1101_STX '
- GoSub CC1101_SpiStrobe '
- While GDO0 = 0: Wend '
- While GDO0 = 1: Wend '
- strobe = CC1101_SFTX '
- GoSub CC1101_SpiStrobe ' flush TXfifo
- Return
- '----------------------------------------------------------------------------------
- CC1101_SetReceive:
- strobe = CC1101_SRX '
- GoSub CC1101_SpiStrobe
- Return
- '-------------------------------------------------------------
- CC1101_CheckReceiveFlag: '
- Ret_Val = 0 '
- If GDO0 = 1 Then '
- While GDO0 = 1 : Wend
- Ret_Val = 1
- Return
- End If
- Return
- '---------------------------------------------------------
- CC1101_ReceiveData:
- Ret_Val = 0
- addr_SWR = CC1101_RXBYTES '
- GoSub CC1101_SpiReadStatus '
- value_SRR = value_SRR & BYTES_IN_RXFIFO
- If value_SRR <> 0 Then
- addr_SWR = CC1101_RXFIFO
- GoSub CC1101_SpiReadReg '
- size = value_SRR '
- add_BurstReg = CC1101_RXFIFO
- num = size
- Add_PTR = AddressOf(rxBuffer)
- GoSub CC1101_SpiReadBurstReg '
- Add_PTR = AddressOf(CC1101_STATUS)
- num = 2
- GoSub CC1101_SpiReadBurstReg '
- strobe = CC1101_SFRX '
- GoSub CC1101_SpiStrobe
- Ret_Val = size '
- Else
- strobe = CC1101_SFRX
- GoSub CC1101_SpiStrobe
- Ret_Val = 0
- End If
- Return
Add Comment
Please, Sign In to add comment