Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
Vadimm1001
0 / 0 / 0
Регистрация: 18.03.2018
Сообщений: 55
#1

Не удается прочитать/записать регистр с nrf24l01+

07.08.2018, 11:51. Просмотров 119. Ответов 16

Вот сам код:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
unsigned char r_register(unsigned char a)//чтение байта из озу. a-адрес байта
{
  ClearBit(PORTB,CSN);//Прижимаем вывод CSN(SS) МК к земле, тем самым сообщаем о начале обмена данных.
  SPDR=a;
  while(BitIsClear(SPSR,SPIF));//ожидаем когда освободится SPI для последующей записи байта
  
  SPDR=NOP;
  while(BitIsClear(SPSR,SPIF));
  SetBit(PORTB,CSN);//Вывод CSN(SS) МК к питанию, обмен данных завершен.
  return SPDR;
}//uint8_t a=r_register(CONFIG);
 
void w_register(unsigned char a,unsigned char b)//а-адрес регистра, b-что пишем в регистр.
{
  a=a | W_REGISTER;//накладываем маску
  ClearBit(PORTB,CSN);
  SPDR=a;
  while(BitIsClear(SPSR,SPIF));
  SPDR=b;
  while(BitIsClear(SPSR,SPIF));
  a=SPDR;//это для сброса флага SPIF
  SetBit(PORTB,CSN);
}//W_REGISTER (CONFIG,0b00000110);
 
int main(void)
{
  lcd_init();
  DDRB=0b101101;
SPCR = (0<<SPIE)|(1<<SPE)|(0<<DORD)|(1<<MSTR)|(0<<CPOL)|(0<<CPHA)|(0<<SPR1)|(0<<SPR0);
SPSR = (0<<SPIF)|(0<<WCOL);
  w_register(0x11,0b11);
  lcd_dat(r_register(0x11));
  while(1);
  
}
Здесь я записываю 0b11 в регистр по адресу 0x11, потом потом вывожу это значение на жк, но значение все равно 0.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.08.2018, 11:51
Ответы с готовыми решениями:

Как прочитать регистр(ы) состояния отказа доступа к памяти в IAR Embedded Workbench?
Помогите разобраться пожалуйста. В обработчике исключения MemManage_Handler...

NRF24L01+DS18B20
Здравствуйте! Разрабатываю беспроводной датчик в связке ds18b20 + nrf24l01 с...

Attiny13 + NRF24L01
Ребята,доброго всем времени суток. Сейчас хочу собрать одно устройство, но для...

PIC+nRF24L01
Необходимо &quot;соединить&quot; PIC-и посредством модулей nRF24L01. Изобретать велосипед...

nRF24L01 на аttiny84
всем привет! помогите плиииз портировать код nRF24L01 на аttiny84 с мк...

