Хоть тема и избитая, но решил я сделать свой собственный USB to COM преобразователь. Заодно исправил всё, что мне не нравилось в других подобных штуках.
Вот что из этого вышло.
USB to COM преобразователь
- rhf-admin
- администратор, спонсор, писатель, дизайнер, инженер, программист, идеолог
- Сообщения: 3060
- Зарегистрирован: 25 авг 2009, 23:19
- Откуда: Уфа
- Контактная информация:
USB to COM преобразователь
С уважением, администрация сайта.
- rhf-admin
- администратор, спонсор, писатель, дизайнер, инженер, программист, идеолог
- Сообщения: 3060
- Зарегистрирован: 25 авг 2009, 23:19
- Откуда: Уфа
- Контактная информация:
Re: USB to COM преобразователь
А заодно и прогу для тестирования COM-порта написал (виртуальный COM-порт тоже отлично тестится).
Качаем вот тут, называется RH_COM_tester. Исходники там же.
Функционал:
1) можно руками линии подёргать (кнопки DTR, RTS). Если в порт заглушка воткнута, спаянная по указанной в проге схеме, то при изменениях на линиях DTR, RTS будут меняться уровни на DSR, RI, CTS, DCD
2) можно потестить как на разных скоростях байты бегают с Tx на Rx (опять же с заглушкой)
З.Ы. Пустое место рядом с настройками порта - это для кнопки "автотест", на которую у меня уже терпения не хватило. Если кто допилит - буду очень рад.
Качаем вот тут, называется RH_COM_tester. Исходники там же.
Функционал:
1) можно руками линии подёргать (кнопки DTR, RTS). Если в порт заглушка воткнута, спаянная по указанной в проге схеме, то при изменениях на линиях DTR, RTS будут меняться уровни на DSR, RI, CTS, DCD
2) можно потестить как на разных скоростях байты бегают с Tx на Rx (опять же с заглушкой)
З.Ы. Пустое место рядом с настройками порта - это для кнопки "автотест", на которую у меня уже терпения не хватило. Если кто допилит - буду очень рад.
С уважением, администрация сайта.
-
- Читатель
- Сообщения: 9
- Зарегистрирован: 20 авг 2014, 23:43
Re: USB to COM преобразователь
Я бы еще что-то на случай КЗ прицепил, чтобы материнку часом не попалить.
-
- инженер, читатель
- Сообщения: 246
- Зарегистрирован: 07 май 2013, 11:29
- Откуда: Тульская область
Re: USB to COM преобразователь
А какое тут может быть КЗ? И потом на USB по моему на современных материнках уже стоит ограничение по максимальному токуДеятель культуры писал(а):Я бы еще что-то на случай КЗ прицепил, чтобы материнку часом не попалить.
- rhf-admin
- администратор, спонсор, писатель, дизайнер, инженер, программист, идеолог
- Сообщения: 3060
- Зарегистрирован: 25 авг 2009, 23:19
- Откуда: Уфа
- Контактная информация:
Re: USB to COM преобразователь
Сегодня тестил сей девайс на предмет работы с Hart-модемом Viator, конфигурил через него Rosemount 3095. Работает, однако!
С уважением, администрация сайта.
-
- Читатель
- Сообщения: 1
- Зарегистрирован: 27 фев 2024, 23:35
- Откуда: Италия . Одесса
Re: USB to COM преобразователь
Вопрос к знатокам, особенно к автору статей про протокол усб,
я попытаюсь реализовать что то подобное на atmega16u2 в составе arduino uno.
Задача такова:
ПК . программа can view со своими драйверами
устройство atmega16u2 (точка 0, точка 1 (IN/OUT) для сервисных команд, точка 2(IN/OUT) для балк сообщений)
точка 0 работает
точка1 работает
точка 2 работает только с IN пакетами пакеты OUT принимать не получается, прилагаю код
я попытаюсь реализовать что то подобное на 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++;
}
}
}