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

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

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

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

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

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

903be61f6d6f42309c31f9168c84148d.png

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

907cf3cd60e446dc988f38cf6116dbbf.png

Со стороны прошивки 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 */ Думаю, тут всё ясно.Исходный код прошивки можно взять здесь. Проект под Eclipse с плагином GCC ARM.

© Habrahabr.ru