lastdownxxl
User
Hallo,
ich bin gerade am entwickeln einer Telemetrie basierend auf dem nRF24L01+ Transceiver (2.4 gHz). Das Ziel ist eine möglichst kostengünstige
drahtlose Datenübertragung. Anwendung sind meine alte BMW R80 ST (Oeltemp. und Batteriespannung drahtlos an den Lenker)
sowie meine Elektrosegler mit dem alten Futaba FASST System. Heute hab ich die ersten HW/SW Test mit dem 2.4 GHz NRF24L01+
Funkmodul gemacht. Mit dem nRF24L01 Transceiver wird über das SPI Interface kommuniziert.
Das Schreiben und Lesen von Registern geht schon mal, zudem mit einer eigenen SPI Routine. Verwendet hab ich einen PIC16F690 für die ersten Tests. Er hat auch einen HW SPI. Für den ersten Test hab ich den HW SPI sowie meine eigene SPI Funktion verwendet. Mit der eigenen SPI Routine kann ich dann mit z. B. einem PIC 12F683 (8 Pins) eine Datenübertragung z. B. der Akkuspannung realisieren. Als Monitor zum lesen der Register verwende ich ein LCD Display als InOpMonitor. Die SW ist mit gcbasic geschrieben.
Siehe auch mein Post http://www.rc-network.de/forum/showthread.php/630243-LiPo-LiFePo-Monitor-mit-PIC16F1705
Datenblatt nRF24L01+ http://www.nordicsemi.com/eng/conte.../file/nRF24L01P_Product_Specification_1_0.pdf
Weitere Details werden folgen.
Gruss Micha
ich bin gerade am entwickeln einer Telemetrie basierend auf dem nRF24L01+ Transceiver (2.4 gHz). Das Ziel ist eine möglichst kostengünstige
drahtlose Datenübertragung. Anwendung sind meine alte BMW R80 ST (Oeltemp. und Batteriespannung drahtlos an den Lenker)
sowie meine Elektrosegler mit dem alten Futaba FASST System. Heute hab ich die ersten HW/SW Test mit dem 2.4 GHz NRF24L01+
Funkmodul gemacht. Mit dem nRF24L01 Transceiver wird über das SPI Interface kommuniziert.
Das Schreiben und Lesen von Registern geht schon mal, zudem mit einer eigenen SPI Routine. Verwendet hab ich einen PIC16F690 für die ersten Tests. Er hat auch einen HW SPI. Für den ersten Test hab ich den HW SPI sowie meine eigene SPI Funktion verwendet. Mit der eigenen SPI Routine kann ich dann mit z. B. einem PIC 12F683 (8 Pins) eine Datenübertragung z. B. der Akkuspannung realisieren. Als Monitor zum lesen der Register verwende ich ein LCD Display als InOpMonitor. Die SW ist mit gcbasic geschrieben.
Siehe auch mein Post http://www.rc-network.de/forum/showthread.php/630243-LiPo-LiFePo-Monitor-mit-PIC16F1705
Datenblatt nRF24L01+ http://www.nordicsemi.com/eng/conte.../file/nRF24L01P_Product_Specification_1_0.pdf
Weitere Details werden folgen.
Gruss Micha
Code:
' nRF24L01 Test 1
' 13.09.2017
' ------------
' V+ -| 1 20 |- GND
' PORTA.5 -| 2 19 |- PORTA.0 SER_OUT
' PORTA.4 -| 3 18 |- PORTA.1
' PORTA.3 -| 4 17 |- PORTA.2
' PORTC.5 -| 5 16 |- PORTC.0
' PORTC.4 -| 6 15 |- PORTC.1
' PORTC.3 __ -| 7 14 |- PORTC.2
' PORTC.6 SS -| 8 13 |- PORTB.4 SDI
' PORTC.7 SDO -| 9 12 |- PORTB.5
' PORTB.7 CE -| 10 11 |- PORTB.6 SCK
' ------------
'
' nRF24L01 Pins top view
' ---------------------------------------
' | GND 1 * * 2 V3.3P __ |
' | CE 3 * * 4 CSN (SS) |
' | SCK 5 * * 6 MOSI (SDO) |
' | MISO (SDI) 7 * * 8 IRQ |
' | |
' | ------ |
' | |Quarz | |
' | ------ |
' ---------------------------------------
#chip 16F690,8
#config OSC=INTRC_OSC_NOCLKOUT, PWRTE = ON
#include "C:\gcbasic_src\software_uart_v11.h"
#include "nRF24L01.h"
'nRF24L01 Settings
#define STANDBY_I 0b01111010 'Power up, Interrupt's disabled
'Serial settings
#define BAUD_RATE 2400
#define SER_OUT PORTA.0
dir SER_OUT out
'SPI settings
#define SDO PORTC.7
dir SDO out
#define SDI PORTB.4
dir SDI in
#define SS PORTC.6
dir SS out
#define SCK PORTB.6
dir SCK out
#define CE PORTB.7
dir CE out
dim NRF_Status,Dummy as byte
NRF_Status = 0
Dummy = 0
wait 1 s
LCD_Clear
SerPrint("Test 1.1")
wait 2 s
LCD_Clear
POWER_UP
READ_REG(CONFIG)
LCD_Clear
print_byte(Dummy) 'should be 122 eq. 0b01111010
wait 2 s
Do
set SS on
set SS off
NRF_Status = spi_transfer(WL_NOP) 'Status reg. page 55
set SS on
LCD_Clear
print_byte(NRF_Status) 'should be 14 eq. 0b00001110
wait 1 s
Loop
'------------------------------------ subs ---------------------------------------
'SPI_CPOL = 0 & SPI_CPHA = 0
function spi_transfer(in Dout as byte) as byte
dim Din as byte 'Input Data from nRF24L01
Din = 0
set SCK off
set SDO off
Repeat 8
rlf Dout,f 'equ. Dout << 1
if (Carry = 1) then set SDO on
if (Carry = 0) then set SDO off
set SCK on
wait 8 us
Din = Din * 2 'equ. Din << 1
if (SDI = 1) then Din = Din + 1
set SCK off
End Repeat
spi_transfer = Din
end function
'---------------------------------------------------------------------------------
sub POWER_UP 'Standby Mode I
WRITE_REG(CONFIG,STANDBY_I)
wait 2 ms 'nRF24L01 is in Standby Mode I
end sub
'---------------------------------------------------------------------------------
'Read content of a 1 byte register
sub READ_REG(in Register as byte)
set SS on
set SS off
Dummy = spi_transfer(R_REGISTER + Register)
Dummy = spi_transfer(R_REGISTER)
set SS on
end sub
'---------------------------------------------------------------------------------
'Write 1 byte to register
sub WRITE_REG(in Register as byte,in Data as byte)
set SS on
set SS off
Dummy = spi_transfer(W_REGISTER + Register)
Dummy = spi_transfer(Data)
set SS on
end sub
Code:
' nRF24L01 Test 2, HW SPI used
' 13.09.2017
' ------------
' V+ -| 1 20 |- GND
' PORTA.5 -| 2 19 |- PORTA.0 SER_OUT
' PORTA.4 -| 3 18 |- PORTA.1
' PORTA.3 -| 4 17 |- PORTA.2
' PORTC.5 -| 5 16 |- PORTC.0
' PORTC.4 -| 6 15 |- PORTC.1
' PORTC.3 __ -| 7 14 |- PORTC.2
' PORTC.6 SS -| 8 13 |- PORTB.4 SDI
' PORTC.7 SDO -| 9 12 |- PORTB.5
' PORTB.7 CE -| 10 11 |- PORTB.6 SCK
' ------------
'
' nRF24L01 Pins top view
' ---------------------------------------
' | GND 1 * * 2 V3.3P __ |
' | CE 3 * * 4 CSN (SS) |
' | SCK 5 * * 6 MOSI (SDO) |
' | MISO (SDI) 7 * * 8 IRQ |
' | |
' | ------ |
' | |Quarz | |
' | ------ |
' ---------------------------------------
#chip 16F690,8
#config OSC=INTRC_OSC_NOCLKOUT, PWRTE = ON
#include "C:\gcbasic_src\software_uart_v11.h"
#include "nRF24L01.h"
'nRF24L01 Settings
#define STANDBY_I 0b01111010 'Power up, Interrupt's disabled
'Serial settings
#define BAUD_RATE 2400
#define SER_OUT PORTA.0
dir SER_OUT out
'SPI settings
SPIMode MasterSlow,0
#define SDO PORTC.7
dir SDO out
#define SDI PORTB.4
dir SDI in
#define SS PORTC.6
dir SS out
#define SCK PORTB.6
dir SCK out
#define CE PORTB.7
dir CE out
dim Dummy as byte
Dummy = 0
wait 1 s
LCD_Clear
SerPrint("Test 2")
wait 2 s
LCD_Clear
POWER_UP
READ_REG(CONFIG)
LCD_Clear
print_byte(Dummy) 'should be 122 eq. 0b01111010
wait 2 s
Do
set SS on
set SS off
SPITransfer WL_NOP,Dummy
set SS on
LCD_Clear
print_byte(Dummy) 'should be 14 eq. 0b00001110
wait 1 s
Loop
'------------------------------------ subs ---------------------------------------
'SPIMode ( MasterSlow,0)
'SPITransfer tx, rx
'---------------------------------------------------------------------------------
sub POWER_UP 'Standby Mode I
'init SPI & CE pin
'set SDO off
'set SCK off 'CPOL = 0 the base value of the clock is zero, idle state is off
'set CE off
WRITE_REG(CONFIG,STANDBY_I)
wait 2 ms 'nRF24L01 is in Standby Mode I
end sub
'---------------------------------------------------------------------------------
'Read content of a 1 byte register
sub READ_REG(in Register as byte)
dim Dout as byte
Dummy = 0
Dout = R_REGISTER + Register
set SS on
set SS off
SPITransfer Dout,Dummy
SPITransfer R_REGISTER,Dummy
set SS on
end sub
'---------------------------------------------------------------------------------
'Write 1 byte to register
sub WRITE_REG(in Register as byte,in Data as byte)
dim Dout as byte
Dummy = 0
Dout = W_REGISTER + Register
set SS on
set SS off
SPITransfer Dout,Dummy
SPITransfer Data,Dummy
set SS on
end sub