16
ValeryS
Модератор
7163 / 5430 / 674
Регистрация: 14.02.2011
Сообщений: 18,334
07.08.2018, 15:02 #2
Цитата Сообщение от Vadimm1001 Посмотреть сообщение
Здесь я записываю 0b11 в регистр по адресу 0x11
0x11 регистр это что?
камень какой?
вот статья про работу 24L01
http://blog.sci-smart.ru/2013/06/nrf24l01.html
а вообще их в интернете куча достаточно набрать "Радиомодуль nRF24L01+ быстрый старт."
0
Vadimm1001
0 / 0 / 0
Регистрация: 18.03.2018
Сообщений: 55
07.08.2018, 18:01  [ТС] #3
Цитата Сообщение от ValeryS Посмотреть сообщение
0x11 регистр это что?
Тот что на скрине.
Цитата Сообщение от ValeryS Посмотреть сообщение
камень какой?
ATMEGA8.
Вывод CE и IRQ у меня висит в воздухе, это приемлемо?
Тут даже при чтении регистра STATUS ноль выводит, в чем может быть проблема?
0
Миниатюры
Не удается прочитать/записать регистр с nrf24l01+  
ValeryS
Модератор
7163 / 5430 / 674
Регистрация: 14.02.2011
Сообщений: 18,334
07.08.2018, 20:58 #4
Цитата Сообщение от Vadimm1001 Посмотреть сообщение
в чем может быть проблема?
скорее всего вот в этом
Цитата Сообщение от Vadimm1001 Посмотреть сообщение
Вывод CE...у меня висит в воздухе,
CE ChipEnable грубо говоря включить микросхему, когда на ней 0 то идет обмен данными по SPI когда не 0 то микросхема отключается от SPI
Цитата Сообщение от Vadimm1001 Посмотреть сообщение
Тот что на скрине.
ну и что это означает?
0
Vadimm1001
0 / 0 / 0
Регистрация: 18.03.2018
Сообщений: 55
08.08.2018, 08:49  [ТС] #5
Цитата Сообщение от ValeryS Посмотреть сообщение
CE ChipEnable грубо говоря включить микросхему, когда на ней 0 то идет обмен данными по SPI когда не 0 то микросхема отключается от SPI
в nrfке если эта линия стоит в 1 то модуль в режиме приема, если в 0 то в режиме передачи.
За выбор чипа отвечает вывод CSN.
Цитата Сообщение от ValeryS Посмотреть сообщение
ну и что это означает?
Да я сам не знаю, мне просто нужен был пример.
Даже если линию MISO от радиомодуля подключить в обычному пину и в цикле проверять этот вывод при этом дрыгать SCK
то радиомодуль ничего не выдает, хотя должен регистр status как минимум выдать(если его значение не 0x00 конечно).
0
ValeryS
Модератор
7163 / 5430 / 674
Регистрация: 14.02.2011
Сообщений: 18,334
08.08.2018, 09:28 #6
Цитата Сообщение от Vadimm1001 Посмотреть сообщение
в nrfке если эта линия стоит в 1 то модуль в режиме приема, если в 0 то в режиме передачи.
виноват попутал названия одни и те же
но вот что написано в статье на которую я кидал ссылку
CE: Chip Enable. Зависит от режима работы. Если чип сконфигурен как приемник, то высокий (HIGH) уровень на CE позволяет чипу мониторить среду и получать пакеты. Низкий (LOW) уровень переводит чип в Standby-I и такая возможность становится уже недоступна. Если чип настроен на передачу, CE всегда держится на низком уровне. В этом случае для передачи данных нужно положить их в очередь FIFO и дернуть CE минимум на 10мкс (LOW->HIGH, 10мкс, HIGH->LOW).
т.е не выводом управляется режим
в первый регистр(0x00) нужно записать управляющее слово, который настроит и включит чип
Цитата Сообщение от Vadimm1001 Посмотреть сообщение
хотя должен регистр status как минимум выдать
у тебя он спит еще
Цитата Сообщение от Vadimm1001 Посмотреть сообщение
Да я сам не знаю,
это регистр,насколько помню, передачи, до того как что то передавать нужно настроить микросхему
0
Vadimm1001
0 / 0 / 0
Регистрация: 18.03.2018
Сообщений: 55
08.08.2018, 10:16  [ТС] #7
Вот этот регистр по адресу 0x00:
C
1
2
3
4
5
6
7
8
9
/*регистр CONFIG*/    //Конфигурационный регистр
        #define CONFIG          0x00
        #define MASK_RX_DR  6 //вкл/откл прерывание от бита RX_DR в рег. STATUS. 0-вкл, 1-выкл.
        #define MASK_TX_DS  5 //вкл/откл прерывание от бита TX_DS в рег. STATUS. 0-вкл, 1-выкл.
        #define MASK_MAX_RT 4 //вкл/откл прерывание от бита MAX_RT в рег. STATUS. 0-вкл, 1-выкл.
        #define EN_CRC      3 //включение CRC. По умолчанию вкл. если один из битов регистра EN_AA включен.
        #define CRCO        2 //режим CRC. 0-1 байт, 1-2 байта.
        #define PWR_UP      1 //1-POWER UP, 0-POWER DOWN, по умолчанию 0.
        #define PRIM_RX     0 //0-режим передачи, 1-режим приема.
