Полная версия этой страницы:
проблемы с NORDIC nRF2401A
Подключаю nRF2401A к микроконтроллеру MSP430
тайминги и сигналы передачи настроены правильно
проверил по осцилографу
ничего не работает
подскажите пожалуйста кто знает в чем может быть дело
Спасибо
gormih
May 18 2006, 12:23
Слишком общий вопрос: Всe подключил правильно, но ничего не работает...
А вообще тоже занялся нордиком... Интересно знать, какие с ним могут возникнуть проблемы...
С передачей разобрался)
Но на прием так и не работает отсылаю конфигурацию такуюже как на передатчик но за исключением того что последнее слово 0х05 -- т.е. прием а на передатчике 0х04 -- т.е передача
передатчик передает нормально смотрю по фирменной отладке. На приемние передаю конфигурацию и после устанавливаю CE -- в еденицу. P_UP-тоже 1 выводы МК на прием, но приемник молчит и Флаг полученной посылки не выдает.
вообщем так - я научился передавть 1 байт, а вот с передачей пакета из нескольких пока проблемы.
Передеача одного байта с АЦП и выдача его на rs232 у меня осуществяляется вот так:
#include <Nordic\reg24e1.h>
struct RFConfig
{
unsigned char n;
unsigned char buf[15];
};
typedef struct RFConfig RFConfig;
#define ADDR_INDEX 8 // Index to address bytes in RFConfig.buf
#define ADDR_COUNT 4 // Number of address bytes
const RFConfig txconf =
{
15,
0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x12, 0x34, 0x56, 0x78, 0x83, 0x6c, 0x04
};
const RFConfig rxconf =
{
15,
0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x87, 0x65, 0x43, 0x21, 0x83, 0x6c, 0x05
};
void Delay100us(volatile unsigned char n)
{
unsigned char i;
while(n--)
for(i=0;i<35;i++)
;
}
unsigned char SpiReadWrite(unsigned char B)
{
EXIF &= ~0x20; // Clear SPI interrupt
SPI_DATA = b; // Move byte to send to SPI data register
while((EXIF & 0x20) == 0x00) // Wait until SPI hs finished transmitting
;
return SPI_DATA;
}
void InitUart(void)
{
TH1 = 243;// 19200@16MHz (when T1M=1 and SMOD=1)
CKCON |= 0x10; // T1M=1 (/4 timer clock)
PCON = 0x80; // SMOD=1 (double baud rate)
SCON = 0x52; // Serial mode1, enable receiver
TMOD = 0x20; // Timer1 8bit auto reload
TR1 = 1; // Start timer1
P0_DIR |= 0x02; // P0.1 (RxD) is an input
P0_ALT |= 0x06; // Select alternate functions on pins P0.1 and P0.2
}
void PutChar(char B)
{
while(!TI)
;
TI = 0;
SBUF = b;
}
void InitADC(void)
{
ADCCON = 0x20; // Channel 0, NPD=1, ADCRUN=0, EXTREF=0
ADCSTATIC &= 0x1c;
ADCSTATIC |= 0x03; // 12bit
ADCCON &= ~0x80; // Start..
ADCCON |= 0x80; // ..new conversion
}
/*
void InitPWM(void)
{
P0_ALT |= 0x80; // Enable PWM output
PWMCON = 0xc0; // Enable 8 bit PWM with minimum prescaler
}
*/
unsigned char ReceivePacket()
{
unsigned char b;
CE = 1;
while(DR1 == 0)
;
b = SpiReadWrite(0);
CE = 0;
return b;
}
void TransmitPacket(unsigned char B)
{
unsigned char i;
CE = 1;
Delay100us(0);
// Start with the address of the receiver:
for(i=0;i<ADDR_COUNT;i++)
SpiReadWrite(rxconf.buf[ADDR_INDEX+i]);
SpiReadWrite(B);
CE = 0;
Delay100us(3); // Wait ~300us
}
unsigned char ReadADC(void)
{
unsigned char b;
while((EXIF & 0x10) == 0) // Wait until ADC conversion complete
;
EXIF &= ~0x10; // Clear ADC completion bit
b = ADCDATAH; // Read ADC data
ADCCON &= ~0x80; // Start..
ADCCON |= 0x80; // ..new conversion
return b;
}
/*void WritePWM(unsigned char B)
{
PWMDUTY = b;
}
*/
void Receiver(void)
{
unsigned char b;
CS = 1;
Delay100us(0);
for(b=0;b<rxconf.n;b++)
{
SpiReadWrite(rxconf.buf[b]);
}
CS = 0;
for(;;)
{
b = ReceivePacket();
PutChar(B);
}
}
void Transmitter(void)
{
unsigned char b;
CS = 1;
Delay100us(0);
for(b=0;b<txconf.n;b++)
{
SpiReadWrite(txconf.buf[b]);
}
CS = 0;
for(;;)
{
b = ReadADC(); // Read ADC
TransmitPacket(B); // Transmit data
}
}
void Init(void)
{
P0_DIR = 0x40; // P0.6 is input, the rest output
P0 = 0x10; // P0.4 = 1 for the rec/tran selection
PWR_UP = 1; // Turn on Radio
Delay100us(30); // Wait > 3ms
SPICLK = 0; // Max SPI clock (XTAL/8)
SPI_CTRL = 0x02; // Connect internal SPI controller to Radio
}
void main(void)
{
Init();
if(P0 & 0x40)
{
InitUart();
Receiver();
}
else
{
InitADC();
Transmitter();
}
}
Это написано на си под 8051. Прога рабочая - выдает на 232 интерфейс последовательность байт, которые соответствуют значению напряжения на АЦП передатчика.
Вопрос в другом - я изменил значение DATA_1W в конфигурации, но пакет из нескольких байт не хочет передаваться - то есть приемник его не принимает (не знаю, передает ли передатчик еще не проверял)
Если решишь эту пробелму - пиши. Если решу сам - напишу :-))
Народ, а подскажите где и по чем вы берете nRF2401A в России?
Поиск по eFind ничего не дал.
Цитата(acex2 @ Jun 8 2006, 12:16)

