Как стать автором
Обновить

Как я начинал работать с nRF24LE или ещё один способ запрограммировать этот чип

Время на прочтение3 мин
Количество просмотров31K
Попали мне в руки чипы NRF24LE1E в модульном исполнении с маркировкой на пузе XL24LE1-D01.
Вот такие вот:

image

Взял я их на собственные эксперименты, но речь пойдёт не об этом. Выбор пал на этот чип, так как в нём уже есть свой процессор на базе 8051, что не может не радовать. Я бегло пролистал даташит, и вроде ничего не вызвало вопросов. Мол, получим — а там разберёмся. И вот модули у меня.

Первое, с чем я столкнулся — как его запрограммировать? Другими словами — как записать в него прошивку? В даташите нашлось описание процедуры программирования через SPI порт. Отлично!

Прежде чем изобретать велосипед, я спросил у Гугла, а не изобрёл ли кто чего до меня? Как оказалось, изобрели. У здешнего пользователя MaksMS есть публикация «Программируем nRF24LE1 через Raspberry PI и USBasp», но в ней описывается метод работы с Raspberry PI, или как альтернатива USBasp. Первого у меня нет, а второе я закинул в такой дальний угол и думал, что уже никогда не вернусь к этим творениям AVR. Но судьба — злодейка, потащила меня обратно.

Так вот, нашёл я этот USBasp и залил в него предложенную прошивку. Собрал софтину программатора под Windows, не без проблем, кстати, но собрал. У меня даже с трудом получилось записать предложенный MaksMS'ом пример с миганием диодом. Но это стоило невероятных усилий. Всё это написано настолько на скорую руку, что просто вызывает отвращение. Всё сырое и шаткое. И прошивает достаточно медленно.

В общем, решил что-то с этим сделать. Я уже давненько перешёл на детища STM и у меня достаточно много платок с процом STM32F103. Решил попробовать всё-таки изобрести велосипед. За основу взял пример DFU из пакета библиотек STM USB FS. К этому примеру прилагается шикарная утилита для программирования и драйвер.



На скриншоте выше видно, что помимо Внутренней Flash процессора есть ещё SPI и nRF. Просто у меня была плата с процессором и припаянным к нему SPI флешем, и я решил оставить. Ну мало ли. Так же добавил nRF как дополнительную область памяти. Пришлось, конечно, извернуться и «промаппить» его аж в 0x14000000, но, думаю в частном случае на это всё равно.



Со стороны прошивки DFU этот адрес, конечно же, отбрасывается.

Дописал небольшой «драйвер» для работы с чипом nRF24LE1 — и, вуаля, можно прошивать через DFU интерфейс. В ходе написания возникли кое-какие вопросы, такие как «Как долго флеш стирается?» Пока жду по 10ms и считываю статус бита RDY и WEN, итого уходит около 3 ожиданий. Но было замечено, что если ждать меньшее количество времени, к примеру, 1ms, то операция записи/стирания флеша может вообще не закончится. Отвлекаю я его что ли…

Второй вопрос: «С какой максимальной скоростью можно работать с процом по SPI?» Сейчас в коде стоит примерно следующее:

  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
  SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
  SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
  SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_64;
  SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
  SPI_InitStructure.SPI_CRCPolynomial = 7;
  SPI_Init(SPI_SPI, &SPI_InitStructure);

Делитель 64, основная частота процессора 72MHz. Меня пока устраивает, всё быстрее чем USBasp.

Вот, вроде бы, и всё. Надеюсь, это кому-то поможет.

Ах, да! Совсем забыл упомянуть, как подключать:

#define SPI_SCK_PIN                   GPIO_Pin_13                 /* PB.13 */
#define SPI_MISO_PIN                  GPIO_Pin_14                 /* PB.14 */
#define SPI_MOSI_PIN                  GPIO_Pin_15                 /* PB.16 */
#define SPI_CS_PIN                    GPIO_Pin_12                 /* PB.12 */
#define SPI_PROG_PIN                  GPIO_Pin_10                 /* PC.10 */

Думаю, тут всё ясно.

Исходный код прошивки можно взять здесь, а теперь и на GitHub. Проект под Eclipse с плагином GCC ARM.

16.05.2015 + Добавил Git с исходниками проекта по рекомендации beresovskiy
Теги:
Хабы:
Всего голосов 22: ↑21 и ↓1+20
Комментарии2

Публикации