USB to COM преобразователь

Всё об интерфейсах, протоколах, подключении к МК разных устройств, подключении контроллеров к ПК...
Ответить
Аватара пользователя
rhf-admin
администратор, спонсор, писатель, дизайнер, инженер, программист, идеолог
администратор, спонсор, писатель, дизайнер, инженер, программист, идеолог
Сообщения: 3060
Зарегистрирован: 25 авг 2009, 23:19
Откуда: Уфа
Контактная информация:

USB to COM преобразователь

Сообщение rhf-admin »

Хоть тема и избитая, но решил я сделать свой собственный USB to COM преобразователь. Заодно исправил всё, что мне не нравилось в других подобных штуках. :)
Вот что из этого вышло.
С уважением, администрация сайта.
Аватара пользователя
rhf-admin
администратор, спонсор, писатель, дизайнер, инженер, программист, идеолог
администратор, спонсор, писатель, дизайнер, инженер, программист, идеолог
Сообщения: 3060
Зарегистрирован: 25 авг 2009, 23:19
Откуда: Уфа
Контактная информация:

Re: USB to COM преобразователь

Сообщение rhf-admin »

А заодно и прогу для тестирования COM-порта написал (виртуальный COM-порт тоже отлично тестится).
Качаем вот тут, называется RH_COM_tester. Исходники там же.
Функционал:
1) можно руками линии подёргать (кнопки DTR, RTS). Если в порт заглушка воткнута, спаянная по указанной в проге схеме, то при изменениях на линиях DTR, RTS будут меняться уровни на DSR, RI, CTS, DCD
2) можно потестить как на разных скоростях байты бегают с Tx на Rx (опять же с заглушкой)

З.Ы. Пустое место рядом с настройками порта - это для кнопки "автотест", на которую у меня уже терпения не хватило. Если кто допилит - буду очень рад.
С уважением, администрация сайта.
Деятель культуры
Читатель
Читатель
Сообщения: 9
Зарегистрирован: 20 авг 2014, 23:43

Re: USB to COM преобразователь

Сообщение Деятель культуры »

Я бы еще что-то на случай КЗ прицепил, чтобы материнку часом не попалить.
Rus_lan
инженер, читатель
инженер, читатель
Сообщения: 246
Зарегистрирован: 07 май 2013, 11:29
Откуда: Тульская область

Re: USB to COM преобразователь

Сообщение Rus_lan »

Деятель культуры писал(а):Я бы еще что-то на случай КЗ прицепил, чтобы материнку часом не попалить.
А какое тут может быть КЗ? И потом на USB по моему на современных материнках уже стоит ограничение по максимальному току :-?
Аватара пользователя
rhf-admin
администратор, спонсор, писатель, дизайнер, инженер, программист, идеолог
администратор, спонсор, писатель, дизайнер, инженер, программист, идеолог
Сообщения: 3060
Зарегистрирован: 25 авг 2009, 23:19
Откуда: Уфа
Контактная информация:

Re: USB to COM преобразователь

Сообщение rhf-admin »

Сегодня тестил сей девайс на предмет работы с Hart-модемом Viator, конфигурил через него Rosemount 3095. Работает, однако! :D
С уважением, администрация сайта.
andriy.rachkovan
Читатель
Читатель
Сообщения: 1
Зарегистрирован: 27 фев 2024, 23:35
Откуда: Италия . Одесса

Re: USB to COM преобразователь

Сообщение andriy.rachkovan »

Вопрос к знатокам, особенно к автору статей про протокол усб,
я попытаюсь реализовать что то подобное на atmega16u2 в составе arduino uno.
Задача такова:
ПК . программа can view со своими драйверами
устройство atmega16u2 (точка 0, точка 1 (IN/OUT) для сервисных команд, точка 2(IN/OUT) для балк сообщений)
точка 0 работает
точка1 работает
точка 2 работает только с IN пакетами пакеты OUT принимать не получается, прилагаю код

Код: Выделить всё

