Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR...

 
Опции темы
Непрочитано 23.01.2013, 09:18  
whoim
Почётный гражданин KAZUS.RU
 
Аватар для whoim
 
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,620
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
whoim на пути к лучшему
По умолчанию 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..
Реклама:
whoim вне форума  
Непрочитано 23.01.2013, 09:22  
whoim
Почётный гражданин KAZUS.RU
 
Аватар для whoim
 
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,620
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
whoim на пути к лучшему
По умолчанию Re: at90usb162/LUFA_CDC/не воткнусь (

Простите, спойлера не нашел (
whoim вне форума  
Непрочитано 23.01.2013, 09:29  
whoim
Почётный гражданин KAZUS.RU
 
Аватар для whoim
 
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,620
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
whoim на пути к лучшему
По умолчанию Re: at90usb162/LUFA_CDC/не воткнусь (

Вот дока на Serial.h
http://www.fourwalledcubicle.com/fil...___a_v_r8.html
whoim вне форума  
Непрочитано 23.01.2013, 10:03  
whoim
Почётный гражданин KAZUS.RU
 
Аватар для whoim
 
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,620
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
whoim на пути к лучшему
По умолчанию Re: at90usb162/LUFA_CDC/не воткнусь (

Мне бы внятное описание, какая процедура когда вызывается - логику работы usb/cdc, тогда может найду куда приткнуть свой вызов, пока оно не заработало..
whoim вне форума  
Непрочитано 23.01.2013, 10:22  
Wiza_
Почётный гражданин KAZUS.RU
 
Регистрация: 29.12.2012
Адрес: Питер
Сообщений: 982
Сказал спасибо: 131
Сказали Спасибо 230 раз(а) в 157 сообщении(ях)
Wiza_ на пути к лучшему
По умолчанию 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.
Wiza_ вне форума  
Сказали "Спасибо" Wiza_
whoim (23.01.2013)
Непрочитано 23.01.2013, 10:26  
Wiza_
Почётный гражданин KAZUS.RU
 
Регистрация: 29.12.2012
Адрес: Питер
Сообщений: 982
Сказал спасибо: 131
Сказали Спасибо 230 раз(а) в 157 сообщении(ях)
Wiza_ на пути к лучшему
По умолчанию Re: at90usb162/LUFA_CDC/не воткнусь (

А вообще, удалите/закомментте всё в EVENT_CDC_Device_LineEncodingChanged.... Или ссылку на него из CDC_REQ_SetLineEncoding
Wiza_ вне форума  
Сказали "Спасибо" Wiza_
whoim (23.01.2013)
Непрочитано 23.01.2013, 13:56  
whoim
Почётный гражданин KAZUS.RU
 
Аватар для whoim
 
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,620
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
whoim на пути к лучшему
По умолчанию Re: at90usb162/LUFA_CDC/не воткнусь (

Попробую вечерком, железка дома.
whoim вне форума  
Непрочитано 23.01.2013, 13:58  
whoim
Почётный гражданин KAZUS.RU
 
Аватар для whoim
 
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,620
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
whoim на пути к лучшему
По умолчанию Re: at90usb162/LUFA_CDC/не воткнусь (

Сообщение от Wiza_ Посмотреть сообщение
А вообще, удалите/закомментте всё в EVENT_CDC_Device_LineEncodingChanged.... Или ссылку на него из CDC_REQ_SetLineEncoding
кстати вспомнил - пробовал, одновременно подставляя в hardware_setup Serial_Init

Не завелось, но попробую еще раз - может чего упустил
whoim вне форума  
Непрочитано 24.01.2013, 08:51  
whoim
Почётный гражданин KAZUS.RU
 
Аватар для whoim
 
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,620
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
whoim на пути к лучшему
По умолчанию 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 передать, по косвенным признакам.
whoim вне форума  
Непрочитано 24.01.2013, 09:06  
whoim
Почётный гражданин KAZUS.RU
 
Аватар для whoim
 
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,620
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
whoim на пути к лучшему
По умолчанию Re: at90usb162/LUFA_CDC/не воткнусь (

получилось, времени модулю на инит не давал
спасиб!
ЗЫ луфовская SerialInit не пашет с ат90усб(
whoim вне форума  
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
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.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot