CC2531/CC2540. Настройка CDC.

Один из больших плюсиков HAL библиотеки это очень легкая настройка CDC устройства.



А вообще в HAL либе очень много минусов. Мало документации, нужно постоянно ковыряться в коде, USB стек фактически не описан и все это дело вмонтировано в OSAL. Хотя есть и отдельная версия HAL и USB стека, без OSAL, которая немного отличается. Но помним, что BLE и Z-Stack крепко связан с OSAL.

А теперь о приятном. Чтоб создать CDC устройство нужно всего-лишь две функции! После такого стек LUFA кажется слишком запутанным и тяжелым.

Сначала нужно добавить два дефайна
HAL_UART_USB
HAL_UART_BAUD_RATE=256000


И по факту на этом вся настройка закончилась :) Она вообще закончилась! Т.к. теперь мы просто работаем с обычным USART-ом. Используются те же функции.

Осталось настроить USART

halUARTCfg_t uartConfig;
.....
.....
        HalUARTInit();
	
	// configure UART
	uartConfig.callBackFunc         = myCBfunction;

	// start UART
	// Note: Assumes no issue opening UART port.
	(void)HalUARTOpen (0, &uartConfig);  //0 - это номер порта. Не используется.


Готово.

myCBfunction — это калбек функция. В нее будут передаваться различные события CDC.

void myCBfunction(uint8 port, uint8 event)
{
  (void)port;

  switch (event)
  {
  case HAL_UART_RX_FULL:
  case HAL_UART_RX_ABOUT_FULL:
  case HAL_UART_RX_TIMEOUT:
    // Make a call to HalUARTRead() and parse the incoming data.
    break;

  case HAL_UART_TX_FULL:
    // Stop sending so much data so fast.
    break;

  case HAL_UART_TX_EMPTY:
    // Send some more data outgoing data with a call to HalUARTWrite().
    break;

  default:
    // Not expected.
    break;
  }
}


Тут у нас аж четыре события:
HAL_UART_RX_FULL/HAL_UART_RX_ABOUT_FULL — буфер RX полный.
HAL_UART_RX_TIMEOUT — сообщение не получено.
HAL_UART_TX_FULL — буфер TX полный.
HAL_UART_TX_EMPTY — вся информация отправлена.

На удивление очень просто. Работать тоже очень легко. Для этого используется только три функции.

len = Hal_UART_RxBufLen (0); 

Это и так понятно.

len = HalUARTRead (0,         //не используется 
                   buf,       //буфер 
                   5);        //получить 5ть байт

len - сколько было действительно прочитано. 


HalUARTWrite (0,    //не используется 
              buf,  //буфер 
              5);   //сколько байт отправить 


Это так просто, что даже не привычно. Не пойму, почему они так и с BLE и Z-Stack не поступили.
  • 0
  • 13 сентября 2012, 20:53
  • a9d

Комментарии (30)

RSS свернуть / развернуть
А может в начале заметки указать о какой именно HAL-библиотеке идет речь? Может ссылку на нее… А то дочитав до конца я конечно понял о чем речь, но где взять, куда поставить и для чего оно вообще есть — непонятно…
0
HAL идет вместе с BLE, Z-Stack и USB стеком.
0
  • avatar
  • a9d
  • 14 сентября 2012, 15:04
Ну я и говорю, что добавить это в начало заметки — и все встанет на свои места ;)
0
a9d, приветсвую Вас.
И прошу ответить на мои вопросы:
1. Можно выложить пример CDC программы? или подскажите, какие стандартные примеры смотреть.
2. Планируете ли используя CDC для передачи данных через Bluetooth.

Остальные вопросы постараюсь задавать уже в ветке форума
forum.easyelectronics.ru/viewtopic.php?f=6&t=11794&p=220853#p220853
0
Это и есть весь пример.

Еще нужно периодически вызывать HalUARTPoll(); Это я забыл написать.
0
Появилось время продолжить освоение сс2540, вот возникли вопросы:
Сначала нужно добавить два дефайна
HAL_UART_USB            (1)
HAL_UART_BAUD_RATE=256000    (2) 

(1) Можно также использовать HAL_UART=TRUE
(2) По поводу скорости 256000 в hal_uart.h написано

/* UART Ports */
/*
   Serial Port Baudrate Settings
   Have to match with baudrate table
   Note that when using interrupt service based UART configuration (as opposed to DMA)
  higher baudrate such as 115200bps may have problem when radio is operational at the same time.
*/
#define HAL_UART_BR_9600   0x00
#define HAL_UART_BR_19200  0x01
#define HAL_UART_BR_38400  0x02
#define HAL_UART_BR_57600  0x03
#define HAL_UART_BR_115200 0x04
0
Это только для USART. К USB это отношение не имеет.
0
Кстати я уже максимально близко приблизил OSAL к scmRTOS. Даже сервисы выглядят и работают почти идентично.
0
Что-то я запутался, мы же работаем через USB USART*ом микроконтроллера, с которого можно выжать максимум 115200.
Или все эти настройки нам дадут возможность управлять по HCI?
0
В статье идет речь о USB. Значит работаем с USB и скорость у нас фиксированная 12Mbit.
0
Я так понимаю Вы еще на сс2531 разобрались с работой CDC
0
Это одинаковые камни. В них только трансивер разный.
0
Подскажите, где более подробно почитать (может на примере сс2531), как настроить CDC, чтоб можно было сделать элементарную проверку послать бит и его же назад получить.
0
?? В статье весь код. Там больше ничего писать не нужно. Даже HalUARTPoll вызывать необязательно, его OSAL вызовет.
0
Как я понял, для простого теста достаточно будет:

1. Выставить дефайны для стандартного проекта HostTestRelease — CC2540USB
INT_HEAP_LEN=2900
HAL_UART_ISR_RX_MAX=250
HALNODEBUG
OSAL_CBTIMER_NUM_TASKS=1
POWER_SAVING
HAL_AES_DMA=FALSE
HAL_DMA=TRUE
HAL_UART
HAL_UART_USB
2. Скорость по умолчанию, для COM через USB = 115200

3. Код вставил в HostTest_Main.c, включив #include «hal_uart.h»:
halUARTCfg_t uartConfig;
unsigned char myByte = 0x55; 
HalUARTInit(); 
HalUARTOpen(0, &uartConfig );  

while(1)
{
      HalUARTWrite (0, &myByte, 1);      
}
И не работает.
Может всю настройку делать в другом месте, и вызывать передачу данных по спец. прерыванию?
0
Ясен хрен это не будет работать.
Если уж так нужны примеры то открой пример из USB Stack.
0
Хотя есть и отдельная версия HAL и USB стека…
Если уж так нужны примеры то открой пример из USB Stack.
Что-то они на моем пути не попадались, как понятие и как явление связанное с СС2540. Куда смотреть?
0
Никуда смотреть ненадо. Есть отдельный USB Stack с примерами, эти примеры по факту не нужны ибо там всего две три функции используется. Есть BLE и Z-Stack. В них уже USB Stack вмонтирован.
0
a9d, спасибо конечно, но видимо прямых наводок на мои ошибки не будет.
Ладно, на форуме TI, еще нашел пример, постараюсь с ним разобраться, т.к. у меня нету четкого представления, как работает связка USB-UART, из-за отсутствия теории, только краткие фразы на англо-язычных форумах, от людей которые учились на более ранних моделях.
После Нового Года обещают новый BLE-stack, может там что-то будет поновее и прозрачнее в работе…
0
Не будет там ничего нового. Там допилят раздельные либы.

USB к USART какого либо отношения не имеет.

while(1);

Можно влупить такой цикл а после удивляться почему программа весит и не работает.
0
while(1); — это уже от безысходности, с ни и без него все равно не работало.

Ладно вечером продолжу освоение.
0
День добрый.
Добавил вопрос на форуме, т.к. здесь не поместился бы.
Я так и не могу понять почему 3 строчки кода перед
/* Start OSAL */
  osal_start_system(); // No Return from here
вызывают подвисание USB dongle, может не тот проект взял за основу, может не те дефайны выставлены, может я просто еще не разобрался с принципом работы…
Взгляните, если не сложно.
форум ЕЕ
Спасибо
0
Пипец. Скачай уже USB stack и открой первый же пример. Я не пойму как вообще можно не правильно вызвать пару функций.
0
Спасибо, завязываю.
Первый раз это дело у меня с операционкой и как к ней подступиться разбираюсь методом тыка…
За ответы на детские вопросы благодарю и за ссылку на форуме…
0
0
Если у кого сохранился стэк, перезалейте плз, очень надо.
0
На оффсайте качается, надо только правильно форму заполнить. Правда, в некоторых браузерах до отображения кнопки Download дело не доходит. Я в хроме качаю.
0
На оффсайте написали, что свяжутся со мной по мылу и передадут ссылку, если буду достоин, но никаких сообщений не пришло (видимо попал в их чёрный список). Если не трудно, выложите на какой-нибудь ргхост и киньте ссылку (можно в личку), будьте так добры.
0
Возможно, неудачно или не полностью заполнил. Там нужно выбирать безобидные области применения и все такое.
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.