Hello to everybody,
I'm trying to build a 2.4GHz communication module via an AVR controller (whatever with at least 4KB memory)
and I've seen a nice project on CYWUSB6935 at ELEKTOR...
The IC isn't only a transceiver. It has a Receive Signal Strength Indicator feature...
And this is what I'm going to show here in this example code:
' --------[ Device Config]----------------------------------------------------
$regfile = "m8535.dat"
$crystal = 16000000
$baud = 9600
' --------[ LCD Config ]------------------------------------------------------
Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.5
Config Lcdpin = Pin , Db7 = Portc.4 , E = Portc.1 , Rs = Portc.0
Config Lcd = 20 * 4
' --------[ SPI Config ]------------------------------------------------------
Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 1 , Clockrate = 16 , Noss = 1
' --------[ General Port Config ]---------------------------------------------
Config Portb = Output
Config Portb.2 = Input
' --------[ Port Sympolic Name ]----------------------------------------------
Resetline Alias Portb.0
Ss Alias Portb.4
' --------[ Constants ]-------------------------------------------------------
Const Reg_id = &H00
Const Reg_control = &H03
Const Reg_data_rate = &H04
Const Reg_config = &H05
Const Reg_serdes_ctl = &H06
Const Reg_rx_int_en = &H07
Const Reg_rx_int_stat = &H08
Const Reg_rx_data_a = &H09
Const Reg_rx_valid_a = &H0A
Const Reg_rx_data_b = &H0B
Const Reg_rx_valid_b = &H0C
Const Reg_tx_int_en = &H0D
Const Reg_tx_int_stat = &H0E
Const Reg_tx_data = &H0F
Const Reg_tx_valid = &H10
Const Reg_pn_code = &H11
Const Reg_threshold_l = &H19
Const Reg_threshold_h = &H1A
Const Reg_wake_en = &H1C
Const Reg_wake_stat = &H1D
Const Reg_analog_ctl = &H20
Const Reg_channel = &H21
Const Reg_rssi = &H22
Const Reg_pa = &H23
Const Reg_crystal_adj = &H24
Const Reg_vco_cal = &H26
Const Reg_pwr_ctl = &H2E
Const Reg_carrier_detect = &H2F
Const Reg_clock_manual = &H32
Const Reg_clock_enable = &H33
Const Reg_syn_lock_cnt = &H38
Const Reg_mid = &H3C
' --------[ Variables ]-------------------------------------------------------
Dim Brust As Bit
Dim Rw_select As Bit
Dim Address As Byte
Dim Carrier(8) As Byte
Dim Rssi_sample As Byte
Dim Channel As Byte
Dim I As Byte , J As Byte
Dim Bytenum As Byte
Dim Sum As Word
' --------[ Initialize ]------------------------------------------------------
Resetline = 1
' Set reset line to logic high to enable the IC
Ss = 1
' Set SS line to logic high to avoid data float
Brust = 0
Rw_select = 0
Address = 0
For I = 1 To 8
Carrier(i) = 0
Next
' Set everything variable to zero to avoid possible float
' LCD messaging
Cls
Cursor Off
Lcd " CYWUSB6935 Report "
' Initialize SPI
Spiinit
' --------[ Main Program ]----------------------------------------------------
Do
J = 1
For Channel = 20 To 39
Gosub Channel_set
Gosub Rssi
Locate 2 , J : Lcd Rssi_sample ; " "
J = J + 2
Next
Waitms 100
Loop
End ' End
' --------[ SubRoutines ]-----------------------------------------------------
Address_up:
' Check for Brust SPI mode
If Brust = 1 Then
Address = Address + 64
End If
' Check for Read/Write sequence
' If 0 then Read command is issued
' If 1 then Write command is issued
If Rw_select = 1 Then
Address = Address + 128
End If
Return ' Return
Spi_read:
' Read the device
Ss = 0
' Set SS line low since it's disabled from the hardware SPI
Spiout Address , 1
' Send the address to the CYWUSB6935
' Note that the command bits 6 and 7 are controller via the
' Address_up subroutine
Spiin Carrier(1) , Bytenum
' Read what is sent to the AVR
' The number of bytes received is determined by Bytenum variable
Ss = 1
' Set SS line to logic high and stop any transaction
Return ' Return
Spi_write:
' Write to the device
Ss = 0
' Set SS line low since it's disabled from the hardware SPI
Spiout Address , 1
' Send the address to the CYWUSB6935
' Note that the command bits 6 and 7 are controller via the
' Address_up subroutine
Spiout Carrier(1) , Bytenum
' Write some bytes to the device
' The number of bytes sent is determined by Bytenum variable
Ss = 1
' Set SS line to logic high and stop any transaction
Return ' Return
Get_pn_code:
' Reading the PN Code
' Set the variables for "PN Code" register reading
Brust = 1
' Brust = 1 because we read 8 bytes in one circle
Rw_select = 0
' We READ the pn code
Bytenum = 8
' Eight bytes to read
Address = Reg_pn_code
' See constant table above
' Issue everything needed to read the device
' and the certain register
Gosub Address_up
Gosub Spi_read
' LCD messaging
Lowerline
Lcd "PN: "
For I = 8 To 1 Step -1
Lcd Hex(carrier(i))
Next
Return 'Return
Read_analog_contol:
' Reading the analog control register
' Set the variables for this task
Brust = 0
' Only one byte to read
Rw_select = 0
' We READ the analog control register
Bytenum = 1
' One byte to read
Address = Reg_analog_ctl
' See constant table above
' Issue everything needed to read the device
' and the certain register
Gosub Address_up
Gosub Spi_read
' LCD messaging
Thirdline
Lcd "An Cont: " ; Bin(carrier(1))
Return
Write_analog_contol:
' Writing to the analog control register
' Set the variables for this task
Brust = 0
' Only one byte to write
Rw_select = 1
' We WRITE the analog control register
Bytenum = 1
' One byte to read
Address = Reg_analog_ctl
' See constant table above
' Issue everything needed to read the device
' and the certain register
Gosub Address_up
Gosub Spi_write
Return ' return
Read_carrier_detect:
' Reading the carrier control register
' Set the variables for this task
Brust = 0
' Only one byte to read
Rw_select = 0
' We READ the analog control register
Bytenum = 1
' One byte to read
Address = Reg_carrier_detect
' See constant table above
' Issue everything needed to read the device
' and the certain register
Gosub Address_up
Gosub Spi_read
' LCD messaging
Fourthline
Lcd "Car Det: " ; Bin(carrier(1))
Return ' Return
Write_carrier_detect:
' Writing to the carrier control register
' Set the variables for this task
Brust = 0
' Only one byte to write
Rw_select = 1
' We WRITE the analog control register
Bytenum = 1
' One byte to read
Address = Reg_carrier_detect
' See constant table above
' Issue everything needed to read the device
' and the certain register
Gosub Address_up
Gosub Spi_write
Return ' Return
Channel_set:
' Writing to the channel register
' Set the variables for this task
Brust = 0
' Only one byte to write
Rw_select = 1
' We WRITE the channel register
Bytenum = 1
' One byte to write
Address = Reg_channel
' See constant table above
Carrier(1) = Channel
' The byte sent is the Channel number setted above
' Issue everything needed to read the device
' and the certain register
Gosub Address_up
Gosub Spi_write
Return ' Return
Rssi:
' Receive Signal Strength Indicator
' First access analog control to permit writing to
' the carrier detect register.
' In this register we enable the receiver of the IC
Carrier(1) = &B01000000
' Set Reg Write Control to 1
Gosub Write_analog_contol
Sum = 0
For I = 1 To 20
Gosub Receive_mode_on
Brust = 0
' Only one byte to write
Rw_select = 0
' We READ the RSSI register
Bytenum = 1
' One byte to read
Address = Reg_channel
' See constant table above
Gosub Address_up
Gosub Spi_read
If Carrier(1) < 32 Then
Carrier(1) = &B10000000
Gosub Write_carrier_detect
Waitus 55
Brust = 0
' Only one byte to write
Rw_select = 0
' We READ the RSSI register
Bytenum = 1
' One byte to read
Address = Reg_channel
' See constant table above
Gosub Address_up
Gosub Spi_read
Carrier(1) = Carrier(1) - 32
Sum = Sum + Carrier(1)
Carrier(1) = &B00000000
Gosub Write_carrier_detect
Else
Carrier(1) = Carrier(1) - 32
Sum = Sum + Carrier(1)
End If
Gosub Receive_mode_off
Next
Rssi_sample = Sum / 20
Return ' Return
Receive_mode_on:
Carrier(1) = &B10000000
' Set the variables for this task
Brust = 0
' Only one byte to write
Rw_select = 1
' We WRITE the channel register
Bytenum = 1
' One byte to read
Address = Reg_control
' See constant table above
Gosub Address_up
Gosub Spi_write
Return 'Return
Receive_mode_off:
Carrier(1) = &B00000000
' Set the variables for this task
Brust = 0
' Only one byte to write
Rw_select = 1
' We WRITE the channel register
Bytenum = 1
' One byte to read
Address = Reg_control
' See constant table above
Gosub Address_up
Gosub Spi_write
Return 'Return
The thing is that this code supports a 20x4 LCD...
I need a GLCD so anyone finding something good on e-bay can be very very helpful...
Thanks in advance,
Lefteris