|
проблемы с NORDIC nRF2401A |
|
|
|
May 12 2006, 07:57
|
Участник

Группа: Участник
Сообщений: 21
Регистрация: 30-11-04
Из: Питер
Пользователь №: 1 266

|
Подключаю nRF2401A к микроконтроллеру MSP430 тайминги и сигналы передачи настроены правильно проверил по осцилографу
ничего не работает
подскажите пожалуйста кто знает в чем может быть дело
Спасибо
|
|
|
|
|
Jun 8 2006, 08:39
|
Участник

Группа: Участник
Сообщений: 21
Регистрация: 30-11-04
Из: Питер
Пользователь №: 1 266

|
С передачей разобрался)
Но на прием так и не работает отсылаю конфигурацию такуюже как на передатчик но за исключением того что последнее слово 0х05 -- т.е. прием а на передатчике 0х04 -- т.е передача передатчик передает нормально смотрю по фирменной отладке. На приемние передаю конфигурацию и после устанавливаю CE -- в еденицу. P_UP-тоже 1 выводы МК на прием, но приемник молчит и Флаг полученной посылки не выдает.
|
|
|
|
|
Jun 8 2006, 08:50
|

nofb
  
Группа: Свой
Сообщений: 430
Регистрация: 18-05-06
Из: Москва, Зеленоград
Пользователь №: 17 218

|
вообщем так - я научился передавть 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 в конфигурации, но пакет из нескольких байт не хочет передаваться - то есть приемник его не принимает (не знаю, передает ли передатчик еще не проверял) Если решишь эту пробелму - пиши. Если решу сам - напишу :-))
Сообщение отредактировал Михаил Горюнов - Jun 8 2006, 08:53
--------------------
Это не то что вы подумали ...
|
|
|
|
|
Jun 8 2006, 09:23
|

nofb
  
Группа: Свой
Сообщений: 430
Регистрация: 18-05-06
Из: Москва, Зеленоград
Пользователь №: 17 218

|
Цитата(acex2 @ Jun 8 2006, 12:16)  Народ, а подскажите где и по чем вы берете nRF2401A в России? Поиск по eFind ничего не дал. по моему плохо искал... на складе конечно нет, но... в 7 дней уложиться обещают. А вообще я брал nrf24e1 в симметроне. www.simmetron.ru
--------------------
Это не то что вы подумали ...
|
|
|
|
|
Aug 18 2006, 07:20
|
Участник

Группа: Участник
Сообщений: 21
Регистрация: 30-11-04
Из: Питер
Пользователь №: 1 266

|
Вот время идет мы умнеем... Разобрался с nRF2401A полностью  так что если есть вопросы обращайтесь
|
|
|
|
|
Aug 22 2006, 12:03
|
Группа: Новичок
Сообщений: 10
Регистрация: 22-08-06
Из: Московская обл.
Пользователь №: 19 735

|
А с nRF24L01 никто не работал ? че-то не получается ниче  насчет СЕ... а нельзя ли его просто в единицу поставить? в nRF24L01 я на него единичку подал ... мож потому и не получается. подскажите, пожалуйста, если кто знает.
|
|
|
|
|
Aug 22 2006, 14:21
|
Гуру
     
Группа: Свой
Сообщений: 2 563
Регистрация: 8-04-05
Из: Nsk
Пользователь №: 3 954

|
Цитата(Viktor O. @ Aug 22 2006, 19:03)  А с nRF24L01 никто не работал ? че-то не получается ниче  насчет СЕ... а нельзя ли его просто в единицу поставить? в nRF24L01 я на него единичку подал ... мож потому и не получается. подскажите, пожалуйста, если кто знает. в даташите на 10 странице все очень хорошо описано. если не надо: уходить в standby-ii, начинать передачу в сторого определенное время (по положительному фронту CE), или автоматически переключаться на прием после поcылки пакета, то можно.
|
|
|
|
|
Aug 23 2006, 06:37
|
Группа: Новичок
Сообщений: 10
Регистрация: 22-08-06
Из: Московская обл.
Пользователь №: 19 735

|
выставляю PWR_UP = 1 PRIM_RX = 0 СЕ все время 1. получается, что передача начинается, когда в TX FIFO что-то записали. nRF24L01 передаёт данные, переключается автоматом в RX режим, ждет подтверждения, когда оно поступит TX FIFO сбрасывается и в TX_DS пишется 1.
т е передача идёт автоматом после записи в TX FIFO, никакие дополнительные команды не нужны ?
|
|
|
|
|
Aug 23 2006, 08:08
|
Гуру
     
