A Wiring-like wrapper to use the nrf24le1 SoC
Go to https://hackaday.io/project/5794-nrf24le1-wiring-library for more details
pinMode(P0_0, INPUT | PULLUP);
digitalRead(P0_0);
digitalWrite(P0_0, HIGH);
pinMode is slightly different in that you |
together the options which are:
- PULLUP
- PULLDOWN
- INPUT
- OUTPUT
- HIGH_POWER
- NORMAL_POWER
digitalRead
, digitalWrite
, analogWrite
work as usual.
noPullup()
and pullup()
are absent and rolled into pinMode()
ADC is setup in 12 bit resolution, PWM pre-scaler to 10 and width to 8 bits.
interrupts()
, noInterrupts()
, detachInterrupt()
work as expected.
attachInterrupt(GP_INT, condition)
is slightly different in that there is no function argument, conditions are LOW
and FALLING
. You need to write an ISR for INTERRUPT_VECTOR_IFP
. Depending on your chip, the GPINT options are
- INTERRUPT_IFP_INPUT_GPINT0 //P0.0 on 24-pin, P0.5 on 32-pin, P1.2 on 48-pin
- INTERRUPT_IFP_INPUT_GPINT1 //P0.2 on 24-pin, P0.6 on 32-pin, P1.3 on 48-pin
- INTERRUPT_IFP_INPUT_GPINT2 //Not present on 24-pin or 32-pin, P1.4 on 48-pin
You can define an ISR like
ISR(INTERRUPT_VECTOR_IFP){
//do something
}
The list of vectors:
- INTERRUPT_VECTOR_IFP
- INTERRUPT_VECTOR_T0
- INTERRUPT_VECTOR_PWR_FAIL
- INTERRUPT_VECTOR_T1
- INTERRUPT_VECTOR_UART
- INTERRUPT_VECTOR_T2
- INTERRUPT_VECTOR_RFRDY
- INTERRUPT_VECTOR_RFIRQ
- INTERRUPT_VECTOR_SPI_2WIRE
- INTERRUPT_VECTOR_WU_ON_PIN
- INTERRUPT_VECTOR_XOSC_ADC_RNG
- INTERRUPT_VECTOR_RTC2
millis()
is implemented using timer0. Due to it's use of system resources, it is not started automatically. millisBegin()
will start it. Thanks to maksms' GitHub repo for this routine. Access it through millis()
which is a uint32_t.
delay()
and delayMilliseconds()
work as expected
serialBegin()
sets up up at 38400 8n1 which is the maximum speed.
serialPrint
and serialPrintLn
are implemented as wrappers to printf_small(format, args)
serialPrint("wiring wrapper version %u", 1);
debugPrint(format, args)
and debugPrintLn(format, args)
are macros that wrap printf_small()
and is enabled if DEBUG is defined:
debugPrint("nrf24le1 with no args", 0);
debugPrint("nrf24le1 version %u", 1);
format | output type | argument-type |
---|---|---|
%d | decimal | int |
%ld | decimal | long |
%hd | decimal | char |
%x | hexadecimal | int |
%lx | hexadecimal | long |
%hx | hexadecimal | char |
%o | octal | int |
%lo | octal | long |
%ho | octal | char |
%c | character | char |
%s | character | generic pointer |
%f | float | float* |
SDCC is not compiled by default with float support
Automatically set up in master mode at 400kHz. I would like this to be made more Wiring-like.
wireWrite8(slave address, data)
returns W2_NACK_VAL or W2_ACK_VAL
wireRead8(slave address, address)
returns W2_NACK_VAL or W2_ACK_VAL
wireRead16(slave address, address)
returns W2_NACK_VAL or W2_ACK_VAL
watchdogRun(millis)
will start the watchdog and cause a reset if not called before millis runs out. Does not work in deep sleep mode. Minimum is 7.8125 ms, max is 512 seconds.
sleep(mode)
will enter the passed mode. Modes are:
- ACTIVE
- STANDBY
- REGISTER_RET
- MEMORY_TIMER_ON
- MEMORY_TIMER_OFF
- DEEP_SLEEP
The nrf24le1 has an onboad RNG. The cstd random()
has been replaced by the board RNG and returns a random byte.
Are defined as P0_0
P1_1
etc.
gpio.h has defines for all three variants and also the special names for the pins which can be used as well.
The chip includes a hardware galois multiplication function.
uint8_t aesGaloisMultiply(uint8_t value1, uint8_t value2)