سلام دوستام خسته نباشید!
من دو تا ماژول 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