Группа: Свой
Сообщений: 2 563
Регистрация: 8-04-05
Из: Nsk
Пользователь №: 3 954

|
Цитата(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х у приёмника?
|
|
|
|
|
Aug 24 2006, 08:05
|
Группа: Новичок
Сообщений: 10
Регистрация: 22-08-06
Из: Московская обл.
Пользователь №: 19 735

|
Цитата(_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), все это запихиваю в бесконечный цикл и запускаю. тыкаю осциллографом в выход на антенну - тишина, но ведь по идее что то там быть должно
|
|
|
|
|
Aug 24 2006, 08:29
|
Группа: Новичок
Сообщений: 10
Регистрация: 22-08-06
Из: Московская обл.
Пользователь №: 19 735

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

nofb
  
Группа: Свой
Сообщений: 430
Регистрация: 18-05-06
Из: Москва, Зеленоград
Пользователь №: 17 218

|
Цитата(_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 так же.
--------------------
Это не то что вы подумали ...
|
|
|
|
|
Aug 24 2006, 13:49
|
Группа: Новичок
Сообщений: 10
Регистрация: 22-08-06
Из: Московская обл.
Пользователь №: 19 735

|
CONFIG у меня так записан - 0x72
я этот бит в самом начале установил и больше не трогал... нужно что-ли только во время передачи PWR_UP включать ?
|
|
|
|
|
Aug 24 2006, 14:31
|
Группа: Новичок
Сообщений: 10
Регистрация: 22-08-06
Из: Московская обл.
Пользователь №: 19 735

|
нет, дело не в этом. его хоть как включай - хоть в начале, хоть на время передачи. не работает  питания на VDD_PA нет, и сигнал не передаётся... хотя в статусе TX_DS появляется... вот ерунда какая-то
|
|
|
|
|
Aug 24 2006, 14:45
|
Группа: Новичок
Сообщений: 10
Регистрация: 22-08-06
Из: Московская обл.
Пользователь №: 19 735

|
а зачем нужен IREF ? на схеме в даташите он через резистор идёт на землю, а на моей он висит в воздухе. может ли это так влиять на VDD_PA ? подскажите кто-нибудь
|
|
|
|
|
Aug 25 2006, 09:16
|
Группа: Новичок
Сообщений: 10
Регистрация: 22-08-06
Из: Московская обл.
Пользователь №: 19 735

|
 IREF как раз и нужен для VDD_PA ура, получилось передать байт !
|
|
|
|
|
Aug 25 2006, 09:47
|
Группа: Новичок
Сообщений: 10
Регистрация: 22-08-06
Из: Московская обл.
Пользователь №: 19 735

|
т е длина передаваемого пакета должна быть меньше или равна размеру RX FIFO ? это имеется ввиду ?
|
|
|
|
|
Aug 25 2006, 09:50
|

nofb
  
Группа: Свой
Сообщений: 430
Регистрация: 18-05-06
Из: Москва, Зеленоград
Пользователь №: 17 218

|
Цитата(Viktor O. @ Aug 25 2006, 12:47)  т е длина передаваемого пакета должна быть меньше или равна размеру RX FIFO ? это имеется ввиду ? Имеется в виду, что после того как запустился процесс передачи пакета ты не можешь начать записывать новые данные на передачу до тех пор, пока пакет не будет передан передатчиком. Иначе ты получишь чушь на приемнике.
Сообщение отредактировал Михаил Горюнов - Aug 25 2006, 09:50
--------------------
Это не то что вы подумали ...
|
|
|
|
|
Aug 25 2006, 09:51
|
Гуру
     
Группа: Свой
Сообщений: 2 563
Регистрация: 8-04-05
Из: Nsk
Пользователь №: 3 954

|
Цитата(Михаил Горюнов @ 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.
Сообщение отредактировал _pv - Aug 25 2006, 09:56
|
|
|
|
|
Aug 25 2006, 10:05
|
Группа: Новичок
Сообщений: 10
Регистрация: 22-08-06
Из: Московская обл.
Пользователь №: 19 735

|
все три "этажа" имеют размер 32 байта ?
|
|
|
|
|
Aug 25 2006, 10:16
|

nofb
  
Группа: Свой
Сообщений: 430
Регистрация: 18-05-06
Из: Москва, Зеленоград
Пользователь №: 17 218

|
Цитата(_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. Вообще совсем :-)
--------------------
Это не то что вы подумали ...
|
|
|
|
|
Aug 25 2006, 10:33
|
Гуру
     
Группа: Свой
Сообщений: 2 563
Регистрация: 8-04-05
Из: Nsk
Пользователь №: 3 954

|
Цитата(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.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|