Скачал либу Tinkener'a, все поставил. Отредактировал файлик. Все компилится. Ща буду экспериментировать. Код для radioPinFunctions.c получился такой:
- Код: Выделить всё
//#include <avr/io.h>
#define set_bit(reg,bit) reg |= (1<<bit)
#define clr_bit(reg,bit) reg &= ~(1<<bit)
#define check_bit(reg,bit) (reg&(1<<bit))
/* ------------------------------------------------------------------------- */
void nrf24_setupPins()
{
DDRB=0b101110;
/*
set_bit(DDRA,0); // PB2 CE output
set_bit(DDRA,1); // PB1 CSN output
set_bit(DDRA,2); // PB5 SCK output
set_bit(DDRA,3); // PB3 MOSI output
clr_bit(DDRA,4); // PB4 MISO input
*/
}
/* ------------------------------------------------------------------------- */
void nrf24_ce_digitalWrite(uint8_t state)
{
if(state)
{
PORTB.2=1;
}
else
{
PORTB.2=0;
}
}
/* ------------------------------------------------------------------------- */
void nrf24_csn_digitalWrite(uint8_t state)
{
if(state)
{
PORTB.1=1;
}
else
{
PORTB.1=0;
}
}
/* ------------------------------------------------------------------------- */
void nrf24_sck_digitalWrite(uint8_t state)
{
if(state)
{
PORTB.5=1;
}
else
{
PORTB.5=0;
}
}
/* ------------------------------------------------------------------------- */
void nrf24_mosi_digitalWrite(uint8_t state)
{
if(state)
{
PORTB.3=1;
}
else
{
PORTB.3=0;
}
}
/* ------------------------------------------------------------------------- */
uint8_t nrf24_miso_digitalRead()
{
return PINB.4;
}
/* ------------------------------------------------------------------------- */
Настраивается все как-то так уже в void main(void)
- Код: Выделить всё
/* Настройка nRF24 */
nrf24_init();
nrf24_rx_address("serv1"); //адрес приемника
nrf24_tx_address("cli1"); //адрес кому отправлять будем
nrf24_config(2, 32); //выбираем канал №2, и длину пакета в 32 байта
Добавлено спустя 2 часа 21 минуту 50 секунд:Так. Все завелось. Итого результаты такие.
Вот код конфигурации для mega328p в файле radioPinFunctions.c:
- Код: Выделить всё
#define set_bit(reg,bit) reg |= (1<<bit)
#define clr_bit(reg,bit) reg &= ~(1<<bit)
#define check_bit(reg,bit) (reg&(1<<bit))
/* ------------------------------------------------------------------------- */
void nrf24_setupPins()
{
DDRB.2=1;
DDRB.1=1;
DDRB.5=1;
DDRB.3=1;
DDRB.4=0;
/*
set_bit(DDRA,0); // PB2 CE output
set_bit(DDRA,1); // PB1 CSN output
set_bit(DDRA,2); // PB5 SCK output
set_bit(DDRA,3); // PB3 MOSI output
clr_bit(DDRA,4); // PB4 MISO input
*/
}
/* ------------------------------------------------------------------------- */
void nrf24_ce_digitalWrite(uint8_t state)
{
if(state)
{
PORTB.2=1;
}
else
{
PORTB.2=0;
}
}
/* ------------------------------------------------------------------------- */
void nrf24_csn_digitalWrite(uint8_t state)
{
if(state)
{
PORTB.1=1;
}
else
{
PORTB.1=0;
}
}
/* ------------------------------------------------------------------------- */
void nrf24_sck_digitalWrite(uint8_t state)
{
if(state)
{
PORTB.5=1;
}
else
{
PORTB.5=0;
}
}
/* ------------------------------------------------------------------------- */
void nrf24_mosi_digitalWrite(uint8_t state)
{
if(state)
{
PORTB.3=1;
}
else
{
PORTB.3=0;
}
}
/* ------------------------------------------------------------------------- */
uint8_t nrf24_miso_digitalRead()
{
return PINB.4;
}
Используемые либы; не забываем в свойствах проекта указать пути к библиотеке. Файл radioPinFunctions.c лежит где-то в примерах, я его выкинул в корень либы и вытаскиваю оттуда:
- Код: Выделить всё
#include <mega328p.h>
#include <delay.h>
#include <stdio.h>
#include <nrf24.h>
#include <radioPinFunctions.c>
Настраиваем передатчик в void mai(void):
- Код: Выделить всё
/* Настройка nRF24 */
nrf24_init();
nrf24_rx_address("serv1"); //адрес приемника
nrf24_tx_address("cli1"); //адрес кому отправлять будем
nrf24_config(2, 32); //выбираем канал №2, и длину пакета в 32 байта
Как выглядит передача данных:
- Код: Выделить всё
nrf24_send("banana"); //отправляем строку
while(nrf24_isSending()); //ждем пока отправится. Бесконечные циклы это зло, не забудьте создать таймаут
Прием данных:
- Код: Выделить всё
nrf24_powerUpRx(); //выводим и спячки и говорим "Слушай!"
while(!nrf24_dataReady()); //ждем пока придут данные
nrf24_getData(data_array); //вытаскиваем данные из буфера
Бонусные вкусности:
- Код: Выделить всё
var = nrf24_lastMessageStatus(); //возвращает 1 если в последний раз все отправилось успешно
var = nrf24_retransmissionCount(); //возвращает количество попыток отправить ушедший пакет
nrf24_powerDown(); //отправляет модуль спать
Пока все. Курю мануалы дальше
Добавлено спустя 49 минут 35 секунд:Теперь у меня вопрос
А кто-нибудь игрался с адресами? Или делал ретранслятор?
Ну допустим. Есть сеть, в которой несколько клиентов, сервер и ретранслятор.
Ретранслятор должен принимать все сообщеньки и ретранслировать их без изменений PID и прочей чуши.
Сервер должен принимать сообщеньки от всех, и на месте разбираться от кого пришла сообщенька и отправлять результат обратно.
Как реализовать проверку адресов уже на месте, без автоматической проверки?