Журнал LinuxFormat - перейти на главную

LXF141:Intefaces

Материал из Linuxformat
Перейти к: навигация, поиск
Оборудование Налаживаем связь вашего компьютера с внешним миром

Содержание

Интерфейсы: Подключим ВСЕ!

Ан­д­рей Бо­ров­ский рас­ска­жет, как под­клю­чить к со­вре­мен­но­му ком­пь­ю­те­ру лю­бое уст­рой­ст­во, снаб­жен­ное про­во­дом (утю­ги не пред­ла­гать).

В про­шлый раз мы су­ме­ли за­ста­вить про­стое уст­рой­ст­во USB де­лать то, что нуж­но нам (а не то, что за­ду­мал про­из­во­ди­тель). Те­перь я рас­ска­жу вам, как ис­поль­зо­вать спе­ци­аль­ные пе­ри­фе­рий­ные уст­рой­ст­ва для рас­ши­рения функ­цио­наль­ных воз­мож­но­стей ва­ше­го ком­пь­ю­те­ра.

Рас­ши­рение воз­мож­но­стей ПК – за­ня­тие чрез­вы­чай­но увле­ка­тель­ное, при­чем в по­следнее вре­мя оно ста­но­вит­ся ув­ле­ка­тельнее, чем когда-ли­бо пре­ж­де. Я объ­яс­ню. Се­го­дня мы не толь­ко име­ем ши­ро­чай­ший спектр пе­ри­фе­рий­ных уст­ройств (и обиль­ные воз­мож­но­сти де­лать их са­мо­стоя­тель­но). Се­го­дня у нас так­же есть ог­ром­ный спектр ком­пь­ю­тер­ной техники, ко­то­рая мо­жет эти­ми уст­рой­ст­ва­ми управ­лять. Од­но де­ло – те­п­ло­ви­зор, при­сое­динен­ный к обыч­но­му ста­цио­нар­но­му ПК (еще несколь­ко лет на­зад это был един­ст­вен­ной ва­ри­ант), дру­гое де­ло – тот же те­пло­ви­зор, но под­клю­чен­ный к но­ут­бу­ку, третье – все тот же де­вайс под управ­лением кар­ман­но­го ком­пь­ю­те­ра, и уж со­всем чет­вер­тое – та же пе­ри­фе­рия, но под управ­лением ком­пь­ю­те­ра, встро­ен­но­го в лю­би­тель­ский ро­бот-вез­де­ход. И все это ста­ло воз­мож­но, в том чис­ле, бла­го­да­ря то­му, что се­го­дня все ком­пь­ю­те­ры, от са­мых боль­ших и слож­ных до са­мых ма­лень­ких и про­стых, осна­ща­ют­ся пор­та­ми USB.

В эпо­ху пор­тов ти­па LPT та­кие нестан­дарт­ные уст­рой­ст­ва, как дат­чик раз­мы­кания или тер­мо­дат­чик, мож­но бы­ло лег­ко из­го­то­вить са­мим, под­сое­динив вы­во­ды дат­чи­ка к разъ­е­мам со­от­вет­ст­вую­ще­го пор­та. Се­го­дня вы то­же без тру­да мо­же­те сде­лать уст­рой­ст­во, по­ка­зы­ваю­щее тем­пе­ра­ту­ру у вас за ок­ном или уро­вень pH в ва­шем ак­ва­риу­ме (а мо­жет быть, ро­бо­та, ко­то­рый бу­дет за­сы­пать корм рыб­кам в уста­нов­лен­ное вре­мя), но для при­сое­динения та­ко­го уст­рой­ст­ва к со­вре­мен­но­му ком­пь­ю­те­ру вам по­на­до­бит­ся по­средник: уст­рой­ст­во, спо­соб­ное пе­ре­вес­ти по­ток сы­рых дан­ных на язык про­то­ко­ла USB. Мы рас­смот­рим несколь­ко та­ких уст­ройств.

Velleman VM110

