سلام دوستام خسته نباشید!
من دو تا ماژول nrf24l01 خریدم ولی هنوز نتونستم راشون بندازم!
ابن برنامه که من نوشتم البته بعضی جاهاش از جای دیگه برداشتم!میشه اشکالاتشو بهم بگید!
الان هر چقدر امتحان میگنم اطلاعات ارسال نمیشه!!!
قسمت فرستنده:
من دو تا ماژول nrf24l01 خریدم ولی هنوز نتونستم راشون بندازم!
ابن برنامه که من نوشتم البته بعضی جاهاش از جای دیگه برداشتم!میشه اشکالاتشو بهم بگید!
الان هر چقدر امتحان میگنم اطلاعات ارسال نمیشه!!!
قسمت فرستنده:
کد:
'/http://avrproject.ru '/2012 $regfile = "M16def.dat" $crystal = 16000000 $hwstack = 40 $swstack = 20 $framesize = 40 '=== 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 Idle_int = &H00 'Idle, no interrupt pending Const Max_rt = &H10 'Max #of Tx Retrans Interrupt 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 'Define Flush Rx Register Command Const Reuse_tx_pl = &HE3 'Define Reuse Tx Payload Register Command Const Nop_comm = &HFF 'Define No Operation , Might Be Used To Read Status Register '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_aw = &H03 'Setup address width' register address Const Setup_retr = &H04 'Setup Auto. Retrans' register address Const Rf_ch = &H05 'RF channel' register address Const Rf_setup = &H06 'RF setup' register address Const Status = &H07 'Status' register address Const Observe_tx = &H08 'Observe TX' register address Const Cd = &H09 'Carrier Detect' register address Const Rx_addr_p0 = &H0A 'RX address pipe0' register address Const Rx_addr_p1 = &H0B 'RX address pipe1' register address Const Rx_addr_p2 = &H0C 'RX address pipe2' register address Const Rx_addr_p3 = &H0D 'RX address pipe3' register address Const Rx_addr_p4 = &H0E 'RX address pipe4' register address Const Rx_addr_p5 = &H0F 'RX address pipe5' register address Const Tx_addr = &H10 'TX address' register address Const Rx_pw_p0 = &H11 'RX payload width, pipe0' register address Const Rx_pw_p1 = &H12 'RX payload width, pipe1' register address Const Rx_pw_p2 = &H13 'RX payload width, pipe2' register address Const Rx_pw_p3 = &H14 'RX payload width, pipe3' register address Const Rx_pw_p4 = &H15 'RX payload width, pipe4' register address Const Rx_pw_p5 = &H16 'RX payload width, pipe5' register address Const Fifo_status = &H17 'FIFO Status Register' register address Dim D_bytes(33) As Byte , B_bytes(33) As Byte 'Dim the bytes use for SPI, D_bytes = outgoing B_bytes = Incoming Dim Temp As Byte , W As Word Dim Packet_count As Byte '=== Config hardware === Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 16 , Noss = 1 'Software SPI is NOT working with the nRF24L01, use hardware SPI only, but the SS pin must be controlled by our self Config Pinb.0 = Output 'CE pin is output Config Pinb.4 = Output 'SS pin is output Config Pinc.5 = Input 'IRQ pin is input Ce Alias Portb.0 Ss Alias Portb.4 Irq Alias Pinc.5 'ïîäêëþ÷åíèå ñâåòîäèîäîâ èíäèêàöèè Config Portd.1 = Output Config Portd.2 = Output Red_led Alias Portd.3 Green_led Alias Portd.4 'ïîäêëþ÷åíèå äàò÷èêà '==================================================================================== Dim Byte0 As Byte Dim Byte1 As Byte Dim Sign As String * 1 Dim T As Byte Dim T1 As Byte Dim T2 As Byte '================================================================================== Red_led = 1 Green_led = 1 Waitms 20 Red_led = 0 Green_led = 0 Waitms 60 Red_led = 1 Green_led = 1 Waitms 20 Red_led = 0 Green_led = 0 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) Red_led = 1 D_bytes(1) = Flush_tx 'Flush the TX_fifo buffer Call W_register(1) D_bytes(1) = Write_reg + Status 'Reset the IRQ bits D_bytes(2) = &B00110000 Call W_register(2) Red_led = 0 T1 = 10 Do '============================================================================== 'ïîäãîòîâêà äàííûõ 'îïðîñ äàò÷èêà '============================================================================== 'Main loop for TX Green_led = 1 Incr Packet_count 'Increase the send packet counter, for test only If Packet_count > 254 Then Packet_count = 0 Gosub Setup_tx 'Setup the nrf24l01 for TX D_bytes(1) = Wr_tx_pload 'Put 5 bytes in the TX pload buffer D_bytes(2) = T1 'Byte 1 - îòïðàâëÿåìàÿ òåìïåðàòóðà D_bytes(3) = &HBB 'Byte 2 - îñòàëüíûå 4 áàéòà ìîæíî òàêæå èñïîëüçîâàòü â ñâîèõ öåëÿõ D_bytes(4) = &HCC 'Byte 3 D_bytes(5) = &H11 'Byte 4 D_bytes(6) = Packet_count 'Byte 5 Call W_register(6) 'Write 6 bytes to register 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 W = 0 'Counter for time out Do Red_led = 1 If Irq = 0 Then Call R_register(status , 1) Temp = B_bytes(1) And &B01110000 'Mask the IRQ bits out the status byte Select Case Temp 'Which IRQ occurs Case Max_rt 'MAX_RT Print "Maximum number of TX retries, Flushing the TX buffer now !" D_bytes(1) = Flush_tx 'Flush the TX buffer Call W_register(1) D_bytes(1) = Write_reg + Status D_bytes(2) = &B00010000 'Clear the MAX_RT IRQ bit Call W_register(2) Waitms 10 Red_led = 0 Exit Do Case Tx_ds 'TX_DS Print "Packet " ; Packet_count ; " send and ACK received." D_bytes(1) = Write_reg + Status D_bytes(2) = &B00100000 'Clear the TX_DS IRQ bit Call W_register(2) Waitms 10 Red_led = 0 Exit Do Case Else 'Other IRQ ?? Print "Other irq " ; Bin(temp) D_bytes(1) = Flush_tx 'Flush the TX buffer Call W_register(1) D_bytes(1) = Write_reg + Status D_bytes(2) = &B00110000 'Clear both MAX_RT, TX_DS bits Call W_register(2) End Select End If Waitms 1 'Time out waiting for IRQ 1ms * 100 Incr W 'Increment W If W > 200 Then 'Waited for 200ms Print "No irq response from RF24L01 within 100ms" Exit Do 'Exit the wait loop End If Loop Red_led = 0 Wait 1 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 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_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
دیدگاه