Ejemplo n.º 1
0
        public Nrf(PinNumberEnum chipEnable, SpiChannelEnum channel, int spiSpeed = DefaultSpiSpeed)
        {
            _channel    = channel;
            _chipEnable = chipEnable;

            Functionalities.Pins.Setup(_chipEnable, PinModeEnum.Output);
            Functionalities.Pins.Write(_chipEnable, false);

            Functionalities.Spi.Setup(_channel, spiSpeed);

            Functionalities.Sleep.Milli(5);

            var general   = (ConfigurationRegister)ReadRegister(RegisterEnum.Configuration);
            var frequency = (FrequencyChannelRegister)ReadRegister(RegisterEnum.FrequencyChannel);

            State = general.PowerState;
            Mode  = general.TransceiverMode;

            Frequency = frequency.Frequency;

            for (byte pipeNumber = 0; pipeNumber < 6; ++pipeNumber)
            {
                WriteRegister(new PayloadSizeRegister(pipeNumber, PayloadSize));
            }
        }
Ejemplo n.º 2
0
        public Module(PinNumberEnum chipEnable, SpiChannelEnum channel, [NotNull] Address address, [NotNull] Address broadcastAddress, byte radioChannel,
                      bool sendContinuously         = false, bool readRetransmissionsCount = false,
                      OutputPowerEnum outputPower   = OutputPowerEnum.P0dbm, DataRateEnum dataRate    = DataRateEnum.S1Mbps,
                      byte autoRetransmitRetryLimit = 10, AutoRetransmitDelayEnum autoRetransmitDelay = AutoRetransmitDelayEnum.T2000us,
                      int spiSpeed = Nrf.DefaultSpiSpeed)
        {
            if (address == null)
            {
                throw new ArgumentNullException(nameof(address));
            }
            if (broadcastAddress == null)
            {
                throw new ArgumentNullException(nameof(broadcastAddress));
            }

            Packet.BaseAddress = address;

            Address          = address;
            BroadcastAddress = broadcastAddress;

            _sendContinuously         = sendContinuously;
            _readRetransmissionsCount = readRetransmissionsCount;

            _nrf = new Nrf(chipEnable, channel, spiSpeed);

            if (!_nrf.IsConnected)
            {
                throw new InvalidOperationException("NRF doesn't seem to be connected.");
            }

            _nrf.WriteRegister(new ConfigurationRegister(false, false, false, true, CrcLengthEnum.TwoBytes, PowerStateEnum.Down, TransceiverModeEnum.Receiver));
            _nrf.WriteRegister(new AutoAcknowledgmentRegister(true, true, false, false, false, false));
            _nrf.WriteRegister(new ReceiverAddressRegister(true, true, false, false, false, false));
            _nrf.WriteRegister(new AddressWidthRegister(AddressWidthEnum.FiveBytes));
            _nrf.WriteRegister(new AutoRetransmissionRegister(autoRetransmitDelay, autoRetransmitRetryLimit));
            _nrf.WriteRegister(new FrequencyChannelRegister(radioChannel));
            _nrf.WriteRegister(new RadioRegister(false, false, dataRate, outputPower));
            _nrf.WriteRegister(new FeatureRegister(false, false, true));
            _nrf.WriteRegister(new DynamicPayloadLengthRegister(false, false, false, false, false, false));

            _nrf.Flush();

            _nrf.SetPipeReceiveAddress(1, Address);

            _nrf.ModifyRegister <ConfigurationRegister>(RegisterEnum.Configuration, register => register.TransceiverMode = TransceiverModeEnum.Transmitter);

            _nrf.SetupDelay();

            _nrf.ChangePowerState(PowerStateEnum.Up);

            // Standby-I

            _worker = new BackgroundWorker
            {
                WorkerSupportsCancellation = true,
            };

            _worker.DoWork             += Work;
            _worker.RunWorkerCompleted += WorkCompleted;
        }
Ejemplo n.º 3
0
        public void ConfigureInterrupt(PinNumberEnum pin, bool receiveInterruptEnabled,
                                       bool transmitInterruptEnabled, bool retransmitLimitReachedInterruptEnabled,
                                       [NotNull] Action <Nrf, byte?> handler)
        {
            if (handler == null)
            {
                throw new ArgumentNullException(nameof(handler));
            }

            ModifyRegister(RegisterEnum.Configuration, i =>
            {
                var r = (ConfigurationRegister)i;

                r.ReceiveInterruptEnabled  = receiveInterruptEnabled;
                r.TransmitInterruptEnabled = transmitInterruptEnabled;
                r.RetransmitLimitReachedInterruptEnabled = retransmitLimitReachedInterruptEnabled;

                return(r);
            });

            Functionalities.Pins.Setup(pin, PinModeEnum.Input, PullUpModeEnum.Up);
            Functionalities.Interrupts.Setup(pin, InterruptModeEnum.FallingEdge, () =>
            {
                var status = (StatusRegister)ReadRegister(RegisterEnum.Status);
                handler(this, status.DataReadyPipeNumber);
            });
        }
Ejemplo n.º 4
0
        public Processor(PinNumberEnum chipEnable, SpiChannelEnum channel, [NotNull] Address address, [NotNull] Address broadcastAddress, byte radioChannel,
                         bool sendContinuously = false, bool readRetransmissionsCount = false)
        {
            _module = new Module(chipEnable, channel, address, broadcastAddress, radioChannel, sendContinuously, readRetransmissionsCount,
                                 spiSpeed: 12000000);

            _module.Received      += OnReceived;
            _module.SendingFailed += OnSendingFailed;
            _module.Sent          += OnSent;
            _module.Error         += OnError;
        }
Ejemplo n.º 5
0
 public static bool Read(PinNumberEnum pin)
 => InternalRead((int)pin);
Ejemplo n.º 6
0
 public static void Write(PinNumberEnum pin, bool state)
 => InternalWrite((int)pin, state);
Ejemplo n.º 7
0
 public static void Setup(PinNumberEnum pin, PinModeEnum mode, PullUpModeEnum?pullUpMode = null)
 => InternalSetup((int)pin, mode, pullUpMode);
Ejemplo n.º 8
0
 public static void Remove(PinNumberEnum pin)
 => Setup(pin, InterruptModeEnum.None, null);
Ejemplo n.º 9
0
 public static IDisposable SetupPolled(PinNumberEnum pin, InterruptModeEnum mode, Action handler)
 => InternalSetupPolled((int)pin, mode, handler);
Ejemplo n.º 10
0
 public static void Setup(PinNumberEnum pin, InterruptModeEnum mode, Action handler)
 => InternalSetup((int)pin, mode, handler);