Народ, а подскажите где и по чем вы берете nRF2401A в России?
Поиск по eFind ничего не дал.
по моему плохо искал...
на складе конечно нет, но... в 7 дней уложиться обещают.
А вообще я брал nrf24e1 в симметроне.
www.simmetron.ru
Вот время идет мы умнеем...
Разобрался с nRF2401A полностью

так что если есть вопросы обращайтесь
Viktor O.
Aug 22 2006, 12:03
А с nRF24L01 никто не работал ? че-то не получается ниче

насчет СЕ... а нельзя ли его просто в единицу поставить? в nRF24L01 я на него единичку подал ... мож потому и не получается.
подскажите, пожалуйста, если кто знает.
Цитата(Viktor O. @ Aug 22 2006, 19:03)

А с nRF24L01 никто не работал ? че-то не получается ниче

насчет СЕ... а нельзя ли его просто в единицу поставить? в nRF24L01 я на него единичку подал ... мож потому и не получается.
подскажите, пожалуйста, если кто знает.
в даташите на 10 странице все очень хорошо описано.
если не надо: уходить в standby-ii, начинать передачу в сторого определенное время (по положительному фронту CE), или автоматически переключаться на прием после поcылки пакета, то можно.
Viktor O.
Aug 23 2006, 06:37
выставляю
PWR_UP = 1
PRIM_RX = 0
СЕ все время 1.
получается, что передача начинается, когда в TX FIFO что-то записали.
nRF24L01 передаёт данные, переключается автоматом в RX режим, ждет подтверждения, когда оно поступит TX FIFO сбрасывается и в TX_DS пишется 1.
т е передача идёт автоматом после записи в TX FIFO, никакие дополнительные команды не нужны ?
Цитата(Viktor O. @ Aug 23 2006, 12:37)