Ка­ки­ми спо­со­ба­ми ком­пь­ю­тер мо­жет об­щать­ся с ок­ру­жаю­щим ми­ром? Пу­тем пе­ре­да­чи и прие­ма элек­три­че­­ских сиг­на­лов, ра­зу­ме­ет­ся. Ну, а сиг­на­лы бы­ва­ют циф­ро­вы­ми или ана­ло­го­вы­ми. Раз­ра­бот­чи­ки ин­тер­фейс­ной пла­ты Velleman VM110 (http://www.vellemanusa.com/us/enu/product/view/?id=522053#) пре­ду­смот­ре­ли оба слу­чая.

Уст­рой­ст­во во­об­ще долж­но по­ра­до­вать тех, кто искал сред­ст­во со­пря­жения ком­пь­ю­те­ра с элек­трон­ной техникой. К ва­шим услу­гам – 5 циф­ро­вых вхо­дов, 2 ана­ло­го­вых вхо­да с воз­мож­но­стью уси­ления или ослаб­ления сиг­на­ла, 8 циф­ро­вых вы­хо­дов, два ана­ло­го­вых вы­хо­да, объ­е­динен­ных па­рал­лель­но с вы­хо­да­ми ШИМ. Ес­ли од­ной пла­ты вам ока­жет­ся ма­ло, раз­ра­бот­чи­ки пре­ду­смот­ре­ли про­стую воз­мож­ность ис­поль­зо­вания до че­ты­рех плат Vel­leman од­но­вре­мен­но (мож­но ис­поль­зо­вать и боль­ше, но это бу­дет сложнее в реа­ли­за­ции). Един­ст­вен­ная про­бле­ма мо­жет возник­нуть с на­груз­кой, по­сколь­ку пла­ты мо­гут пи­тать­ся толь­ко от ши­ны USB.

Осо­бо сто­ит от­ме­тить воз­мож­но­сти са­мо­тес­ти­ро­вания пла­ты. Мно­го­чис­лен­ные све­то­дио­ды по­зво­лят вам про­ве­рить ра­бо­ту вы­хо­дов да­же в от­сут­ст­вие внешней на­груз­ки, а с по­мо­щью уста­нов­лен­ных на пла­те пе­ре­клю­ча­те­лей вы смо­же­те про­ве­рить ра­бо­ту и вхо­дов. Все это здо­ро­во уп­ро­ща­ет от­лад­ку про­грамм, пред­на­зна­чен­ных для взаи­мо­дей­ст­вия с пла­той-по­средником.

К пла­те при­ла­га­ет­ся бу­маж­ное опи­сание (при­ят­ная неожи­дан­ность по нынешним вре­ме­нам) и ком­пакт-диск с соф­том. Диск со­дер­жит весь­ма уста­рев­шее про­грамм­ное обес­пе­чение (пла­та все-та­ки 2003 го­да вы­пуска), пред­на­зна­чен­ное, ес­те­ст­вен­но, для Windows. Впро­чем, это не про­бле­ма, так как сто­ронние раз­ра­бот­чи­ки уже на­пи­са­ли необ­хо­ди­мое ПО для Linux, OS X и да­же iPhone, да и, как мы даль­ше уви­дим, на­пи­сать свою соб­ст­вен­ную про­грам­му взаи­мо­дей­ст­вия с пла­той со­всем не труд­но.

В сис­те­ме пла­та ре­ги­ст­ри­ру­ет­ся как уст­рой­ст­во клас­са HID, так что мы мо­жем за­дей­ст­во­вать биб­лио­те­ку libusb для управ­ления ею.

Вы­ше го­во­ри­лось об уп­ро­щен­ной воз­мож­но­сти ис­поль­зо­вания че­ты­рех плат од­но­вре­мен­но. Де­ло в том, что для ка­ж­дой ва­шей пла­ты вы мо­же­те са­мо­стоя­тель­но вы­брать од­но из че­ты­рех пре­дуста­нов­лен­ных зна­чений PID. Де­ла­ет­ся это с по­мо­щью вы­бо­ра ком­би­на­ции пе­ре­мы­чек на пла­те (под­роб­но­сти опи­са­ны в ин­ст­рук­ции). Та­ким об­ра­зом, зна­чение VID для на­шей пла­ты со­став­ля­ет 0x10CF, а до­пусти­мые зна­чения PID – 0x5500, 0x5501, 0x5502, 0x5503 со­от­вет­ст­вен­но. При под­клю­чении боль­ше­го чис­ла плат их мож­но бу­дет раз­ли­чать по се­рий­ным но­ме­рам, что, конеч­но, не так на­гляд­но.

Уст­рой­ст­во под­дер­жи­ва­ет од­ну-един­ст­вен­ную кон­фи­гу­ра­цию и один ин­тер­фейс, в ко­то­ром, по­ми­мо точ­ки досту­па 0x00, оп­ре­де­ле­ны еще две точ­ки досту­па: 0x01 для пе­ре­дач дан­ных уст­рой­ст­ву и 0x81 для чтения дан­ных, пе­ре­да­вае­мых уст­рой­ст­вом. Об­мен ин­фор­ма­ци­ей ме­ж­ду пла­той и ком­пь­ю­те­ром осу­ще­ст­в­ля­ет­ся с по­мо­щью пре­ры­ваний USB. Сра­зу по­сле инициа­ли­за­ции в сис­те­ме пла­та на­чи­на­ет по­сы­лать по­ток пре­ры­ваний, ко­то­рые со­дер­жат ин­фор­ма­цию о со­стоянии вхо­дов. Са­мо на­ли­чие это­го по­то­ка сиг­на­ли­зи­ру­ет о том, что пла­та под­клю­че­на (по­лез­ная осо­бен­ность, ес­ли учесть, что libusb по­ка что не уме­ет са­мо­стоя­тель­но оп­ре­де­лять мо­мент от­клю­чения уст­рой­ст­ва). Со­стояния вы­хо­дов так­же уста­нав­ли­ва­ют­ся с по­мо­щью пре­ры­вания, ко­то­рое ком­пь­ю­тер по­сы­ла­ет уст­рой­ст­ву.

Фор­мат пре­ры­ва­ния, ко­то­рое пла­та по­сы­ла­ет хос­ту, вы­гля­дит следующим образом:

D A1 A2 0x00 0x00 0x00 0x00 0x00

Пре­ры­вание пе­ре­да­ет 8 байт, из ко­то­рых пер­вый байт пред­став­ля­ет со­бой мас­ку со­стояния циф­ро­вых вхо­дов, а вто­рой и тре­тий бай­ты со­дер­жат зна­чения ана­ло­го­во­го сиг­на­ла (зна­чения ото­бра­жа­ют­ся в об­ласть 0 – 255).

Пре­ры­ва­ние, пред­на­зна­чен­ное для ус­та­нов­ки зна­че­ний вы­хо­дов пла­ты, вы­гля­дит не­сколь­ко ина­че:

0x05 D A1 A2 0x00 0x00 0x00 0x00

Пер­вый байт – вол­шеб­ное чис­ло; да­лее сле­ду­ет байт-мас­ка со­стояния вось­ми циф­ро­вых вы­хо­дов, за­тем два бай­та, за­даю­щие зна­чения сиг­на­ла на ана­ло­го­вых вы­хо­дах уст­рой­ст­ва. Ос­таль­ные бай­ты не ис­поль­зу­ют­ся.

Для де­мон­ст­ра­ции взаи­мо­дей­ст­вия с пла­той-адап­те­ром мы на­пи­шем неболь­шую про­грам­му. Про­грам­ма k8055demo, ко­то­рую вы най­де­те на дис­ке, по­зво­ля­ет счи­ты­вать зна­чения ана­ло­го­вых вхо­дов адап­те­ра и уста­нав­ли­вать зна­чения ана­ло­го­вых вы­хо­дов. Кро­ме то­го, про­грам­ма пе­ре­клю­ча­ет зна­чения циф­ро­вых вы­хо­дов, ис­поль­зуя све­то­дио­ды-ин­ди­ка­то­ры как дво­ич­ный счет­чик. При по­сту­п­лении сиг­на­ла с лю­бо­го циф­ро­во­го вхо­да пла­ты этот дво­ич­ный счет­чик сбра­сы­ва­ет­ся, а зна­чения сиг­на­лов ана­ло­го­вых вы­хо­дов об­ну­ля­ют­ся.

Рас­смот­рим для при­ме­ра не­сколь­ко фраг­мен­тов лис­тин­га про­грам­мы k8055demo. Для взаи­мо­дей­ст­вия с уст­рой­ст­вом про­грам­ма ис­поль­зу­ет биб­лио­те­ку libusb, с ко­то­рый мы по­зна­ко­ми­лись в про­шлый раз. Про­це­ду­ра find_devices() ищет на ши­не USB уст­рой­ст­ва Velleman по до­пус­ти­мым зна­че­ни­ям PID.


 unsigned short ALLOWED_PIDS[4] = {0x5500, 0x5501, 0x5502, 0x5503};
 typedef struct _devdesc
 {
   short pid;
   libusb_device * device;
   libusb_device_handle * handle;
 } devdesc;
 devdesc found[4];
 int already_found = 0;
 libusb_device **list;
 libusb_context *ctx;
 int find_devices()
 {
       libusb_init(&ctx);
       ssize_t count;
       int i, j;
       already_found = 0;
       if ((count = libusb_get_device_list(ctx, &list)) < 0) {
         printf(“error: device enumeration failed\n”);
         return 0;
       }
       for (i = 0; i < count; i++) {
              libusb_device *device = list[i];
              struct libusb_device_descriptor desc;
              libusb_get_device_descriptor(device, &desc);
              if (desc.idVendor == DEV_VID) {
                    if (already_found == 4)
                           break;
                    for (j = 0; j < 4; j++) {
                           if (desc.idProduct == ALLOWED_PIDS[j]) {
                                 found[already_found].pid = desc.idProduct; 
                         found[already_found].device = device;
                         already_found++;
                         break;
                     }
                }
           }
      }
      printf(“k8055: %i devices found\n”,already_found);
      return already_found > 0 ? 1 : 0;
 }

Мас­сив found, рас­счи­тан­ный на 4 уст­рой­ст­ва, за­пол­ня­ет­ся струк­ту­ра­ми devdesc. Ко­ли­че­ст­во най­ден­ных уст­ройств со­хра­ня­ет­ся в пе­ре­мен­ной already_found.

А вот как вы­гля­дит функ­ция read_status(), ко­то­рая воз­вра­ща­ет со­стоя­ние вхо­дов уст­рой­ст­ва. Пер­вый ар­гу­мент функ­ции – ин­декс уст­рой­ст­ва в мас­си­ве found, вто­рой ар­гу­мент – ука­за­тель на мас­сив из 8 бай­тов, в ко­то­рый за­пи­сы­ва­ют­ся дан­ные о со­стоя­нии уст­рой­ст­ва, по­лу­чен­ные с по­мо­щью пре­ры­ва­ния.


 int read_status(int index, unsigned char * data)
 {
     int ret;
     if (!libusb_interrupt_transfer(found[index].handle, 0x81, data, 8, &ret, 100))
        return 1;
     return 0;
 }

Бы­ло бы стран­но, ес­ли бы за вре­мя су­ще­ст­во­вания пла­ты Velleman vm110/k8055 я ока­зал­ся един­ст­вен­ным, кто на­пи­сал бы Linux-ПО для столь за­ме­ча­тель­но­го уст­рой­ст­ва. Про­грам­мист Rouven Spreckels по­до­шел к во­про­су го­раз­до бо­лее осно­ва­тель­но и соз­дал це­лый про­грамм­ный па­кет k8055utils (сайт http://k8055utils.sourceforge.net; в на­стоя­щее вре­мя доступ­на уже вер­сия 2.2.0 это­го про­дук­та). Па­кет со­сто­ит из про­грам­мы-де­мо­на, ко­то­рая, соб­ст­вен­но, и управ­ля­ет уст­рой­ст­вом, а так­же кли­ен­тов, ко­то­рые мо­гут взаи­мо­дей­ст­во­вать с де­мо­ном с по­мо­щью <over>кор­ня ман­д­ра­горы</over> име­но­ван­ных ка­на­лов Linux и ка­на­лов TCP/IP.

Мосты USB

Где-то в на­ча­ле 2000‑х про­из­во­ди­те­ли же­ле­за столк­ну­лись с серь­ез­ной про­бле­мой. Нет, речь идет во­все не о пре­сло­ву­той Y2K. Про­бле­ма за­клю­ча­лась в том, что имен­но в это вре­мя стан­дарт USB на­конец-то на­чал внедрять­ся в ши­ро­кие ком­пь­ю­тер­ные мас­сы. А для ши­ро­ких масс, на пер­вых по­рах, внедрение USB бы­ло свя­за­но, пре­ж­де все­го, с про­бле­ма­ми об­рат­ной со­вмес­ти­мо­сти. С од­ной сто­ро­ны, у лю­дей бы­ло мно­го уст­ройств, ко­то­рые взаи­мо­дей­ст­во­ва­ли с ком­пь­ю­те­ром толь­ко че­рез пор­ты COM и LPT, при­чем речь тут идет не толь­ко об обо­ру­до­вании для ши­ро­ко­го по­треб­ления, за­ме­на ко­то­ро­го про­ис­хо­дит до­воль­но бы­ст­ро вслед­ст­вие за­планиро­ван­но­го мо­раль­но­го из­но­са. Глав­ная про­бле­ма за­клю­ча­лась во всяком спе­циа­ли­зи­ро­ван­ном кон­троль­но-из­ме­ри­тель­ном обо­ру­до­вании, ко­то­рое со­всем не так про­сто бы­ло за­менить. С дру­гой сто­ро­ны, су­ще­ст­во­ва­ло ог­ром­ное ко­ли­че­­ст­во про­грамм и це­лых про­грамм­ных ком­плек­сов, ко­то­рые мог­ли взаи­мо­дей­ст­во­вать со сво­им же­ле­зом толь­ко че­рез COM или LPT. Пе­ре­дел­ка все­го это­го до­б­ра мог­ла обер­нуть­ся го­раз­до бо­лее серь­ез­ны­ми за­тра­та­ми.

Для спа­сения си­туа­ции бы­ло пред­ло­же­но ло­гич­ное тех­но­ло­ги­че­­ское ре­шение. Ряд ком­паний пред­ста­вил на ры­нок уст­рой­ст­ва-пе­ре­ходники. С од­но­го кон­ца у этих пе­ре­ходников был обыч­ный разъ­ем для под­клю­чения к USB. С дру­го­го кон­ца у них бы­ли ин­тер­фей­сы, ло­ги­че­­ски (а за­час­тую и элек­три­че­­ски) со­вмес­ти­мые с RS-232 и IEEE 1284, так что раз­ра­бот­чи­ки обо­ру­до­вания мог­ли вклю­чать эти адап­те­ры в свои уст­рой­ст­ва с минималь­ны­ми кон­ст­рук­тив­ны­ми из­менения­ми (пе­ре­ходники мог­ли быть на­стоя­щи­ми ка­бе­ля­ми с дву­мя ште­ке­ра­ми, а мог­ли быть и мо­ду­ля­ми для уста­нов­ки внутрь кор­пу­са уст­рой­ст­ва). Са­мое ин­те­рес­ное про­ис­хо­- дило на уровне взаи­мо­дей­ст­вия та­ко­го адап­те­ра с ком­пь­ю­те­ром.

По­сле уста­нов­ки со­от­вет­ст­вую­ще­го драй­ве­ра ком­пь­ю­те­ру та­кой де­вайс пред­став­лял­ся как внешний (или вир­ту­аль­ный) порт COM и LPT. В ре­зуль­та­те раз­ра­бот­чи­ки уби­ва­ли обо­их зай­цев: обо­ру­до­вание и про­грам­мы, ори­ен­ти­ро­ван­ные на ста­рые пор­ты, мог­ли ра­бо­тать прак­ти­че­­ски без из­менений.

В слу­чае с эму­ля­ци­ей COM-пор­та эта схе­ма ока­за­лась на­столько жи­ву­чей, что ис­поль­зу­ет­ся до сих пор, в том чис­ле и в но­вых уст­рой­ст­вах. Фак­ти­че­­ски, рас­смот­рен­ный на­ми да­лее адап­тер MMUSB245RL для та­ких це­лей и пред­на­зна­чен. А учи­ты­вая то, что уст­рой­ст­во, ис­поль­зую­щее внут­ренний пе­ре­ходник USB-RS232, не обя­за­но ре­ги­ст­ри­ро­вать в сис­те­ме вир­ту­аль­ный COM-порт, та­ких уст­ройств в при­ро­де су­ще­ст­ву­ет го­раз­до боль­ше, чем мы ду­ма­ем.

С ин­тер­фей­са­ми LPT все ока­за­лось несколь­ко сложнее. В от­ли­чие от по­сле­до­ва­тель­ных ин­тер­фей­сов COM, к ко­то­рым под­клю­ча­ли все, что толь­ко мож­но, на­чи­ная с мы­шей и мо­де­мов и за­кан­чи­вая сис­те­ма­ми управ­ления сиг­на­ли­за­ци­ей, порт LPT ис­поль­зо­вал­ся в основ­ном для под­клю­чения прин­те­ров и сканеров. В ре­зуль­та­те на рын­ке поя­ви­лось мно­же­ст­во спе­циа­ли­зи­ро­ван­ных «прин­тер­ных» пе­ре­ходников. Со сто­ро­ны ком­пь­ю­те­ра та­кой пе­ре­ходник вы­гля­дит не как LPT-порт, а как USB-прин­тер. Со сто­ро­ны прин­те­ра мы име­ем на­стоя­щий разъ­ем LPT, но ча­стью ло­гики LPT управ­ля­ет встро­ен­ный в пе­ре­ходник кон­трол­лер, так что управ­лять уров­ня­ми сиг­на­ла на от­дель­ных вы­во­дах LPT, как это бы­ло бы воз­мож­но с на­стоя­щим LPT-пор­том, у нас не по­лу­чит­ся.

На­стоя­щие внешние LPT-пор­ты с под­клю­чением по USB и пол­ной функ­цио­наль­но­стью стан­дарт­но­го пор­та то­же встре­ча­ют­ся, но это – боль­шая ред­кость.

MMUSB245RL

Вто­рое уст­рой­ст­во, о ко­то­ром я рас­ска­жу вам, при­над­ле­жит к несколь­ко ино­му ти­пу, неже­ли пла­та Velleman. Мо­дуль MMUSB245RL фир­мы Propox (http://www.propox.com) – это один из USB-мостов, глав­ная за­да­ча ко­то­ро­го – до­ба­вить воз­мож­ность под­клю­чения к USB в уст­рой­ст­ва, из­на­чаль­но рас­счи­тан­ные на ра­бо­ту по про­то­ко­лу RS232. Для нас MMUSB245RL ин­те­ре­сен пре­ж­де все­го тем, что, в от­ли­чие от мно­гих его со­брать­ев, он не яв­ля­ет­ся про­сто кон­вер­то­ром ме­ж­ду USB и RS232. Что­бы по­нять, о чем я го­во­рю, сравним уст­рой­ст­во MMUSB245RL и, на­при­мер, ioMate. USB1 ува­жае­мой фир­мы chip45. Уст­рой­ст­во ioMate.USB1 – это пере­ходник USB-RS232 в са­мом точ­ном смыс­ле сло­ва. Под­клю­чив мо­дуль к USB-разъ­е­му, вы по­лу­чае­те на вы­хо­де все стан­дарт­ные линии RS232 (RTS, CTS, DTRи т. д.). Что же ка­са­ет­ся мо­ду­ля MMUS­B245RL, то в са­мом гру­бом при­бли­жении это та­кая шту­ка, у ко­то­рой с од­ной сто­ро­ны – разъ­ем USB тип B, а с дру­гой – 24 вы­во­да, 8 из ко­то­рых пред­на­зна­че­ны для пе­ре­да­чи дан­ных, а осталь­ные – для управ­ления этой пе­ре­да­чей. Кро­ме то­го, на пла­те мо­ду­ля есть несколь­ко пе­ре­мы­чек, с по­мо­щью ко­то­рых вы мо­же­те на­стро­ить, на­при­мер, ре­жим пи­тания мо­ду­ля (от ши­ны или от соб­ст­вен­но­го ис­точника) и уровни сиг­на­лов (3,3 воль­та ли­бо 5 вольт).

Управ­лять уст­рой­ст­ва­ми на ба­зе MMUSB245RL мож­но дву­мя спо­со­ба­ми: во-пер­вых, при под­клю­чении к ком­пь­ю­те­ру та­кое уст­рой­ст­во оп­ре­де­ля­ется как вир­ту­аль­ный COM-порт (при­чем спе­ци­аль­ных драй­ве­ров не тре­бу­ет­ся ни для Linux, ни да­же для Windows). На­при­мер, при под­клю­чении мо­ду­ля MMUSB245RL к сис­те­ме с Linux в сис­те­ме поя­вит­ся уст­рой­ст­во /dev/ttyUSB0. Да­лее об­менивать­ся дан­ны­ми с этим уст­рой­ст­вом мож­но бу­дет так же, как с лю­бым уст­рой­ст­вом, под­клю­чен­ным к по­сле­до­ва­тель­но­му пор­ту (и для это­го по­дой­дет лю­бое со­от­вет­ст­вую­щее ПО). Вто­рой ре­жим пред­по­ла­га­ет ис­поль­зо­вание фир­мен­но­го про­грамм­но­го обес­пе­чения, и о нем мы по­го­во­рим поз­же. Что же пред­став­ля­ет со­бой MMUS­B245RL с точ­ки зрения раз­ра­бот­чи­ка элек­троники?

Под­роб­ные схе­мы вы най­де­те, ес­те­ст­вен­но, в ру­ко­во­дстве к мо­ду­лю. Про­де­мон­ст­ри­ру­ем ло­ги­ку ра­бо­ты MMUSB245RL на про­стом при­ме­ре. До­пустим, ва­ше­му уст­рой­ст­ву нуж­но пе­ре­дать байт дан­ных в ком­пь­ю­тер. Мо­дуль со­дер­жит два бу­фе­ра FIFO – для прие­ма и пе­ре­да­чи дан­ных. Ес­ли мы хо­тим пе­ре­да­вать дан­ные, на­до сна­ча­ла убе­дить­ся, что со­от­вет­ст­вую­щий бу­фер не за­полнен (ина­че при­дет­ся ждать, по­ка ком­пь­ю­тер счи­та­ет дан­ные). О том, что бу-­фер не за­полнен, сви­де­тель­ст­ву­ет низ­кий уро­вень на­пря­же­ния на вы­во­де TXE (вы­вод 2). От­лич­но. Те­перь уста­нав­ли­ва­ем уровни сиг­на­ла на вы­во­дах D0–D7 со­от­вет­ст­вен­но би­то­вой мас­ке пе­ре­да­вае­мо­го бай­та и сбра­сы­ва­ем на­пря­жение на вы­во­де WR. В этот мо­мент байт с вы­во­дов D0–D7 бу­дет пе­ре­ме­щен в бу­фер вы­во­да, а по­сле воз­вра­щения зна­чения уров­ня на вы­во­де WR в ис­ход­ное со­стояние уст­рой­ст­во бу­дет го­то­во к прие­му но­во­го бай­та.

Все это я опи­сал для то­го, что­бы про­де­мон­ст­ри­ро­вать, что уст­рой­ст­во, пе­ре­даю­щее или принимаю­щее дан­ные с по­мо­щью MMUSB245RL, долж­но быть доста­точ­но ум­ным, что­бы про­ве­рять­ся и из­ме­нять со­стояния управ­ляю­щих вы­во­дов. По сравнению с ioMate.USB1 та­кая слож­ность мо­жет быть и ми­ну­сом. Дей­ст­ви­тель­но, ес­ли вам нуж­но все­го лишь за­жи­гать све­то­ди­од по сиг­на­лу с ком­пь­ю­те­ра, то в ioMate.USB1 это про­ще сде­лать, ис­поль­зуя управ­ляю­щие сиг­на­лы RS232. В MMUSB245RL все управ­ляю­щие сиг­на­лы ин­тер­фей­са от вас спря­та­ны, за­то вы мо­же­те со­сре­до­то­чить­ся на пе­ре­да­че по­то­ка бай­тов. Впро­чем, ту­пое уст­рой­ст­во мож­но сде­лать и с по­мо­щью MMUSB245RL. Ве­ро­ят­но, это уст­рой­ст­во зай­мет вто­рое ме­сто на кон­кур­се са­мых ту­пых уст­ройств. По­че­му толь­ко вто­рое? Ну, вы по­ня­ли. Для пе­ре­да­чи ка­ких-нибудь дан­ных в ком­пь­ю­тер с по­мо­щью MMUSB245RL доста­точ­но свя­зать вы­во­ды GND и WR че­рез ре­зи­стор 400 Ом и пе­ре­клю­ча­тель. При раз­мы­кании-за­мы­кании пе­ре­клю­ча­те­ля бу­фер вы­во­да бу­дет счи­ты­вать зна­чения с вы­во­дов D0–D7, что бы там ни бы­ло, и по­сы­лать их на линию. Сам факт по­яв­ления дан­ных на вхо­де COM-пор­та мо­жет со­об­щить ком­пь­ю­те­ру, что нечто про­изош­ло.

Я обе­щал рас­ска­зать о до­полнитель­ных воз­мож­но­стях про­грамм­но­го взаи­мо­дей­ст­вия с MMUSB245RL. Вме­сте с мо­ду­лем по­став­ля­ет­ся биб­лио­те­ка libftd2xx (в вер­си­ях для Windows и Li­nux), ко­то­рая реа­ли­зу­ет про­прие­тар­ный про­то­кол взаи­мо­­дей­ст­вия (ду­маю, что об­рат­ный ин­жиниринг это­го про­то­ко­ла не со­ста­вит осо­бо­го тру­да, но это от­дель­ная те­ма). Воз­мож­но­сти libftd2xx мо­гут по­ка­зать­ся из­бы­точ­ны­ми, но при гра­мот­ном и при­менении мож­но до­бить­ся очень ин­те­рес­ных ре­зуль­та­тов.

Во-пер­вых, libftd2xx по­зво­ля­ет об­менивать­ся дан­ны­ми с мо­ду­лем, ми­нуя ме­ханизм вир­ту­аль­но­го пор­та RS232. Во-вто­рых, биб­лио­те­ка по­зво­ля­ет пе­ре­про­грам­ми­ро­вать EEPROM (то бишь, ЭСП­ПЗУ) мо­ду­ля, за­ме­няя раз­лич­ные его па­ра­мет­ры, вклю­чая VID, PID и се­рий­ный но­мер. Кста­ти, libftd2xx по­зво­ля­ет вре­мен­но из­менить VID и PID и дру­ги­ми спо­со­ба­ми. Все вме­сте это оз­на­ча­ет, что мо­дуль MMUSB245RL мо­жет пред­ста­вить­ся сис­те­ме со­всем не тем, чем он яв­ля­ет­ся на са­мом де­ле. Иногда это хо­ро­шо. Ес­ли вы круп­ный раз­ра­бот­чик обо­ру­до­вания и ис­поль­зуе­те MMUSB245RL для со­пря­жения уст­ройств с ком­пь­ю­те­ром, вам мо­жет быть со­всем ни к че­му, что­бы ва­ши уст­рой­ст­ва сис­те­ма оп­ре­де­ля­ла как вир­ту­аль­ный COM-порт про­из­вод­ст­ва ком­пании FTDI (имен­но эта фир­ма про­из­во­дит чип кон­трол­ле­ра). Вы мо­же­те за­хо­теть при­пи­сать уст­рой­ст­ву свою мар­ку, и FTDI не воз­ра­жа­ет про­тив та­кой под­ме­ны (кро­ме то­го, за­ме­на PID мо­жет быть про­сто необ­хо­ди­ма для пра­виль­ной за­груз­ки драй­ве­ров, и тут FTDI во­об­ще идет вам на­встре­чу и го­то­ва пре­доста­вить уникаль­ные зна­чения PID из соб­ст­вен­ных за­кро­мов). Па­ра­мет­ры мо­ду­ля мож­но, конеч­но, под­ме­нять и с бо­лее ин­те­рес­ны­ми це­ля­ми: на­при­мер, что­бы вы­дать его за де­вайс ка­кой-нибудь из­вест­ной фир­мы. Од­нако рас­про­стра­нять­ся на эту те­му мы не бу­дем.

Мы дос­та­точ­но под­роб­но рас­смот­ре­ли уст­рой­ст­ва, ко­то­рые мо­гут быть ор­га­на­ми управ­ле­ния на­шим ум­ным до­мом; при­шло вре­мя еще раз взгля­нуть на центр управ­ле­ния им. Но это бу­дет те­мой для сле­дую­щей ста­тьи.

Персональные инструменты
купить
подписаться
Яндекс.Метрика