Автоматика и аппаратура связи Дистанционное и непосредственное управление исполнительными механизмами, сотовая, а также радиосвязь. |
12.09.2014, 15:02
|
#1071
|
Частый гость
Регистрация: 04.12.2012
Сообщений: 38
Сказал спасибо: 25
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Кто-нибудь работал с RF модулями nRF2401A?
Сообщение от BolshoyK
|
взять готовую библиотеку почему нельзя? зачем писать ее заново вспоминая все нюансы и таймауты?
|
На STM32F4x под CooCox нет в сети, или не нашел.
|
|
|
|
12.09.2014, 19:25
|
#1072
|
Гражданин KAZUS.RU
Регистрация: 25.11.2009
Сообщений: 609
Сказал спасибо: 37
Сказали Спасибо 140 раз(а) в 72 сообщении(ях)
|
Re: Кто-нибудь работал с RF модулями nRF2401A?
в этой теме лежала для стм32
|
|
|
|
12.09.2014, 22:18
|
#1073
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: Кто-нибудь работал с RF модулями nRF2401A?
От кокоса, похоже, совсем мозги спекаются.
|
|
|
|
15.11.2014, 21:04
|
#1074
|
Частый гость
Регистрация: 05.05.2011
Сообщений: 16
Сказал спасибо: 1
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
|
Re: Кто-нибудь работал с RF модулями nRF2401A?
Не получается настроить нормальную связь двух трансмиттеров с использованием контрольной суммы в пакете. Использую библиотеку Easyrider83.
Вот настройка передатчика:
Код:
|
RF_InitStruct.RF_Power_State=RF_Power_On;
RF_InitStruct.RF_Config=RF_Config_IRQ_RX_Off|RF_Co nfig_IRQ_TX_On|RF_Confing_IRQ_Max_Rt_On;
RF_InitStruct.RF_CRC_Mode=RF_CRC16_On;
RF_InitStruct.RF_Mode=RF_Mode_TX;
RF_InitStruct.RF_Pipe_Auto_Ack=RF_Pipe_All_Ack_Dis able;//RF_Pipe_All_Ack_Disable;//RF_Pipe0_Ack_Enable;
RF_InitStruct.RF_Enable_Pipe=RF_Pipe0_Enable;
RF_InitStruct.RF_Setup=RF_Setup_5_Byte_Adress;
RF_InitStruct.RF_TX_Power=RF_TX_Power_High;
RF_InitStruct.RF_Data_Rate=RF_Data_Rate_1Mbs;
RF_InitStruct.RF_Channel=53;
RF_InitStruct.RF_RX_Adress_Pipe0[0]=0x11;
RF_InitStruct.RF_RX_Adress_Pipe0[1]=0x22;
RF_InitStruct.RF_RX_Adress_Pipe0[2]=0x33;
RF_InitStruct.RF_RX_Adress_Pipe0[3]=0x44;
RF_InitStruct.RF_RX_Adress_Pipe0[4]=0x55;
RF_InitStruct.RF_TX_Adress[0]=RF_InitStruct.RF_RX_Adress_Pipe0[0];
RF_InitStruct.RF_TX_Adress[1]=RF_InitStruct.RF_RX_Adress_Pipe0[1];
RF_InitStruct.RF_TX_Adress[2]=RF_InitStruct.RF_RX_Adress_Pipe0[2];
RF_InitStruct.RF_TX_Adress[3]=RF_InitStruct.RF_RX_Adress_Pipe0[3];
RF_InitStruct.RF_TX_Adress[4]=RF_InitStruct.RF_RX_Adress_Pipe0[4];
RF_InitStruct.RF_Payload_Size_Pipe0=16;
RF_InitStruct.RF_Auto_Retransmit_Count=1;
RF_InitStruct.RF_Auto_Retransmit_Delay=1; |
Вот настройка приемника:
Код:
|
RF_InitStruct.RF_Power_State=RF_Power_On;
RF_InitStruct.RF_Config=RF_Config_IRQ_RX_On|RF_Con fig_IRQ_TX_Off|RF_Confing_IRQ_Max_Rt_Off;
RF_InitStruct.RF_CRC_Mode=RF_CRC_Off;
RF_InitStruct.RF_Mode=RF_Mode_RX;
RF_InitStruct.RF_Pipe_Auto_Ack=RF_Pipe_All_Ack_Dis able;//RF_Pipe0_Ack_Enable;//RF_Pipe_All_Ack_Disable;
RF_InitStruct.RF_Enable_Pipe=RF_Pipe0_Enable;
RF_InitStruct.RF_Setup=RF_Setup_5_Byte_Adress;
RF_InitStruct.RF_TX_Power=RF_TX_Power_High;
RF_InitStruct.RF_Data_Rate=RF_Data_Rate_1Mbs;
RF_InitStruct.RF_Channel=53;
RF_InitStruct.RF_RX_Adress_Pipe0[0]=0x11;
RF_InitStruct.RF_RX_Adress_Pipe0[1]=0x22;
RF_InitStruct.RF_RX_Adress_Pipe0[2]=0x33;
RF_InitStruct.RF_RX_Adress_Pipe0[3]=0x44;
RF_InitStruct.RF_RX_Adress_Pipe0[4]=0x55;
RF_InitStruct.RF_TX_Adress[0]=RF_InitStruct.RF_RX_Adress_Pipe0[0];
RF_InitStruct.RF_TX_Adress[1]=RF_InitStruct.RF_RX_Adress_Pipe0[1];
RF_InitStruct.RF_TX_Adress[2]=RF_InitStruct.RF_RX_Adress_Pipe0[2];
RF_InitStruct.RF_TX_Adress[3]=RF_InitStruct.RF_RX_Adress_Pipe0[3];
RF_InitStruct.RF_TX_Adress[4]=RF_InitStruct.RF_RX_Adress_Pipe0[4];
RF_InitStruct.RF_Payload_Size_Pipe0=16;
RF_InitStruct.RF_Auto_Retransmit_Count=1;
RF_InitStruct.RF_Auto_Retransmit_Delay=1; |
так приемник данные принимает нормально , стоит только на приемнике установить
Код:
|
RF_InitStruct.RF_CRC_Mode=RF_CRC16_On; |
то ни одного пакета не принимается....
В чем может быть проблема?
|
|
|
|
15.11.2014, 21:21
|
#1075
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: Кто-нибудь работал с RF модулями nRF2401A?
Вероятно, принимает он все таки не данные, а мусор с эфира?
Конфиг рабочий. Железо исправно? 0x0E функция инитиализации возвращает?
Последний раз редактировалось Easyrider83; 15.11.2014 в 21:50.
|
|
|
|
15.11.2014, 21:45
|
#1076
|
Прописка
Регистрация: 06.05.2008
Адрес: Пятигорск
Сообщений: 222
Сказал спасибо: 11
Сказали Спасибо 17 раз(а) в 13 сообщении(ях)
|
Re: Кто-нибудь работал с RF модулями nRF2401A?
Сообщение от STM32F4
|
Попробую описать мою конфигурацию!
Для первого запуска обмена данных я решил попробовать настроить микросхемы с минимальной настройкой, дабы уменьшить количество ошибок )
И так, что я сделал на передатчике:
1. CONFIG|=PWR_UP включаю микросхему
2. Жду 10мкс
3. CONFIG&=~PRIME_RX настраиваю на передачу данных
4. записываю 5-ть байт(0x78,0x78,0x78,0x78,0x7 в регистр TX_ADDR(0x10) и RX_PW_P0(0x0A) ! не знаю зачем я это делаю, но говорят надо!
На этом моя инициализация передатчика закончилась!!!!!!!!!!
5. Теперь начинаем передавать данные:
5.1 NSS=0; сброс огибающей
5.2 отправляю команду W_TX_PAYLOAD(0xA0)
5.3 следом отправляю байт данных
5.4 NSS=1; огибающая
5.5 поднимаем линию CE
5.6 жду 10мкс
5.7 опускаем линию CE
5.8 ВСЕ, по идее данные должны уйти в эфир!
6. Проверяем регистр STATUS(0x07) там все время лежит 0x1F. а в регистре FIFO_STATUS(0x17) лежит 0x21.
Теперь приемник:
1. CONFIG|=PWR_UP включаю микросхему
2. Жду 10мкс
3. CONFIG|=PRIME_RX настраиваю на прием данных
4. записываю 5-ть байт(0x78,0x78,0x78,0x78,0x7 в регистр TX_ADDR(0x10) и RX_RW_P0(0x0A) !
ВСЕ, инициализация приемника закончилась!
5. теперь в цикле читаю регистр STATUS(0x07) и там все время лежит 0x0E.
Так же для приемника и передатчика у меня настроено прерывание от ножки IRQ! ни на передатчике ни на приемнике не разу не происходило перываний (Хотя по идее, после неудачной отправки передатчиком должно произойти прерывание и выставиться флаг MAX_RT в регистре STATUS(0x07).
Подскажите пожалуйста? что не так ?
|
5-ть байт надо записываю(0x78,0x78,0x78,0x78,0x7 в регистр TX_ADDR(0x10) и RX_ADDR_P0. А в RX_PW_P0(0x0A) указывается количество принимаемых байт. По умолчанию ничего не принимается.
|
|
|
|
15.11.2014, 21:51
|
#1077
|
Частый гость
Регистрация: 05.05.2011
Сообщений: 16
Сказал спасибо: 1
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
|
Re: Кто-нибудь работал с RF модулями nRF2401A?
Принимает то что я передаю, кроме последнего байта почемуто...
Передаю так:
Код:
|
unsigned char tx[16]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x0 9,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F};
..............
RF_SendPayload(&tx[0], 16);
DelayMs(300); |
На приемнике последний (16) байт принимается как 0x0E.. Сейчас посмотрю что реально уходит на передатчик по spi.
|
|
|
|
15.11.2014, 22:13
|
#1078
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: Кто-нибудь работал с RF модулями nRF2401A?
Лучше так:
RF_SendPayload(tx, 16);
или так:
RF_SendPayload(tx, sizeof(tx));
|
|
|
|
15.11.2014, 22:29
|
#1079
|
Частый гость
Регистрация: 05.05.2011
Сообщений: 16
Сказал спасибо: 1
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
|
Re: Кто-нибудь работал с RF модулями nRF2401A?
Цитата:
|
Лучше так:
RF_SendPayload(tx, 16);
или так:
RF_SendPayload(tx, sizeof(tx));
|
Не соглашусь.
В первом варианте мы неявно передаем адрес первого элемента массива tx, работать будет, но ничем не отличается от &tx[0], где я явно указываю что передаю адрес первого элемента массива tx.
Насчет sizeof(tx).. А если у меня массив tx размерностью скажем 255? но передать нужно лишь первые 16 байт.
Но в общем то посмотрел в передатчике по spi передается то что нужно, 16 байт 0x00...0x0F а на приемнике принимается 0x00...0x0E,0x0E
|
|
|
|
16.11.2014, 03:58
|
#1080
|
Частый гость
Регистрация: 05.05.2011
Сообщений: 16
Сказал спасибо: 1
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
|
Re: Кто-нибудь работал с RF модулями nRF2401A?
Разобрался!
Проблема была в передатчике.
В логике работы функции отправки байта по SPI.
Код:
|
uint8_t SPI_ReadByte(uint8_t byte){
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
SPI_I2S_SendData(SPI1,byte);
while (SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_RXNE)==RE SET);
return SPI_I2S_ReceiveData(SPI1);
} |
При такой логике работы, низкой скорости SPI и высокой частоты тактирования контроллера происходит следующее:
флаг SPI_I2S_FLAG_RXNE выставляется раньше заднего фронта SCK, а ввиду того что это последний байт, после этого следует поднять линию CS. Так вот CS поднимался раньше чем контроллер SPI отдавал задний фронт SCK (видно в прикрепленном изображении), что наверное приводило к сбою в nrf24 при защелкивании последнего байта и он не воспринимался.
Странно то, что nrf24 на место последнего байта ставил предыдущий, но CRC обсчитывалось то ли от 15 байт, то ли от верных 16 байт, а в канал уходило 16 байт, но с 16 байтом равным 15му. Отсюда и не совпадение CRC на приемнике.
Решение проблемы: Вставить задержку перед поднятием CS или увеличить скорость SPI. Проверка флага BSYв статус-регистре SPI не дает положительного результата. Возможно это косяк SPI в STM32f103, глубже пока не копал.
Ах да, скорость SPI была ~250кГц, при 1МГц и частоте ядра 72MHz этот баг уже не проявляется.
Последний раз редактировалось zenekk; 16.11.2014 в 04:14.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 03:38.
|
|