Цитата Сообщение от ValeryS Посмотреть сообщение
в первый регистр(0x00) нужно записать управляющее слово, который настроит и включит чип
То есть в бит PWR_UP мне нужно записать единицу и только тогда я смогу читать и т.п с микросхемы?
И кстати что-то я смог прочитать с регистра STATUS, но значения неадекватные, от 255 до 36 значения прыгают, но это скорей потому что я как раз таки не инициализировал регистр CONFIG.
И почему на картинке MISO подключен к MISO а MOSI к MOSI?
Это же неправильно? Или у них там библиотека такая?
0
Миниатюры
Не удается прочитать/записать регистр с nrf24l01+  
ValeryS
Модератор
7163 / 5430 / 674
Регистрация: 14.02.2011
Сообщений: 18,334
08.08.2018, 11:42 #8
Цитата Сообщение от Vadimm1001 Посмотреть сообщение
И почему на картинке MISO подключен к MISO а MOSI к MOSI?
правильно
MISO Master Input Slave Output
MOSI Master Output Slave Input
в данном случае Master это МК а Slave 24L01
0
Vadimm1001
0 / 0 / 0
Регистрация: 18.03.2018
Сообщений: 55
08.08.2018, 16:04  [ТС] #9
ValeryS,
Что здесь может быть не так?
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int main(void)
{
    lcd_init();
    
    SPCR = (0<<SPIE)|(1<<SPE)|(0<<DORD)|(1<<MSTR)|(0<<CPOL)|(0<<CPHA)|(1<<SPR1)|(1<<SPR0);
    SPSR = (0<<SPIF)|(0<<WCOL);
    spi_init();
    w_register(CONFIG,(1<<PWR_UP)|(1<<EN_CRC)|(0<<PRIM_RX));
    _delay_us(150);
    
    
    ClearBit(PORTB,CSN);//Прижимаем вывод CSN(SS) МК к земле, тем самым сообщаем о начале обмена данных.
    SPDR=0xF0;//пишем в SPDR что нибудь.
    while(BitIsClear(SPSR,SPIF));//ожидаем когда освободится SPI.
    SetBit(PORTB,CSN);//Вывод CSN(SS) МК к питанию, обмен данных завершен.
    lcd_dat(SPDR);
    
    
    while(1);
 
}
Иногда на жк выводится число иногда нет, почему такое может быть?
Возможно что цикл становиться бесконечным?
0
ValeryS
Модератор
7163 / 5430 / 674
Регистрация: 14.02.2011
Сообщений: 18,334
08.08.2018, 16:36 #10
Цитата Сообщение от Vadimm1001 Посмотреть сообщение
Возможно что цикл становиться бесконечным?
разумеется
Цитата Сообщение от Vadimm1001 Посмотреть сообщение
C
1
while(1);
это и есть бесконечный цикл
или ты про
Цитата Сообщение от Vadimm1001 Посмотреть сообщение
C
1
while(BitIsClear(SPSR,SPIF));//ожидаем когда освободится SPI.
0
Vadimm1001
0 / 0 / 0
Регистрация: 18.03.2018
Сообщений: 55
08.08.2018, 16:37  [ТС] #11
Цитата Сообщение от ValeryS Посмотреть сообщение
или ты про
Сообщение от Vadimm1001
C
1
while(BitIsClear(SPSR,SPIF));//ожидаем когда освободится SPI.
да про него.
Что то вообще никак не получается прочитать с платы ничего, ноль да ноль всегда. Что не так то понять не могу.
Он же что-то пытается, ведь если отключить от него питание на дисплей выводится 255, а при питании просто 0.
Я уж и через цикл for все регистры пытался прочитать и все равно везде ноль.
0
ValeryS
Модератор
7163 / 5430 / 674
Регистрация: 14.02.2011
Сообщений: 18,334
08.08.2018, 16:53 #12
я с железным SPI на AVR никогда не работал
поэтому ни могу ничего сказать
попробуй программный SPI тогда будет понятно что глючит, ну еще бы неплохо сигналы смотреть анализатором или осцилографом
программная реализация приема/ передачи байта выглядит примерно так
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
unsigned char ProgramSPI(unsigned char data)
{
 unsigned char tmp=0;
 
   for(unsigned char i=0x80; i!=0;i>>=1)
   {
     if((data&i)==0)
       ClearBit(PORTSPI,PIN_MOSI);
     else
       SetBit(PORTSPI,PIN_MOSI);
     SetBit(PORTSPI,PIN_CLK);  
     delay(10);
     ClearBit(PORTSPI,PIN_CLK);  
    if(readPin(PORTSPI,PIN_MISO)!=0)
        tmp|=i;
   delay(10);
 
  }
 return tmp;
}
0
Vadimm1001
0 / 0 / 0
Регистрация: 18.03.2018
Сообщений: 55
08.08.2018, 16:58  [ТС] #13
Цитата Сообщение от ValeryS Посмотреть сообщение
попробуй программный SPI тогда будет понятно что глючит
Попробую, а что железный SPI не всегда надежен?
0
ValeryS
Модератор
7163 / 5430 / 674
Регистрация: 14.02.2011
Сообщений: 18,334
08.08.2018, 17:09 #14
Цитата Сообщение от Vadimm1001 Посмотреть сообщение
а что железный SPI не всегда надежен?
еще раз повторюсь
Цитата Сообщение от ValeryS Посмотреть сообщение
я с железным SPI на AVR никогда не работал
поэтому сказать ничего не могу
в данном случае у тебя непонятно где затык, то ли подключение неправильное, то ли 24L01 дохлая, то ли SPI не запускается
переходом на программный SPI мы один элемент выкидываем
0
Vadimm1001
0 / 0 / 0
Регистрация: 18.03.2018
Сообщений: 55
08.08.2018, 18:12  [ТС] #15
Цитата Сообщение от ValeryS Посмотреть сообщение
то ли SPI не запускается
Это кстати более возможно, потому что цикл этот не стабильный какой-то:
C
1
while(BitIsClear(SPSR,SPIF));//ожидаем когда освободится SPI.
Жаль осциллографа у меня нет.
0
Voland_
1645 / 992 / 95
Регистрация: 04.01.2010
Сообщений: 3,275
09.08.2018, 21:56 #16
Цитата Сообщение от Vadimm1001 Посмотреть сообщение
Иногда на жк выводится число иногда нет, почему такое может быть?
если "иногда" означает пробы при перекомпиляции кода - попробуйте поставить nop() между записью в SPDR и чтением SPSR регистров.
И побалуйтесь с настройками "(0<<CPOL)|(0<<CPHA)". Может быть nrf24l01 как-то нестандартно общается. Я так, навскидку не помню что там надо ставить (и с L01 и c LE01 были проекты), но там все запуститься должно с пол-пинка.

PS: вам нужен логический анализатор. Вещь не дорогая, но в этих случаях - это просто спасение.

Добавлено через 39 секунд
...еще, где ваш инит ножек SPI?
0
Vadimm1001
0 / 0 / 0
Регистрация: 18.03.2018
Сообщений: 55
Вчера, 07:19  [ТС] #17
Цитата Сообщение от Voland_ Посмотреть сообщение
...еще, где ваш инит ножек SPI?
Он есть просто его не видно
0
Вчера, 07:19
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
Вчера, 07:19

Atmega и NRF24L01+ не работают
Всем доброго времени суток. Мне нужна помощь с кодом для nrf24l01+ на...

nRF24L01+ с антенной. Аппаратная закладка.
Эту тему создал для информирования участников форума. Несколько дней парился...

помогите: atmega8 + arduino + nrf24l01
Помогите подружить Atmega8 с Arduino с помощью радио передатчика nrf24l01. Уже...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru