AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
23.01.2013, 09:18
|
|
Почётный гражданин KAZUS.RU
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,620
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
|
at90usb162/LUFA_CDC/не воткнусь (
Снова добрый день!
Имеется славный проект LUFA, мне из него нужен переходник USB(CDC)‹-›UART с возможностью настраивать (посылать команды) в эту железку (именно поэтому не pl2303/ft232rl).
В общем, то, работает - но я не могу разобраться с настройкой скоростей..
Задача: настроить uart на 9600/8/1/ноне, послать команду разгоняющую железку, подождать и настроить порт на 115200. Ну и далее уже работать как задумывали LUFовцы.
проект вот, зип вот, мануал на сайте. Использую Projects/UsbToSerial/
Код:
|
/*
LUFA Library
Copyright (C) Dean Camera, 2012.
dean [at] fourwalledcubicle [dot] com
www.lufa-lib.org
*/
/*
Copyright 2012 Dean Camera (dean [at] fourwalledcubicle [dot] com)
Permission to use, copy, modify, distribute, and sell this
software and its documentation for any purpose is hereby granted
without fee, provided that the above copyright notice appear in
all copies and that both that the copyright notice and this
permission notice and warranty disclaimer appear in supporting
documentation, and that the name of the author not be used in
advertising or publicity pertaining to distribution of the
software without specific, written prior permission.
The author disclaim all warranties with regard to this
software, including all implied warranties of merchantability
and fitness. In no event shall the author be liable for any
special, indirect or consequential damages or any damages
whatsoever resulting from loss of use, data or profits, whether
in an action of contract, negligence or other tortious action,
arising out of or in connection with the use or performance of
this software.
*/
/** \file
*
* Main source file for the USBtoSerial project. This file contains the main tasks of
* the project and is responsible for the initial application hardware configuration.
*/
#include "USBtoSerial.h"
/** Circular buffer to hold data from the host before it is sent to the device via the serial port. */
static RingBuffer_t USBtoUSART_Buffer;
/** Underlying data buffer for \ref USBtoUSART_Buffer, where the stored bytes are located. */
static uint8_t USBtoUSART_Buffer_Data[128];
/** Circular buffer to hold data from the serial port before it is sent to the host. */
static RingBuffer_t USARTtoUSB_Buffer;
/** Underlying data buffer for \ref USARTtoUSB_Buffer, where the stored bytes are located. */
static uint8_t USARTtoUSB_Buffer_Data[128];
/** LUFA CDC Class driver interface configuration and state information. This structure is
* passed to all CDC Class driver functions, so that multiple instances of the same class
* within a device can be differentiated from one another.
*/
USB_ClassInfo_CDC_Device_t VirtualSerial_CDC_Interface =
{
.Config =
{
.ControlInterfaceNumber = 0,
.DataINEndpoint =
{
.Address = CDC_TX_EPADDR,
.Size = CDC_TXRX_EPSIZE,
.Banks = 1,
},
.DataOUTEndpoint =
{
.Address = CDC_RX_EPADDR,
.Size = CDC_TXRX_EPSIZE,
.Banks = 1,
},
.NotificationEndpoint =
{
.Address = CDC_NOTIFICATION_EPADDR,
.Size = CDC_NOTIFICATION_EPSIZE,
.Banks = 1,
},
},
};
/** Main program entry point. This routine contains the overall program flow, including initial
* setup of all components and the main program loop.
*/
int main(void)
{
SetupHardware();
RingBuffer_InitBuffer(&USBtoUSART_Buffer, USBtoUSART_Buffer_Data, sizeof(USBtoUSART_Buffer_Data));
RingBuffer_InitBuffer(&USARTtoUSB_Buffer, USARTtoUSB_Buffer_Data, sizeof(USARTtoUSB_Buffer_Data));
LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);
sei();
for (;;)
{
/* Only try to read in bytes from the CDC interface if the transmit buffer is not full */
if (!(RingBuffer_IsFull(&USBtoUSART_Buffer)))
{
int16_t ReceivedByte = CDC_Device_ReceiveByte(&VirtualSerial_CDC_Interface);
/* Read bytes from the USB OUT endpoint into the USART transmit buffer */
if (!(ReceivedByte ‹ 0))
RingBuffer_Insert(&USBtoUSART_Buffer, ReceivedByte);
}
/* Check if the UART receive buffer flush timer has expired or the buffer is nearly full */
uint16_t BufferCount = RingBuffer_GetCount(&USARTtoUSB_Buffer);
if ((TIFR0 & (1 ‹‹ TOV0)) || (BufferCount › (uint8_t)(sizeof(USARTtoUSB_Buffer_Data) * .75)))
{
/* Clear flush timer expiry flag */
TIFR0 |= (1 ‹‹ TOV0);
/* Read bytes from the USART receive buffer into the USB IN endpoint */
while (BufferCount--)
{
/* Try to send the next byte of data to the host, abort if there is an error without dequeuing */
if (CDC_Device_SendByte(&VirtualSerial_CDC_Interface,
RingBuffer_Peek(&USARTtoUSB_Buffer)) != ENDPOINT_READYWAIT_NoError)
{
break;
}
/* Dequeue the already sent byte from the buffer now we have confirmed that no transmission error occurred */
RingBuffer_Remove(&USARTtoUSB_Buffer);
}
}
/* Load the next byte from the USART transmit buffer into the USART */
if (!(RingBuffer_IsEmpty(&USBtoUSART_Buffer)))
Serial_SendByte(RingBuffer_Remove(&USBtoUSART_Buffer));
CDC_Device_USBTask(&VirtualSerial_CDC_Interface);
USB_USBTask();
}
}
/** Configures the board hardware and chip peripherals for the demo's functionality. */
void SetupHardware(void)
{
/* Disable watchdog if enabled by bootloader/fuses */
MCUSR &= ~(1 ‹‹ WDRF);
wdt_disable();
/* Disable clock division */
clock_prescale_set(clock_div_1);
/* Hardware Initialization */
LEDs_Init();
USB_Init();
/* Start the flush timer so that overflows occur rapidly to push received bytes to the USB interface */
TCCR0B = (1 ‹‹ CS02);
}
/** Event handler for the library USB Connection event. */
void EVENT_USB_Device_Connect(void)
{
LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING);
}
/** Event handler for the library USB Disconnection event. */
void EVENT_USB_Device_Disconnect(void)
{
LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);
}
/** Event handler for the library USB Configuration Changed event. */
void EVENT_USB_Device_ConfigurationChanged(void)
{
bool ConfigSuccess = true;
ConfigSuccess &= CDC_Device_ConfigureEndpoints(&VirtualSerial_CDC_Interface);
LEDs_SetAllLEDs(ConfigSuccess ? LEDMASK_USB_READY : LEDMASK_USB_ERROR);
}
/** Event handler for the library USB Control Request reception event. */
void EVENT_USB_Device_ControlRequest(void)
{
CDC_Device_ProcessControlRequest(&VirtualSerial_CDC_Interface);
}
/** ISR to manage the reception of data from the serial port, placing received bytes into a circular buffer
* for later transmission to the host.
*/
ISR(USART1_RX_vect, ISR_BLOCK)
{
uint8_t ReceivedByte = UDR1;
if (USB_DeviceState == DEVICE_STATE_Configured)
RingBuffer_Insert(&USARTtoUSB_Buffer, ReceivedByte);
}
/** Event handler for the CDC Class driver Line Encoding Changed event.
*
* \param[in] CDCInterfaceInfo Pointer to the CDC class interface configuration structure being referenced
*/
void EVENT_CDC_Device_LineEncodingChanged(USB_ClassInfo _CDC_Device_t* const CDCInterfaceInfo)
{
uint8_t ConfigMask = 0;
switch (CDCInterfaceInfo-›State.LineEncoding.ParityType)
{
case CDC_PARITY_Odd:
ConfigMask = ((1 ‹‹ UPM11) | (1 ‹‹ UPM10));
break;
case CDC_PARITY_Even:
ConfigMask = (1 ‹‹ UPM11);
break;
}
if (CDCInterfaceInfo-›State.LineEncoding.CharFormat == CDC_LINEENCODING_TwoStopBits)
ConfigMask |= (1 ‹‹ USBS1);
switch (CDCInterfaceInfo-›State.LineEncoding.DataBits)
{
case 6:
ConfigMask |= (1 ‹‹ UCSZ10);
break;
case 7:
ConfigMask |= (1 ‹‹ UCSZ11);
break;
case 8:
ConfigMask |= ((1 ‹‹ UCSZ11) | (1 ‹‹ UCSZ10));
break;
}
/* Must turn off USART before reconfiguring it, otherwise incorrect operation may occur */
UCSR1B = 0;
UCSR1A = 0;
UCSR1C = 0;
/* Set the new baud rate before configuring the USART */
UBRR1 = SERIAL_2X_UBBRVAL(CDCInterfaceInfo-›State.LineEncoding.BaudRateBPS);
/* Reconfigure the USART in double speed mode for a wider baud rate range at the expense of accuracy */
UCSR1C = ConfigMask;
UCSR1A = (1 ‹‹ U2X1);
UCSR1B = ((1 ‹‹ RXCIE1) | (1 ‹‹ TXEN1) | (1 ‹‹ RXEN1));
} |
Пробовал после sei() в main() писать Serial_Init() (их либа Serial вроде так инициализируется) нужные скорости и через Serial же отправлять команду в девайс, но походе код в последней процедуре выше каждый раз перенастраивает эти параметры. Я не могу воткнуться, как происходит выбор скорости?
Запихиваю в RingBuffer свой текст - мк шлет его в терминал на любых скоростях корректно. Отправляю команду смены скорости железке за UARTom будучи на 9600 - она меняет скорость, но в терминале приходится переключаться на лету на 115200, иначе бред в канале. Если пытаюсь отправить команду железке будучи подключенным на 115200 сразу в терминале - она не получает команды. В общем, скорость уарта явно выбирается та, с которой я подключен. Если НЕ подключен - опять же команда не передается железке.
Как бы имеющимися в либе средствами решить задачу? Перед всеми действами выбрать 9600, отправить строку, переключиться 115200 и оставаться в ней? На стороне usb/cdc всегда будет 115200.
Пробовал заменять код в EVENT_CDC_Device_LineEncodingChanged на Serial_Init(9600) чтобы увидеть хотя бы на дефолтной скорости железку - вообще перестает работать, не пересылает из уарта в usb_cdc..
|
|
|
|
23.01.2013, 09:22
|
|
Почётный гражданин KAZUS.RU
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,620
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
|
Re: at90usb162/LUFA_CDC/не воткнусь (
Простите, спойлера не нашел (
|
|
|
|
23.01.2013, 09:29
|
|
Почётный гражданин KAZUS.RU
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,620
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
|
Re: at90usb162/LUFA_CDC/не воткнусь (
|
|
|
|
23.01.2013, 10:03
|
|
Почётный гражданин KAZUS.RU
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,620
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
|
Re: at90usb162/LUFA_CDC/не воткнусь (
Мне бы внятное описание, какая процедура когда вызывается - логику работы usb/cdc, тогда может найду куда приткнуть свой вызов, пока оно не заработало..
|
|
|
|
23.01.2013, 10:22
|
|
Почётный гражданин KAZUS.RU
Регистрация: 29.12.2012
Адрес: Питер
Сообщений: 982
Сказал спасибо: 131
Сказали Спасибо 230 раз(а) в 157 сообщении(ях)
|
Re: at90usb162/LUFA_CDC/не воткнусь (
Сообщение от whoim
|
Я не могу воткнуться, как происходит выбор скорости?
|
Код:
|
/* Must turn off USART before reconfiguring it, otherwise incorrect operation may occur */ |
отсюда и до конца. Эту процедуру можно вызывать один раз в ините мэйна с конкретно заданными параметрами.
При инициализации порта [s]и смене скорости[/s](нет такого понятия) через usbser отправляется CDC_REQ_SetLineEncoding. В случае чего - его можно полностью игнорировать удалив конфигуратор порта, описанный выше
Самому CDC пофиг на выбранную вами скорость.
Последний раз редактировалось Wiza_; 23.01.2013 в 10:29.
|
|
|
|
23.01.2013, 10:26
|
|
Почётный гражданин KAZUS.RU
Регистрация: 29.12.2012
Адрес: Питер
Сообщений: 982
Сказал спасибо: 131
Сказали Спасибо 230 раз(а) в 157 сообщении(ях)
|
Re: at90usb162/LUFA_CDC/не воткнусь (
А вообще, удалите/закомментте всё в EVENT_CDC_Device_LineEncodingChanged.... Или ссылку на него из CDC_REQ_SetLineEncoding
|
|
|
|
23.01.2013, 13:56
|
|
Почётный гражданин KAZUS.RU
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,620
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
|
Re: at90usb162/LUFA_CDC/не воткнусь (
Попробую вечерком, железка дома.
|
|
|
|
23.01.2013, 13:58
|
|
Почётный гражданин KAZUS.RU
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,620
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
|
Re: at90usb162/LUFA_CDC/не воткнусь (
Сообщение от Wiza_
|
А вообще, удалите/закомментте всё в EVENT_CDC_Device_LineEncodingChanged.... Или ссылку на него из CDC_REQ_SetLineEncoding
|
кстати вспомнил - пробовал, одновременно подставляя в hardware_setup Serial_Init
Не завелось, но попробую еще раз - может чего упустил
|
|
|
|
24.01.2013, 08:51
|
|
Почётный гражданин KAZUS.RU
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,620
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
|
Re: at90usb162/LUFA_CDC/не воткнусь (
пробую ручную инициализацию
Код:
|
void Serial_9600(void)
{
// Must turn off USART before reconfiguring it, otherwise incorrect operation may occur
UCSR1B = 0;
UCSR1A = 0;
UCSR1C = 0;
// Set the new baud rate before configuring the USART
UBRR1 = SERIAL_2X_UBBRVAL(9600); //CDCInterfaceInfo-›State.LineEncoding.BaudRateBPS
// Reconfigure the USART in double speed mode for a wider baud rate range at the expense of accuracy
UCSR1C = (1 ‹‹ UCSZ11) | (1 ‹‹ UCSZ10) | (1 ‹‹ USBS1); //ConfigMask
UCSR1A = (1 ‹‹ U2X1);
UCSR1B = ((1 ‹‹ RXCIE1) | (1 ‹‹ TXEN1) | (1 ‹‹ RXEN1));
}
void Serial_115200(void)
{
// Must turn off USART before reconfiguring it, otherwise incorrect operation may occur
UCSR1B = 0;
UCSR1A = 0;
UCSR1C = 0;
// Set the new baud rate before configuring the USART
UBRR1 = SERIAL_2X_UBBRVAL(115200); //CDCInterfaceInfo-›State.LineEncoding.BaudRateBPS
// Reconfigure the USART in double speed mode for a wider baud rate range at the expense of accuracy
UCSR1C = (1 ‹‹ UCSZ11) | (1 ‹‹ UCSZ10) | (1 ‹‹ USBS1); //ConfigMask
UCSR1A = (1 ‹‹ U2X1);
UCSR1B = ((1 ‹‹ RXCIE1) | (1 ‹‹ TXEN1) | (1 ‹‹ RXEN1));
} |
9600 работает. Пока не могу на прибор 115200 передать, по косвенным признакам.
|
|
|
|
24.01.2013, 09:06
|
|
Почётный гражданин KAZUS.RU
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,620
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
|
Re: at90usb162/LUFA_CDC/не воткнусь (
получилось, времени модулю на инит не давал
спасиб!
ЗЫ луфовская SerialInit не пашет с ат90усб(
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Тема |
Автор |
Раздел |
Ответов |
Последнее сообщение |
Порты ввода/вывода AT90USB162
|
Archer07 |
Микроконтроллеры, АЦП, память и т.д |
4 |
01.08.2011 11:05 |
Подключение DataFlash к AT90USB162
|
Archer07 |
Микроконтроллеры, АЦП, память и т.д |
15 |
04.06.2011 21:27 |
Внешнее питание AT90USB162
|
Archer07 |
Микроконтроллеры, АЦП, память и т.д |
2 |
19.05.2011 06:20 |
Российский аналог МК AT90USB162
|
vertic |
Микроконтроллеры, АЦП, память и т.д |
18 |
18.02.2010 00:10 |
Proteus: нет AT90USB162
|
ART-87 |
Микроконтроллеры, АЦП, память и т.д |
0 |
17.02.2009 18:14 |
Часовой пояс GMT +4, время: 23:30.
|
|