Работаем с USB стеком nRF24LU1+. Часть 1

Данная статья описывает работу у USB стеком модуля nRF24LU1+. В первой части небольшое введение, установка софта и SDK, Hello World.
Во второй части рассмотрим инициализацию, энумерацию, поддержку WinUSB и обмен данных с хостом. Предполагается что читатель имеет первоначальное понятие о USB. Если нет, то советую ознакомится с отличным мануалом.


47873b2e05fc40ce8d1a46c34f294d0c.JPG

Свои чипы я заказал на ebay. В комплекте были 2 модуля и SPI программатор. Сразу ложка дегтя для тех кто заказывает такой же комплект. В разъеме программирования на самом модуле отсутствует линия reset. Без него ISP программирование не работает. Пришлось аккуратно подпаивать.
b7083d96f15b45d9a906b72aee768023.jpg

В принципе, чипы можно программировать через встроенный бутлоадер (и даже написать свой). Так же есть куча SPI флешеров на основе ftdi, arduino и прочего. Процесс программирования аналогичен чипу nrf24le1.

Чип nRF24LU1+ представляет из себя:

  • трансивер nRF24l01+ работающий на 2.4ГГц
  • full speed USB 2.0 контроллер
  • 8 битный мироконтроллер с ядром Intel MCS 51
  • 16 или 32 кб флеша

Внутреннее устройство чипа:
6a35e9b1f06045e3947c8ff2aca51f11.PNG
Из особенностей стоит упомянуть что быстрой оперативки всего 256 байт (IRAM). Остальные 2 кб (SRAM) расположены на внешней шине, соответственно доступ к ним медленнее. Так же присутствует модуль шифрования.

Настройка Keil, nRFgo SDK и Hello World


Все разработка будет вестись в среде Keil и nRFgo SDK. Скачиваем, устанавливаем (тыц, тыц).
Пару слов об организации проекта. Я создал вот такую структуру. Compiler, HAL и LIB скопировал из nRFgo SDK. В папке Projects будут лежать уже непостредственно проеты

├───compiler
│   ├───c51
│   ├───common
│   └───icc8051
├───hal
│   ├───nrf24l01p
│   ├───nrf24le1
│   └───nrf24lu1p
├───lib
│   ├───adns7530
│   ├───assertions
│   ├───crypt
│   ├───display
│   ├───eeprom
│   ├───eeprom255
│   └───rf_test
└───projects
     └───HelloWolrd


Заходим в Keil. Project — New uVision Prject. Выбираем каталог с проектом, вводим название проекта. Далее выбираем чип как на картинке, со всем соглашаемся.
c1f54868bded418b9f006034ef9bc3fe.PNG
Далее, добавляем новый исходник в проект (правый клик по Source Group 1 — Add New Iteam)

Первая программа, бесконечно печатаем в UART «Hello World!»

#include 
#include "nrf24lu1p.h"
#include "hal_uart.h"
#include "hal_delay.h"

char putchar(char c)
{
  hal_uart_putchar(c);
  return c;
}

void putstring(char *s)
{
  while(*s != 0)
    putchar(*s++);
}

void main(void)
{
        P0DIR = 0x00;
        hal_uart_init(UART_BAUD_57K6);
        EA = 1;

  for(;;)
  {
                putstring("\r\nHello World!\r\n");
                delay_ms(1000);
   }
}


Так же к проекту нужно добавить два файла:

hal\nrf24lu1p\hal_uart.c
hal\hal_delay.c


Читатель уже, наверное, понял что мы подключаем исходники для именно для нашего чипа
Что бы все корректно собралось нужно нужно поставить несколько галочек и прописать Include Path для компилятора.
Правый клин по проекту — Options.
e56a94ec63a04261b4e189e5c8b59a48.PNG
Во кладке Output ставим галочку Create HEX file.
Далее во вкладке С51 прописываем Include

..\..\hal;..\..\hal\nrf24lu1p;..\..\compiler\c51;..\..\compiler\common;


Собираем проект. Получившийся hex файл заливаем программатором в контроллер. В моем случае китайцы прислали вот такую софтину. Сам программатор определяется как HID устройство, драйверов не требует. Перед программированием чип надо обязательно стереть.
Софтину можно скачать здесь.
e06d54cc09c94213b6f26e56b108d553.PNG

Если все сделали правильно, в UART раз в секунду будут сыпаться Hello World.

Продолжение в следующий части. Будет рассмотрена инициализация USB, энумерация, поддержка WinUSB и обмен с хостом.
Вторая часть

© Geektimes