اطلاعیه

Collapse
No announcement yet.

مشکل با ماژول nRF24L01+

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    مشکل با ماژول nRF24L01+

    سلام دوستام خسته نباشید!
    من دو تا ماژول nrf24l01 خریدم ولی هنوز نتونستم راشون بندازم!
    ابن برنامه که من نوشتم البته بعضی جاهاش از چجای دیگه برداشتم!میشه اشکالاتشو بهم بگید!
    قسمت فرستنده:
    کد:
    $regfile = "M16def.dat"
    $crystal = 8000000
    
    
    '=== Declare sub routines
    Declare Sub W_register(byval C_bytes As Byte)
    
    '=== Constante ===
    'Define nRF24L01 interrupt flag's
    Const Tx_ds = &H20                     'Tx Data Sent Interrupt
    Const Rx_dr = &H40                     'Rx Data Received
    'SPI(nRF24L01) commands
    Const Read_reg = &H00                    'Define Read Command To Register
    Const Write_reg = &H20                   'Define Write Command To Register
    Const Rd_rx_pload = &H61                  'Define Rx Payload Register Address
    Const Wr_tx_pload = &HA0                  'Define Tx Payload Register Address
    Const Flush_tx = &HE1                    'Define Flush Tx Register Command
    Const Flush_rx = &HE2
    'SPI(nRF24L01) registers(addresses)
    Const Config_nrf = &H00                   'Config' register address
    Const En_aa = &H01                     'Enable Auto Acknowledgment' register address
    Const En_rxaddr = &H02                   'Enabled RX addresses' register address                  'Setup Auto. Retrans' register address
    Const Rf_ch = &H05                     'RF channel' register address
    Const Rf_setup = &H06                    'RF setup' register address                    'Status' register address
    Const Rx_addr_p0 = &H0A                   'RX address pipe0' register address
    Const Tx_addr = &H10                    'TX address' register address
    Const Rx_pw_p0 = &H11                    'RX payload width, pipe0' register address
    Const Fifo_status = &H17                  'FIFO Status Register' register address
    
    
    '=== Config hardware ===
    Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 4 , Noss = 1
    
    Config Pinc.5 = Output                   'CE pin is output
    Config Pinb.4 = Output                   'SS pin is output
    Config Pinc.4 = Input                    'IRQ pin is input
    Config Pinc.3 = Input
    
    Config Pind.1 = Output                   'IRQ pin is input
    Config Pind.2 = Input
    Config Pind.3 = Input
                       'TX/RX Device _select
    Ce Alias Portc.5
    Ss Alias Portb.4
    Spiinit                           'init the spi pins
    Set Ce
    Waitms 10                          'Wait a moment until all hardware is stable
    Reset Ce                          'Set CE pin low
    Reset Ss                          'Set SS pin low (CSN pin)
    Dim D_bytes(33) As Byte , B_bytes(33) As Byte        'Dim the bytes use for SPI, D_bytes = outgoing B_bytes = Incoming
    
    Set Portd.1
    Waitms 500
    Reset Portd.1
    
    
    D_bytes(1) = Flush_tx                    'Flush the TX_fifo buffer
    Call W_register(1)
    
    Do
    
    If Pind.2 = 1 Then
    
    Set Portd.1
    Waitms 500
    Reset Portd.1
                         'Main loop for TX
    Gosub Setup_tx                       'Setup the nrf240l01 for TX
    
    D_bytes(1) = Wr_tx_pload                  'Put 5 bytes in the TX pload buffer
    D_bytes(2) = &HAA
    D_bytes(3) = &HCC
    Call W_register(3)
    Waitms 500
    
    Waitms 2
    Set Ce                           'Set CE for a short moment to transmit the fifo buffer
    Waitms 1                          '
    Reset Ce                          '
    Waitms 100                         'Some delay to read the output on the terminal, line can be removed for max. speed
    
    Set Portd.1
    Waitms 500
    Reset Portd.1
    
    End If
    
    
    
    If Pind.3 = 1 Then
    
    Set Portd.1
    Waitms 500
    Reset Portd.1
                         'Main loop for TX
    Gosub Setup_tx                       'Setup the nrf240l01 for TX
    
    D_bytes(1) = Wr_tx_pload                  'Put 5 bytes in the TX pload buffer
    D_bytes(2) = &HCC
    D_bytes(3) = &HBB
    Call W_register(3)
    Waitms 500
    
    Waitms 2
    Set Ce                           'Set CE for a short moment to transmit the fifo buffer
    Waitms 1                          '
    Reset Ce                          '
    Waitms 100                         'Some delay to read the output on the terminal, line can be removed for max. speed
    
    Set Portd.1
    Waitms 500
    Reset Portd.1
    
    End If
    
    Loop
    
    
    '=== Sub routines ===
    Sub W_register(byval C_bytes As Byte)            'Write register with SPI
    Reset Ss                          'Manual control SS pin, set SS low before shifting out the bytes
      Spiout D_bytes(1) , C_bytes               'Shiftout the data bytes trough SPI , C_bytes is the amount bytes to be written
    Set Ss                           'Set SS high
    End Sub
    
    
    Setup_tx:                          'Setup for TX
    D_bytes(1) = Write_reg + Tx_addr              'TX adress
    D_bytes(2) = &H34
    D_bytes(3) = &H43
    D_bytes(4) = &H10
    D_bytes(5) = &H10
    D_bytes(6) = &H01
    Call W_register(6)
    D_bytes(1) = Write_reg + Rx_addr_p0             'RX adress for pipe0
    D_bytes(2) = &H34
    D_bytes(3) = &H43
    D_bytes(4) = &H10
    D_bytes(5) = &H10
    D_bytes(6) = &H01
    Call W_register(6)
    D_bytes(1) = Write_reg + En_aa               'Enable auto ACK for pipe0
    D_bytes(2) = &H01
    Call W_register(2)
    D_bytes(1) = Write_reg + En_rxaddr             'Enable RX adress for pipe0
    D_bytes(2) = &H01
    Call W_register(2)
    D_bytes(1) = Write_reg + Rf_ch               'Set RF channel
    D_bytes(2) = 40
    Call W_register(2)
    D_bytes(1) = Write_reg + Rf_setup              'Setup RF-> Output power 0dbm, datarate 2Mbps and LNA gain on
    D_bytes(2) = &H0F
    Call W_register(2)
    D_bytes(1) = Write_reg + Config_nrf             'Setup CONFIG-> PRX=0(TX_device), PWR_UP=1, CRC 2bytes, Enable CRC
    D_bytes(2) = &H0E
    Call W_register(2)
    Return

    قسمت گیرنده:
    کد:
    $regfile = "M16def.dat"
    $crystal = 8000000
    
    
    '=== Declare sub routines
    Declare Sub R_register(byval Command As Byte , Byval C_bytes As Byte)
    Declare Sub W_register(byval C_bytes As Byte)
    
    '=== Constante ===
    'Define nRF24L01 interrupt flag's
    Const Tx_ds = &H20                     'Tx Data Sent Interrupt
    Const Rx_dr = &H40                     'Rx Data Received
    'SPI(nRF24L01) commands
    Const Read_reg = &H00                    'Define Read Command To Register
    Const Write_reg = &H20                   'Define Write Command To Register
    Const Rd_rx_pload = &H61                  'Define Rx Payload Register Address
    Const Wr_tx_pload = &HA0                  'Define Tx Payload Register Address
    Const Flush_tx = &HE1                    'Define Flush Tx Register Command
    Const Flush_rx = &HE2
    'SPI(nRF24L01) registers(addresses)
    Const Config_nrf = &H00                   'Config' register address
    Const En_aa = &H01                     'Enable Auto Acknowledgment' register address
    Const En_rxaddr = &H02                   'Enabled RX addresses' register address
    Const Setup_retr = &H04                   'Setup Auto. Retrans' register address
    Const Rf_ch = &H05                     'RF channel' register address
    Const Rf_setup = &H06
    Const Status = &H07                     'RF setup' register address                    'Status' register address
    Const Rx_addr_p0 = &H0A                   'RX address pipe0' register address
    Const Tx_addr = &H10                    'TX address' register address
    Const Rx_pw_p0 = &H11                    'RX payload width, pipe0' register address
    Const Fifo_status = &H17                  'FIFO Status Register' register address
    
    
    
    
    
    
    
    '=== Config hardware ===
    Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 4 , Noss = 1
    
    
    Config Pinc.5 = Output                   'CE pin is output
    Config Pinb.4 = Output                   'SS pin is output
    Config Pinc.4 = Input                    'IRQ pin is input
    Config Pinc.3 = Input
    
    Config Pind.1 = Output                   'IRQ pin is input
    
    Ce Alias Portc.5
    Ss Alias Portb.4
    Spiinit                           'init the spi pins
    Set Ce
    Waitms 10                          'Wait a moment until all hardware is stable
    Reset Ce                          'Set CE pin low
    Reset Ss                          'Set SS pin low (CSN pin)
    Dim D_bytes(33) As Byte , B_bytes(33) As Byte        'Dim the bytes use for SPI, D_bytes = outgoing B_bytes = Incoming
    
    Set Portd.1
    Waitms 500
    Reset Portd.1
    Waitms 2000
    Set Portd.1
    Waitms 500
    Reset Portd.1
    Waitms 100
    
    
    Main:
    
                        'Send to terminal who i'm
    Reset Ce                          'Set CE low to access the registers
    Gosub Setup_rx                       'Setup the nRF24L01 for RX
    Waitms 2                          'Add a delay before going in RX
    Set Ce
    
    Set Portd.1
    Waitms 500
    Reset Portd.1
    Waitms 500
                              'Set nRF20L01 in RX mode
    Do
    If Pinc.4 = 0 Then
    Set Portd.1
    Waitms 2000
    Reset Portd.1
    Waitms 500                         'Main loop for RX                       'Wait until IRQ occurs, pin becomes low on interrupt
      Reset Ce                        'Receiver must be disabled before reading pload                       'Loop until all 3 fifo buffers are empty
       Call R_register(rd_rx_pload , 3)           'Read 5 bytes RX pload register
       Print B_bytes(1)
       If B_bytes(2) = &HAA Then
       Set Portd.1
       Waitms 500
       End If
    
       If B_bytes(3) = &HBB Then
       Reset Portd.1
       Waitms 500
       End If
    
       Call R_register(fifo_status , 1)           'Read FIFO_STATUS             'Test or RX_EMPTY bit is true, RX FIFO empty
      D_bytes(1) = Write_reg + Status             'Reset the RX_DR status bit
      D_bytes(2) = &B01000000                 'Write 1 to RX_DR bit to reset IRQ
      Call W_register(2)
      Set Ce                         'Enable receiver again
      Waitms 2
      End If
    Loop                            'Some delay to read the output on the terminal, line can be removed for max. speed
    
    
    
    
    
    
    '=== Sub routines ===
    Sub W_register(byval C_bytes As Byte)            'Write register with SPI
    Reset Ss                          'Manual control SS pin, set SS low before shifting out the bytes
      Spiout D_bytes(1) , C_bytes               'Shiftout the data bytes trough SPI , C_bytes is the amount bytes to be written
    Set Ss                           'Set SS high
    End Sub
    
    
    Sub R_register(byval Command As Byte , Byval C_bytes As Byte) As Byte    'C_bytes = Count_bytes, number off bytes to be read
    Reset Ss                          'Manual controle SS pin, set low before shifting in/out the bytes
      Spiout Command , 1                   'First shiftout the register to be read
      Spiin B_bytes(1) , C_bytes               'Read back the bytes from SPI sended by nRF20L01
    Set Ss                           'Set SS back to high level
    End Sub
    
    
    
    Setup_rx:                          'Setup for RX
    D_bytes(1) = Write_reg + Rx_addr_p0             'RX adress for pipe0
    D_bytes(2) = &H34
    D_bytes(3) = &H43
    D_bytes(4) = &H10
    D_bytes(5) = &H10
    D_bytes(6) = &H01
    Call W_register(6)                     'Send 6 bytes to SPI
    D_bytes(1) = Write_reg + En_aa               'Enable auto ACK for pipe0
    D_bytes(2) = &H01
    Call W_register(2)
    D_bytes(1) = Write_reg + En_rxaddr             'Enable RX adress for pipe0
    D_bytes(2) = &H01
    Call W_register(2)
    D_bytes(1) = Write_reg + Rf_ch               'Set RF channel
    D_bytes(2) = 40
    Call W_register(2)
    D_bytes(1) = Write_reg + Rx_pw_p0              'Set RX pload width for pipe0
    D_bytes(2) = 5
    Call W_register(2)
    D_bytes(1) = Write_reg + Rf_setup              'Setup RF-> Output power 0dbm, datarate 2Mbps and LNA gain on
    D_bytes(2) = &H0F
    Call W_register(2)
    D_bytes(1) = Write_reg + Config_nrf             'Setup CONFIG-> PRX=1(RX_device), PWR_UP=1, CRC 2bytes, Enable CRC
    D_bytes(2) = &H0F
    Call W_register(2)
    
    Set Portd.1
    Waitms 500
    Reset Portd.1
    Waitms 500
    Set Portd.1
    Waitms 500
    Reset Portd.1
    Waitms 500
    
    Return
    اگه میشه اشکالاتشو بگین
    اميدوارم خدا پنجره باز اتاقتون باشه!
لطفا صبر کنید...
X