کال

تجربیات کامپیوتر، الکترونیک و لینوکس عبد

بورد آزمایشی برای استفاده از FT245BM

۳۰ آبان ۱۳۸۷ در دسته الکترونیک

یکی از دلایل وقفه زیاد در به‌روز‌رسانی وبلاگ، مشکلات اعصاب خوردکن در کار با وردپرس است. ادیتور برنامه معمولا کد‌های مرا بعد از جابه‌جایی عکس‌های داخل متن کاملا پاک می‌کند. علاوه بر این سایت مدت‌ها در IE مشکل داشت! البته ناگفته نماند که من خیلی HTML و CSS بلد نیستم و این یکی از دلایل مشکلات کار کردن من با وردپرس است. خوب حالا از دلایل ماسمالی کردن تنبلی می‌گذریم.

مدت‌ها قبل مدار مبدل USB به سریال را با تراشه FT232 درست کرده بودم که به خوبی هم کار می‌کند. بعد از مدتی تصمیم گرفتم که با تراشه FT245 هم کار کنم. این تراشه مبدل USB به موازی است (البته نه پورت موازی/پرینتری که در کامپیوتر‌های شخصی وجود دارد) که یک IO با پهنای ۸ بیت فراهم می‌کند. علاوه بر این از اینترفیس ساده ۴ بیتی برای Hand-shaking استفاده می‌کند. این ۴ بیت به این صورت است (علامت # به معنی active-low بودن سیگنال است):

RXF# دیتا در خروجی FIFO برای خواند آماده است.
RD# خواندن از FIFO با لبه پایین رونده این سیگنال.
TXE# نشان دهنده آماده بودن FIFO برای نوشتن در آن است.
WR نوشتن در FIFO با لبه بالا رونده این سیگنال.

البته روش خیلی ساده‌تری نیز برای کار با این تراشه وجود دارد که در ادامه به آن اشاره می‌کنم.

این تراشه مدت‌های در قفسه قطعات من خاک می‌خورد تا آنکه چندین ماه گذشته قطعات جانبی مورد نیاز برای ساخت مدار FT245 را از جمهوری تهیه کردم. بعد از مدتی متوجه شدم یکی از قطعات را فروشنده اشتباه داده است که همین نکته باعث شد دوباره ساخت مدار یک ماه عقب بیفتد. به هر حال حدود سه هفته قبل شماتیک و بورد مدار تکمیل شد. برای ساخت بورد از روش نور‌دهی و لامینت استفاده کردم. علت استفاده از این روش نیز، نازک بودن خطوط بورد به علت محدودیت اندازه بورد است.

درباره مدار:

تغذیه تراشه‌ FT245BM را می‌توان به اشکال مختلفی پیکربندی کرد. سازنده تراشه (FTDI) شماتیک روش‌های مختلف را در این فایل و در اینجا قرار داده است. تفاوت عمده این مدار‌ها در تغذیه چیپ و IOهای آنها است.
ولتاژ IOهای تعداد زیادی از چیپ‌ها نمی‌تواند 5v باشد و به عبارت بهتر 5v-tolerant نیستند. به همین دلیل من مداری را انتخاب کردم که در آن رگولاتور ۳.۳ ولتی قرار دارد و IOهای تراشه FT245 از این ولتاژ استفاده می‌کنند.
شماتیک برنامه را با gschem کشیدم، و چون سیمبول FT245BM رو پیدا نکردم، سیمبول FT245BM را با برنامه djboxsym طراحی کردم (سعی کردم تا حد ممکن شکل سیمبول مانند سیمبول داخل شماتیک FTDI باشد). شما می‌توانید djboxsym را به صورت آنلاین هم در اینجا آزمایش کنید.

شماتیک مدار FT245

شماتیک مدار FT245

درباره بورد:

برای استفاده راحت‌تر از بورد، بورد را به صورتی طراحی کردم که بتوانم از آن در بردبورد قرار استفاده کنم. چون خودم می‌خواستم برد را در خانه درست کنم، آن را به صورت تک لایه طراحی کردم. به این دو دلیل تمام قطعات را از نوع SMD انتخاب کردم. البته به شخصه هم علاقه فراوانی به SMD دارم. برای ساده‌تر شدن مدار هم، تراشه E2PROM را از مدار حذف شده است. بورد را با برنامه PCB طراحی کردم. کشیدن بورد خیلی پر زحمت بود و دو روز وقت گرفت، ولی نتیجه کار به نظرم به نسبت راضی کننده است.

بورد FT245BL

بورد FT245BL

تصویر از دو طرف بورد ساخته شده

تصویر از دو طرف بورد ساخته شده

عملکرد و برنامه (درایور):

در استفاده از این برد دقت کنید، بعضی از قسمت‌های برد باید کمی ترمیم شود.

همان طور که در بالا هم اشاره کردم، استفاده از روش ۴ بیتی برای صحبت کردن با چیپ کمی سخت است (ولی روشی اصولی و سریع‌ است). روش دیگری که برای کار با تراشه وجود دارد، مد Bitbang است (تراشه FT232 نیز دقیقا همین مد را دارد). به عبارت ساده در این مد می‌توان وضعیت IO ها را به صورت یک عدد ۸ بیتی خواند و یا یک عدد ۸ بیتی در آن نوشت. کار با این مد خیلی ساده و روتین است، من مدار ساخت شده را در این مد تست کرده‌ام ولی هنوز مد ۴ بیتی را تست نکرده‌ام.
برای درایور نیز خوشبختانه در لینوکس کتابخانه libftdi وجود دارد، این کتابخانه برای کار با چیپ‌های FTDI درست شده است،‌ و کار با این چیپ را خیلی ساده می‌کند. (دوستانی که از لینوکس‌های Debian-based استفاده می‌کنند، باید پکیج libftdi-dev و libftdi را نصب کنند).
کتابخانه libftdi-dev تعدادی مثال دارد که می‌توانید با مطالعه آنها به راحتی عملکرد کتابخانه را یاد بگیرید (در ابونتو این مثال‌ها در /usr/share/doc/libftdi-dev/examples قرار گرفته است). من یکی از این مثال‌ها را به صورتی تغییر داده‌ام که ۱ بیت در خروجی به سمت چپ شیف پیدا کند (مدار بر روی بردبورد به ۸ دیود نورانی متصل شده است).
توضیحات کد:
قسمت ابتدای کد راه‌اندازی کتابخانه (ftdi_init) ، در مرحله بعدی باز کردن یک ارتباط با (ftdi_usb_open ) چیپ و در انتها بررسی اینکه آیا USB پیدا شده است یا نه.


struct ftdi_context ftdic;
int f,i;
ftdi_init(&ftdic);
f = ftdi_usb_open(&ftdic, 0x0403, 0x6001);
if(f < 0 && f != -5) {
	fprintf(stderr, "unable to open ftdi device: %d (%s)\n",\
			 f, ftdi_get_error_string(&ftdic));
	exit(-1);
}

مرحله بعدی پیکربندی تراشه در مد bitbang است. تابع ftdi_enable_bitbang پارامتری برای مشخص کردن جهت بیت‌های IO دارد. در مثال ما هر ۸ بیت خروجی هستند به همین دلیل مقدار این پارامتر 0xFF است.


ftdi_enable_bitbang(&ftdic, 0xFF);

برای نوشتن در تراشه در مد bitbang باید از تابع ftdi_write_data استفاده کرد. برای خواند در مد bitbang هم باید از تابع ftdi_read_pins استفاده کرد.


buf[0] = (buf[0]==0x80)?0x01:buf[0]<<1;
f = ftdi_write_data(&ftdic, buf, 1);
if(f < 0) {
	fprintf(stderr,"write failed for 0x%x, error %d (%s)\n",\
			buf[0],f, ftdi_get_error_string(&ftdic));
}

در انتهای کار هم باید مد bitbang را غیر فعال نمود و همچنین ارتباط با USB را خاتمه داد.


ftdi_disable_bitbang(&ftdic);
ftdi_usb_close(&ftdic);
ftdi_deinit(&ftdic);

کد کامل برنامه ledshift.c را از اینجا دریافت کنید. و برای کامپایل کردن آن به این صورت عمل کنید:

gcc ledshift.c -o ledshift -l ftdi
همان طور که اشاره کردم، برای تست مدار، بورد را بر روی بردبورد به ۸ عدد دیود نورانی (و مقاومت ۲۲۰ اهم) متصل کردم، که بتوانم درایور را تست کنم.

آزمایش بورد بر روی بردبورد به همراه دیودنورانی

آزمایش بورد بر روی بردبورد به همراه دیودنورانی

فایل‌های ضمیمه:

(+) مدار اصلی (از سایت FTDI) که این مدار از روی آن طراحی شده است به فرمت پی‌دی‌اف. (و به فرمت پی‌ان‌جی در اینجا)
(+) فایل فشرده شامل فایل‌های طراحی شماتیک و بورد، برنامه درایور و همچنین پی‌دی‌اف‌های تولید شده.
(+) سورس کد درایور (ledkey.c)
(+) کد ورودی برنامه djboxsym برای درست کردن سیمبول تراشه FT245

۱۲ نظر به “بورد آزمایشی برای استفاده از FT245BM”

  • فاضل
    ۳۰ آبان ۱۳۸۷ at ۱۱:۱۴ ب.ظ

    عالی بود
    ممنون

  • ahmadmn
    ۲۷ آذر ۱۳۸۷ at ۲:۲۰ ق.ظ

    خسته نباشی

  • NASA_DE
    ۲ بهمن ۱۳۸۷ at ۱۰:۵۰ ب.ظ

    سلام دوست Open Source ای.

    وبلاگ خوب , مطالب آموزنده. موفق باشی و شاد و خرم.

  • robin hood
    ۶ بهمن ۱۳۸۷ at ۲:۵۱ ق.ظ

    سلام دوست عزیز.
    اگه لطف کنی توضیحات بیشتری در رابطه با هر دو روش (bit bang / handshake) بدی مممنون میشم.
    در ضمن وبلاگ آموزنده و جالبی داری.
    ممنون از توجهت.
    عبد
    با تشکر
    در مد بیت-بنگ پایه‌های تراشه به صورت یک پورت ساده در می‌آید. برای خواند و نوشتن هر بایت باید تقاضایی از کامپیوتر به چیپ ارسال شود. این حالت دقیقا مشابه عملکرد یک پورت میکروکنترلر AVR و یا به صورت کلی GPIO در هر میکرویی است. ولی عملکرد معمول تراشه از یک ساختار ساده برای همزمانی ارسال و دریافت داده به/از چیپ استفاده می‌کند. علاوه بر این استفاده از FIFOها در این مد امکان پذیر است.
    دقت کنید در این مد لازم نیست که کامپیوتر برای هر بایت تقاضایی به تراشه بفرستد. به عنوان مثال فرض کنید مداری دارید که با سرعت 10Khz داده در خروجی تولید می‌کند، در مد بیت بنگ شما باید در زمان مشخص یعنی دقیقا 100us یک بار از کامپیوتر یک تقاضای خواندن به تراشه بفرستید در این حالت اگر این زمان کمی بیشتر شود دیتای شما از دست می‌رود. ولی در مد معمول تولید کنند داده با سرعت 10Khz بافر ورودی تراشه را پر میکند، در این حالت با توجه به بافر ۱۲۸ بایتی ورودی در تراشه شما می‌توانید خواندن از USB را حتی تا حدود 12ms به تاخیر بیندازید.
    به صورت خلاصه:
    بیت بنگ:

    • ساده است
    • سرعت کمتری دارد
    • زمانبندی دقیقی ندارد و کاملا وابسته به برنامه آن در کامپیوتر است

    مد معمول:

    • پیچیده‌تر است و نیاز به ۴ بیت برای handshake دارد
    • به علت استفاده از بافر می‌تواند با حداکثر سرعت نوشتن و خواندن را انجام دهد
    • به علت وجود بافر زمانبندی وابسته به کامپیوتر نیست و می‌تواند کاملا دقیق در مدار انجام گیرد
  • hadi
    ۱۷ فروردین ۱۳۸۸ at ۱۲:۳۳ ب.ظ

    دمت گرم

    خیلی عالیه

  • علی
    ۳ خرداد ۱۳۸۸ at ۴:۰۵ ب.ظ

    این کتابخانه در ابونتو من نیست !!!!
    عبد
    ممکن است مخازن شما درست نباشد.
    http://packages.ubuntu.com/dapper/devel/libftdi-dev

  • فاضل
    ۲۷ خرداد ۱۳۸۸ at ۱۲:۲۰ ق.ظ

    سلام
    از چه بر نامه ای در لینوکس برای کامپایل برنامه استفاده می کنی؟(ابونتو)
    در مورد درایور مشکل دارم لطفا کمک کن
    ممنون

  • مهدی
    ۲۹ تیر ۱۳۸۸ at ۱۲:۵۵ ق.ظ

    سلام
    من می خوام با پورت یو اس پی دو تا استپ موتور را کنترل کنم
    آیا مرجعی و یا سخت افزار پیشنهادی برای اینکار دارین
    هرچی سرچ کردم ، چیز خاصی پیدا نکردم
    ممنون میشم راهنمایی کنین
    عبد
    تا حدودی بستگی به کاری که می‌خواهید انجام دهید دارد. اگر کار شما محدودیت‌های زمانی ندارد و به عبارت دیگر بلادرنگ نیست، می‌تواند به راحتی از همین مدار هم استفاده کنید. یعنی ۸ پین این مدار را به دو استپر متصل کنید (البته به مدار قدرت برای کنترل موتور نیاز دارید که می‌توانید به پست‌های دیگر همین وبلاگ مراجعه کنید) و کد‌های مربوطه را کامپیوتر بنویسید. بر اساس همین روش می‌توانید از مدار AVR-USB هم استفاده کنید. استفاده از این AVR دو ویژگی مثبت دارد، اولا کل کار را می‌توانید با یک AVR انجام دهید. ثانیا می‌توانید قسمت‌هایی از کنترل استپر موتور را در خود AVR انجام دهید. به عنوان مثال به جای ارسال وضعیت سیم‌های استپر یک دستور سطح بالا به AVR بفرستید که این دستور آنجا پردازش شود و دو موتور به نقطه مشخص منتقل شوند.
    آدرس AVR USB:
    http://www.obdev.at/products/vusb/index.html

  • مهدی
    ۷ مرداد ۱۳۸۸ at ۲:۲۹ ب.ظ

    واقعا ممنونم که منون ناامید نکردی و بعد از اینهمه مدت هنوز نظر منو نخوندی، چه برسه به جواب
    عبد
    شرمنده جواب کوتاهی به سوال شما نوشته‌ام.

  • مهدی
    ۷ مرداد ۱۳۸۸ at ۹:۳۸ ب.ظ

    بسیار ممنون
    موفق باشین

  • mafarid
    ۳۱ مرداد ۱۳۸۸ at ۱۰:۳۸ ق.ظ

    سلام نمیدونم شاید اشتباه کنم ولی تا اونجایی که من می‌دونم اگه eeprom رو حذف نمی کردید می شد ازش برای Plug & pley کردن این تبدیل استفاده کرد. اگه اشتباه می‌کنم اصلاح بفرمایید.

  • لاچینی
    ۱۳ شهریور ۱۳۸۸ at ۱۲:۴۹ ب.ظ

    سلام واقعا زیبا و آموزنده بود. اما چند مسله :
    ۱- من با ابنتو کار میکنم و خیلی مایلم که کارههای برنامه نویسی و طراحی مدار را درون این سیستم انجام بدم. و چون شما در این مسله دارای تجربه هستید قطعا میتونید به من کمک کنید تا سریعتر به هدفم برسم. بخاطر همین اگه لینکهای دانلود و راهنمای نصب و استفاده از این برنامه ها را معرفی کنید خیلی ممنون میشم.
    ۲- نمی دونم شما با lazarus , Kylix کار کردید و در این زمینه هم اگه بتونید راهنمایی کنید خوشحال میشم.
    ۳- من حدود ۵ سالی هست که سایتی در زمینه الکترونیک دارم که آدرس انرو در فرم زدم . در صورتیکه مایل باشی حاضر به تبادل لینک و لوگو هستم.
    ۴- در زمینه برنامه نویسی php هم اگه پیشنهادی داری خوشحال میشم راهنمایی کنید و دو نمونه از برنامه های نوشته شده من رو در سایت به آدرس زیر میتونید ببینید و تست کنید :
    http://www.hlachini.com/led.html
    http://www.hlachini.com/Text2Hex.html

نوشتن نظر