#include "PCAN_USB.h"
void SetupHardware_(void)
{
		cli();
		wdt_disable();
		CLKPR = (1 << CLKPCE);
		CLKPR = 0;
		sei();
		

	REGCR  &= ~(1 << REGDIS);
	UDIEN   = 0;
	UDINT  = 0;
	USBCON &= ~(1 << USBE);
	USBCON |=  (1 << USBE);
	USBCON &= ~(1 << FRZCLK);

	PLLCSR = ((1 << PLLP0) | (1 << PLLE));
	while (!(USB_PLL_IsReady_()));
	
	
	Endpoint_ConfigureEndpoint_(0, 0, 16, 1);
	
	UDINT  &= ~(1 << SUSPI);
	UDIEN  |= (1 << SUSPE);
	UDIEN  |= (1 << EORSTE);
	UDCON  &= ~(1 << DETACH);

	TCCR0B=(1 << CS02);

//	Serial_Init(1000000,false);
	AVR__DDR_PORT  |= 0x30;
	LEDS_OFF;
}
////////////////////////////////////////////////////
int main(void)
{
    SetupHardware_();
    sei();

bool timer_is_acive=false;
uint32_t timer_EP2=0;	
for (;;)
{
	if(timer_is_acive)
		if(timer_EP2++>500000)
		{
			timer_EP2=0;
			UENUM=2;
			UEIENX =1;//заново активируем прерывание IN
			UECFG0X|=1;//направление IN
		}
	UENUM=1;
	if(Endpoint_IsOUTReceived_())
	{
		uint8_t i=0;
		while(Endpoint_IsReadWriteAllowed_())//читаем пока не выгрузим весь буфер
		{
			USBtoUSART_Buffer_Data_[i++]=UEDATX;
		}
		UEINTX &= ~((1 << RXOUTI) | (1 << FIFOCON));
	}
	char t_[]={0x3,0x2,0x1,0x0};//начало балк 2
	if(memcmp(t_, USBtoUSART_Buffer_Data_, 4)==0)
	{
		UENUM=2;
		if(!timer_is_acive)
		{
			UEIENX =1;	//активация прерывания IN
			UECFG0X|=1;//направление IN
		}
		timer_is_acive=true;
	}

}
}
//////////////////////////////////////////////////////////////////////////
ISR(USB_COM_vect, ISR_BLOCK)
	{
	uint8_t PrevSelectedEndpoint = UENUM;
    UENUM=2; 

	if ((UEINTX & (1 << TXINI))&&(UEIENX & (1 << TXINE))) 
	{
		LED2_ALTERNATE;
		UEDATX=8;
		UEINTX &= ~((1 << TXINI) | (1 << FIFOCON));
		while (!(UEINTX &0b10000001));//убедимся что буфер сброшен
			UEIENX =0b100;	
			UECFG0X&=0b11111110;//направление OUT
	}

	if ((UEINTX & (1 << RXOUTI))&&(UEIENX & (1 << RXOUTE))) 
	{
		LED1_ALTERNATE;
		uint8_t i=0;
		while((UEINTX & (1 << RWAL)))//читаем пока не выгрузим весь буфер
		{
			USBtoUSART_Buffer_Data_[i++]=UEDATX;
		}
		UEINTX &= ~((1 << RXOUTI) | (1 << FIFOCON));
		UEINTX &= ~(1 << RXOUTI);
	}
	


	UENUM=0;
	UEIENX &= ~(1 << RXSTPE);
	SREG|=0x80;
	USB_Device_ProcessControlRequest_();
	UENUM=0;
	UEIENX |= (1 << RXSTPE);
	UENUM=PrevSelectedEndpoint;
	}

ISR(USB_GEN_vect, ISR_BLOCK)
	{
	
	if ((UDINT  & (1 << SUSPI)) && (UDIEN  & (1 << SUSPE)))
		{
		UDIEN  &= ~(1 << SUSPE);
		UDIEN  |= (1 << WAKEUPE);
		USBCON |=  (1 << FRZCLK);
		
		PLLCSR = 0;
		USB_DeviceState_ = DEVICE_STATE_Unattached_;
		}
	if ((UDINT  & (1 << WAKEUPI)) && (UDIEN  & (1 << WAKEUPE)))
		{
		if (!(USB_Options_ & USB_OPT_MANUAL_PLL_))
			{
				PLLCSR = (1 << PLLP0);
				PLLCSR = ((1 << PLLP0) | (1 << PLLE));
				while (!(PLLCSR & (1 << PLOCK)));
			}
		USBCON &= ~(1 << FRZCLK);
		UDINT  &= ~(1 << WAKEUPI);
		UDIEN  &= ~(1 << WAKEUPE);
		UDIEN  |= (1 << SUSPE);
		}

	if ((UDINT  & (1 << EORSTI)) && (UDIEN  & (1 << EORSTE)))
		{
		UDINT  &= ~(1 << EORSTI);
		USB_DeviceState_ = 2;
		UDINT  &= ~(1 << SUSPI);
		UDIEN  &= ~(1 << SUSPE);
		UDIEN  |= (1 << WAKEUPE);
		Endpoint_ConfigureEndpoint_(0, 0,16, 1);
		UEIENX |= (1 << RXSTPE);
		}
	}

ISR(USART1_TX_vect, ISR_BLOCK) 
{
		if(ring_buffer[U_ring]!=0x0)
		{
			UDR1=ring_buffer[U_ring];
			U_ring++;
		}
}

ISR(USART1_UDRE_vect ISR_BLOCK)
	{
		if(timer_LED1++==10000)
		{
			timer_LED1=0;		
			//LED1_ALTERNATE;
			if(ring_buffer[U_ring]!=0x0)
			{
				UDR1=ring_buffer[U_ring];
				U_ring++;
			}
		}
	}
Ответить

Вернуться в «Интерфейсы / Протоколы / Периферия»