выставляю
PWR_UP = 1
PRIM_RX = 0
СЕ все время 1.
получается, что передача начинается, когда в TX FIFO что-то записали.
nRF24L01 передаёт данные, переключается автоматом в RX режим, ждет подтверждения, когда оно поступит TX FIFO сбрасывается и в TX_DS пишется 1.
т е передача идёт автоматом после записи в TX FIFO, никакие дополнительные команды не нужны ?
насколько я понял, если все время держать CE, то в RX передатчик не перейдет после посылки пакета и ack соответсветнно не примет и поэтому попробует послать еще 3 (по умолчанию) раза и на этом успокоится..
так что смотрите что творится в OBSERVE_TX..
зы а длина передаваемого пакета совпадает с тем что записано в RX_PW_Pх у приёмника?
gormih
Aug 23 2006, 08:29
У меня nrf24e1, и если я буду держать СЕ все время в 1 - передатчик работать не будет однозначно.
После того, как заталкиваю в него через spi данные - устанавливаю ce в 0 - только тогда начинается передача пакета.
Цитата(Михаил Горюнов @ Aug 23 2006, 14:29)

У меня nrf24e1, и если я буду держать СЕ все время в 1 - передатчик работать не будет однозначно.
После того, как заталкиваю в него через spi данные - устанавливаю ce в 0 - только тогда начинается передача пакета.
nrf24l01 как передатчик так вполне работает, только если autoacknoledgment выключить.
Viktor O.
Aug 24 2006, 08:05
Цитата(_pv @ Aug 23 2006, 12:08)

Цитата(Viktor O. @ Aug 23 2006, 12:37)

выставляю
PWR_UP = 1
PRIM_RX = 0
СЕ все время 1.
получается, что передача начинается, когда в TX FIFO что-то записали.
nRF24L01 передаёт данные, переключается автоматом в RX режим, ждет подтверждения, когда оно поступит TX FIFO сбрасывается и в TX_DS пишется 1.
т е передача идёт автоматом после записи в TX FIFO, никакие дополнительные команды не нужны ?
насколько я понял, если все время держать CE, то в RX передатчик не перейдет после посылки пакета и ack соответсветнно не примет и поэтому попробует послать еще 3 (по умолчанию) раза и на этом успокоится..
так что смотрите что творится в OBSERVE_TX..
зы а длина передаваемого пакета совпадает с тем что записано в RX_PW_Pх у приёмника?
длина совпадает, автоподтверждение выключил
передаю байт в TX FIFO, проверяю по регистру статуса FIFO - в TX FIFO что то записалось...

смотрю по регистру статуса - данные ушли (TX_DS = 1), все это запихиваю в бесконечный цикл и запускаю. тыкаю осциллографом в выход на антенну - тишина, но ведь по идее что то там быть должно
Viktor O.
Aug 24 2006, 08:29
VDD_PA - Power Output - Power Supply (+1.8V) to Power Amplifier
на нем должно быть +1,8 В по идее, а на нём 0.
этот выход управляется битом в каком-то регистре ? или им управлять нельзя?
че-то никак не найду
Цитата(Viktor O. @ Aug 24 2006, 15:29)

VDD_PA - Power Output - Power Supply (+1.8V) to Power Amplifier
на нем должно быть +1,8 В по идее, а на нём 0.
этот выход управляется битом в каком-то регистре ? или им управлять нельзя?
че-то никак не найду
(00) CONFIG : bit1 (PWR_UP). по умолчанию - он в нуле...
gormih
Aug 24 2006, 13:24
Цитата(_pv @ Aug 24 2006, 16:22)

Цитата(Viktor O. @ Aug 24 2006, 15:29)

VDD_PA - Power Output - Power Supply (+1.8V) to Power Amplifier
на нем должно быть +1,8 В по идее, а на нём 0.
этот выход управляется битом в каком-то регистре ? или им управлять нельзя?
че-то никак не найду
(00) CONFIG : bit1 (PWR_UP). по умолчанию - он в нуле...

Ага. В nrf24e1 так же.
Viktor O.
Aug 24 2006, 13:49
CONFIG у меня так записан - 0x72
я этот бит в самом начале установил и больше не трогал...
нужно что-ли только во время передачи PWR_UP включать ?
Viktor O.
Aug 24 2006, 14:31
нет, дело не в этом. его хоть как включай - хоть в начале, хоть на время передачи.
не работает

питания на VDD_PA нет, и сигнал не передаётся... хотя в статусе TX_DS появляется... вот ерунда какая-то
Viktor O.
Aug 24 2006, 14:45
а зачем нужен IREF ? на схеме в даташите он через резистор идёт на землю, а на моей он висит в воздухе. может ли это так влиять на VDD_PA ?
подскажите кто-нибудь
Viktor O.
Aug 25 2006, 09:16

IREF как раз и нужен для VDD_PA
ура, получилось передать байт !
gormih
Aug 25 2006, 09:21
Цитата(Viktor O. @ Aug 25 2006, 12:16)


IREF как раз и нужен для VDD_PA
ура, получилось передать байт !


А теперь главное не забывай, что буфер не должен заполнятся раньше, чем будет будет завершена передача пакета.
Мне чтобы это понять пришлось потратить 2 недели.
Viktor O.
Aug 25 2006, 09:47
т е длина передаваемого пакета должна быть меньше или равна размеру RX FIFO ?
это имеется ввиду ?
gormih
Aug 25 2006, 09:50
Цитата(Viktor O. @ Aug 25 2006, 12:47)

т е длина передаваемого пакета должна быть меньше или равна размеру RX FIFO ?
это имеется ввиду ?
Имеется в виду, что после того как запустился процесс передачи пакета ты не можешь начать записывать новые данные на передачу до тех пор, пока пакет не будет передан передатчиком.
Иначе ты получишь чушь на приемнике.
Цитата(Михаил Горюнов @ Aug 25 2006, 16:21)

А теперь главное не забывай, что буфер не должен заполнятся раньше, чем будет будет завершена передача пакета.
Мне чтобы это понять пришлось потратить 2 недели.
???
в nrf24L01 фифо трехэтажное

т.е. вполне можно загнать еще пару пакетов не дожидаясь отсылки предыдущего.
Цитата
nRF24L01 has a three level deep RX FIFO
(shared between 6 pipes) and a three level deep TX FIFO. The MCU can access the
FIFOs at any time, in power down mode, in standby modes, and during RF packet
transmission.
Viktor O.
Aug 25 2006, 10:05
все три "этажа" имеют размер 32 байта ?
gormih
Aug 25 2006, 10:16
Цитата(_pv @ Aug 25 2006, 12:51)

Цитата(Михаил Горюнов @ Aug 25 2006, 16:21)

А теперь главное не забывай, что буфер не должен заполнятся раньше, чем будет будет завершена передача пакета.
Мне чтобы это понять пришлось потратить 2 недели.
???
в nrf24L01 фифо трехэтажное

т.е. вполне можно загнать еще пару пакетов не дожидаясь отсылки предыдущего.
Цитата
nRF24L01 has a three level deep RX FIFO
(shared between 6 pipes) and a three level deep TX FIFO. The MCU can access the
FIFOs at any time, in power down mode, in standby modes, and during RF packet
transmission.
Вообще совсем :-)
Цитата(Viktor O. @ Aug 25 2006, 17:05)

все три "этажа" имеют размер 32 байта ?
а в даташите посмотреть?
Код
TX_PLD 255:0
Written by separate SPI command TX
data payload register 1 - 32 bytes.
This register is implemented as a FIFO
with 3 levels. Used in TX mode only
RX так же.
и еще, это фифо оно общее на все 6 pipe.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.