امتیاز موضوع:
  • 1 رأی - میانگین امتیازات: 5
  • 1
  • 2
  • 3
  • 4
  • 5
TWI(I2C) in AT91Sam7S
نویسنده پیام
salehjg آفلاین
مدیر بخش
*****

ارسال‌ها: 1,281
موضوع‌ها: 133
تاریخ عضویت: آذر ۱۳۸۸

تشکرها : 9560
( 8557 تشکر در 2603 ارسال )
ارسال: #1
TWI(I2C) in AT91Sam7S
سلام

چند وقت بود که دنبال راه اندازی twi یا همان i2c با arm بودم.

برای شروع مجله ی pmm رو خوندم ولی انگار به دلیل برخی از مشکلات ، هدر فایل ها در ویرایش دوم ضمیمه خواهند شد.

پس برای شروع مجبور بودم که از اول اول یاد بگیرم.

بعد از خواندن دیتاشیت و بعضی از قسمت های نا مفهوم(البته برای من :)) ، تصمیم گرفتم که روی برنامه ای که خود اتمل برای راه اندازی twi در کامپایلر iar نوشته بود ، کار کنم.

اما انگار کدها حتی یک بار هم تست نشده بودند. کد هایی که برای راه اندازی حافظه های سری at24cxxxx نوشته شده بودند.

مشکلات اصلی:
1- mck در تابع AT91F_SetTwiClock تعریف نشده بود.(البته شاید در هدر خاصی define شده بود که من نداشتم.) (در مورد mck میتونید به مجله ی pmm شماره ی 4 مراجعه کنید.)

2-آدرس 7-بیتی(بدون r/w ) باید 16 بار به چپ شیفت می شدند.(طبق رجیستر TWI_MMR)

همان طور که از مورد آخر آشکار است، در هنگام قرار دادن آدرس در رجیستر MMR ، بیت R/W آدرس را حذف کرده سپس عملیات را ادامه میدهیم، چون بیت R/W به طور جداگانه در قسمت MREAD رجیستر MMR قرار خواهد گرفت.


در مورد مشکل اول، با قرار دادن مقدار کلاک مستر (mck) مشکل حل میشود.
(توجه کنید که طبق دیتاشیت، ckdiv یک مقدار 3 بیتی و CLDIV ,CHDIV مقادیر 8 بیتی هستند. پس مراقب حداکثر مقادیری که در این قسمت ها قرار میگیرند، باشید.)

مشکل دوم هم که با توجه به دیتاشیت بسیار واضح بود اما با این که کدها از طرف شرکت سازنده ارائه شده بود...

با برطرف کردن این دو مشکل، و با قرار دادن دو عدد مقاومت pull up در مسیر های کلاک و دیتا، 24c64 با موفقیت! راه اندازی شد.
----------------------------------------------------------------------------
البته توجه کنید که سایز آدرس داخلی را من همیشه معادل 2 در نظر گرفتم، اگر آدرس داخلی شما بزرگتر از 2 باشد(تا 3) تغییرات لازم را در فراخوانی تابع AT91F_TWI_ReadSingleIadr یا AT91F_TWI_WriteSingleIadr اعمال کنید.
----------------
و قبل از شروع به استفاده از باس، باید تابع AT91F_TWI_Open رو فراخوانی کنید.(فرکانس کاری 100 کیلو یا 400 کیلو هرتز)
---------------
مشکلی بود در همین تاپیک مطرح کنید تا با هم فکری هم درستش کنیم.
---------------
موفق باشید.

.zip   twi_header.zip (اندازه: 2.9 KB / تعداد دفعات دریافت: 177)
۲۴-شهریور-۱۳۸۹, ۰۳:۴۶:۵۷
وب سایت ارسال‌ها
پاسخ
تشکر شده توسط : محمد حسینی, رسول, t3r!p3000, electron113, sharin
محمد حسینی آفلاین
کاربر فعال بخش رباتیک
****

ارسال‌ها: 1,363
موضوع‌ها: 139
تاریخ عضویت: آذر ۱۳۸۴

تشکرها : 974
( 1780 تشکر در 620 ارسال )
ارسال: #2
RE: TWI(I2C) in AT91Sam7S
چند روزی هست تازه اومدم دانشگاه سرم خیلی شلوغه... خوابگاه و ...
پست رو چند روز پیش دیدم خیلی خوشحال شدم. تا دیشب که بالاخره فرصت شد دوباره تست کنم.

من با این twi خیلی درگیر شده بودم اما نتونستم سنسور تصویر راه بندازم.
at24c64 رو هم تست کرده بودم. بنظر عمل نوشتن درست انجام میشد اما نمیتونستم بخونم.
این کتابخونه ها هم ایرادی ندارن، فقط باید کامل همه هدرها تو برنامه باشه. مثلا ماکرو آدرس که 16 بیت باید به چپ شیفت داده بشه تو یه هدر دیگه بود و اونجا شیفت داده شده بود.

خلاصه دیشب که دوباره تست کردم بازم نتونستم از رو at24c64 بخونم!
برنامه تو تابع read گیر میکنه

#include <AT91SAM7X256.h>
#include "lib_AT91SAM7X256.h"
#include "TWI.h"
#include "delay.h"

int main (void)
{
unsigned int status,r=0;
char* s = " ";

delay_ms(2000);

AT91F_PIO_CfgOutput(AT91C_BASE_PIOB, 1<<19);

AT91F_TWI_Open(100000);

delay_ms(500);

r = AT91F_TWI_WriteSingleIadr(AT91C_BASE_TWI, 81, 1, 2, "a");

AT91F_TWI_ReadSingleIadr(AT91C_BASE_TWI, 81, 1, 2, s);

if (r == 0)
AT91F_PIO_SetOutput(AT91C_BASE_PIOB, 1<<19);

while(1){}
}

تابع توان pow که تو کد تنظیم کلاک هست یه مشکلی داره که warning میده و اصلا اون خط اجرا نمیشه!(جایی تعریف نشده). با هدر math.h هم نمیخونه! (همین هدری که گذاشتی رو میگما)
البته اینو خودم مقدار دادم (اگه اشتباه نکرده باشم)

به راه بادیه رفتن، به از نشستن باطل ------------- اگرچه وصل نیابم، بقدر وسع بکوشمRolleyes
(آخرین ویرایش در این ارسال: ۲۸-شهریور-۱۳۸۹, ۱۸:۰۳:۲۳، توسط محمد حسینی.)
۲۸-شهریور-۱۳۸۹, ۱۷:۵۵:۵۵
ارسال‌ها
پاسخ
تشکر شده توسط : رسول, t3r!p3000
salehjg آفلاین
مدیر بخش
*****

ارسال‌ها: 1,281
موضوع‌ها: 133
تاریخ عضویت: آذر ۱۳۸۸

تشکرها : 9560
( 8557 تشکر در 2603 ارسال )
ارسال: #3
RE: TWI(I2C) in AT91Sam7S
سلام

آقای سید عنکبوتی، حالتون؟
===========================
ارضا به حضور:

1- در رابطه با pow :

به فایلی که تابع main توش هست، هدر math رو include کنید، فکر کنم مشکل درست بشه.

*: در همون تابع که pow هست، تابع مشکل داره. باید برم رجیستر های قسمت کلاک و mckو pmc رو دقیق بخونم تا اون عدد 18432000 رو حذف کنم و مقدار فرکانس رو از روی رجیستر بخونم تا اگه میکرو با اون کلاک کار نکنه، مشکلی پیش نیاد.

2- در رابطه با آدرس آیسی حافظه:
آدرسی که شما نوشتید، 81 هست، پس یکی از پین های مختص آدرس دهی توی 24c64 رو باید 1 کنید(منظورم اینکه به بیت پر ارزش و کم ارزش توجه کنید)

3- در رابطه با نوشتن و خواندن از اییپرام:
دو تا تابعی که در هدر twi هست مخصوص نوشتن و خواندن از حافظه ی جانبی هستند: AT91F_AT24C_ReadByte , AT91F_AT24C_WriteByte
از این دوتا استفاده کنید، چون یه تاخیر کوچولو بعد از عملیات i2c لازمه تا eeprom کارش تمام بشه!!.

4- تو برنامه ی شما یه اشکال کوچولو مربوط به متغیر r هست:
کد:
r = AT91F_TWI_WriteSingleIadr(AT91C_BASE_TWI, 81, 1, 2, "a");
مقدار بازگشتی تابع read رو که در قسمت 3 توضیح دادم رو در متغیر r بریزید.

5- در رابطه مشکل با خواندن از eeprom:
-به شماره های 4 و 3 توجه کنید، اگه بازم نشد ....

-به مقاومت های بالا کشنده توجه کنید(من با 2کیلو تا 4.7 کیلو جواب گرفتم.)

-حافظه رو به 3.3 ولت وصل کنیدها(من اول با هوای avr به 5 زدم Biggrin )

-توی دیتاشیت یه چیزایی در مورد خازن و مقاومت pullup و رابطش گفته که من نفهمیدم که برای چیه و چیطوری به طور دقیق محاسبه میشه(اگه کسی میدونه بگه)

-طول سیم ها هم زیاد نباشه(یادم نیست چند بود، توی کتاب آموزش avr آقای 1nafar گفته شده بود)

- همین طوری دیشب توی فروم های خارجی در مورد سنسور تصویر می گشتم که دیدم که چیز جالبو:
گفته بود که: بعد از این که در ارتباط با وسیله ی جانبی که با i2c کار میکنه، دچار مشکل شدید، قبل از برقراری ارتباط جدید اون وسیله رو reset کنید.(این مورد در سنسور تصویر و راه اندازیش صدق میکنه)

- نمیدونمConfused

موفق باشید.
(آخرین ویرایش در این ارسال: ۲۹-شهریور-۱۳۸۹, ۰۱:۰۹:۵۵، توسط salehjg.)
۲۹-شهریور-۱۳۸۹, ۰۱:۰۵:۴۳
وب سایت ارسال‌ها
پاسخ
تشکر شده توسط : محمد حسینی, رسول, t3r!p3000, electron113
محمد حسینی آفلاین
کاربر فعال بخش رباتیک
****

ارسال‌ها: 1,363
موضوع‌ها: 139
تاریخ عضویت: آذر ۱۳۸۴

تشکرها : 974
( 1780 تشکر در 620 ارسال )
ارسال: #4
RE: TWI(I2C) in AT91Sam7S
نقل قول: آقای سید عنکبوتی، حالتون؟
چاکرتیم!

نقل قول: - در رابطه با نوشتن و خواندن از اییپرام:
دو تا تابعی که در هدر twi هست مخصوص نوشتن و خواندن از حافظه ی جانبی هستند: AT91F_AT24C_ReadByte , AT91F_AT24C_WriteByte
از این دوتا استفاده کنید، چون یه تاخیر کوچولو بعد از عملیات i2c لازمه تا eeprom کارش تمام بشه!!.
یعنی از WriteSingleIadr و ReadSingleIadr استفاده نکنم؟
الان که بیرونم. باید کدشون ببینم...
شاید تو همون کدی که گذاشتم بین نوشتن و خوندن تاخیر بذارم درست بشه. (شب تست میکنم)

نقل قول: - تو برنامه ی شما یه اشکال کوچولو مربوط به متغیر r هست:
اینو برای write گذاشتم که ببینم عمل نوشتن درست انجام میشه یا نه. اگه read رو حذف کنم مشکلی نداره.
ضمنا read که چیزی برنمیگردونه

pow هم همونطور که گفتم با هدر math درست نشد. خودم مقدار رجیستر رو حساب کردم (اینم شب میگم چه مقداری دادم...)

به راه بادیه رفتن، به از نشستن باطل ------------- اگرچه وصل نیابم، بقدر وسع بکوشمRolleyes
۲۹-شهریور-۱۳۸۹, ۱۱:۵۸:۲۶
ارسال‌ها
پاسخ
تشکر شده توسط : salehjg, رسول, t3r!p3000
محمد حسینی آفلاین
کاربر فعال بخش رباتیک
****

ارسال‌ها: 1,363
موضوع‌ها: 139
تاریخ عضویت: آذر ۱۳۸۴

تشکرها : 974
( 1780 تشکر در 620 ارسال )
ارسال: #5
RE: TWI(I2C) in AT91Sam7S
با تاخیر بین نوشتن و خوندن درست شد! Biggrin

البته تو آدرس دهی پوینترها هم اشتباه کرده بودم! (به عنوان یه دانشجوی کامپیوتر خیلی خجالت کشیدم!)
کد:
int main (void)
{
    unsigned int status,r=0;
    char s = 'x';
    char s2;
    
    delay_ms(1000);
    
    AT91F_PIO_CfgOutput(AT91C_BASE_PIOB, 1<<19);

    AT91F_TWI_Open(100000);
    
    delay_ms(500);
    
    r = AT91F_TWI_WriteSingleIadr(AT91C_BASE_TWI, 81, 1, 2, &s);

    delay_ms(10);

    AT91F_TWI_ReadSingleIadr(AT91C_BASE_TWI, 81, 1, 2, &s2);

    if (s2 == 'x'){
        AT91F_PIO_SetOutput(AT91C_BASE_PIOB, 1<<19);
    }

    while(1){}
}

واسه تنظیم کلاک 100 کیلو هرتز این مقدارو دادم
کد:
AT91C_BASE_TWI->TWI_CWGR = (1<<16)|(45<<8)|(45);
بی زحمت حساب کن ببین درسته؟

ممنون
آقا پایه باش این سنسور تصویر هم راه اندازی کنیم... این لعنتی زندگیم نابود کرده!

به راه بادیه رفتن، به از نشستن باطل ------------- اگرچه وصل نیابم، بقدر وسع بکوشمRolleyes
(آخرین ویرایش در این ارسال: ۲۹-شهریور-۱۳۸۹, ۱۸:۵۸:۴۱، توسط محمد حسینی.)
۲۹-شهریور-۱۳۸۹, ۱۸:۵۶:۳۳
ارسال‌ها
پاسخ
تشکر شده توسط : salehjg, t3r!p3000
salehjg آفلاین
مدیر بخش
*****

ارسال‌ها: 1,281
موضوع‌ها: 133
تاریخ عضویت: آذر ۱۳۸۸

تشکرها : 9560
( 8557 تشکر در 2603 ارسال )
ارسال: #6
RE: TWI(I2C) in AT91Sam7S
نقل قول:
کد:
AT91C_BASE_TWI->TWI_CWGR = (1<<16)|(45<<8)|(45);
سلام
ببخشید یادم نبود.
میشه بگید چطوری حساب کردید؟


توی تابع set_twiClcok اینا رو نوشته:

کد:
/* CLDIV = ((Tlow x 2^CKDIV) -3) x Tmck */
/* CHDIV = ((THigh x 2^CKDIV) -3) x Tmck */
/* Only CLDIV is computed since CLDIV = CHDIV (50% duty cycle) */

یکی از قسمت هایی که در twi نفهمیدم چی به چیه، همین قسمت کلاک هستش. قسمت بعدی هم فیلترش هست.
Rolleyes
----------

امروز باس i2c رو به صورت نرم افزاری با ست و رست کردن پین ها راه اندازی کردم(روی eeprom جواب داد)، و نتیجه ای که گرفتم: Biggrin

آدرس اسلیو سنسور اشتباه هه. Laugh
الان دارم تمام حالت های ممکن رو بررسی می کنم. Amaze

شما چیکارا کردید؟ جایی رسیدید؟


۰۲-مهر-۱۳۸۹, ۲۳:۰۴:۱۳
وب سایت ارسال‌ها
پاسخ
تشکر شده توسط : t3r!p3000, محمد حسینی, electron113
محمد حسینی آفلاین
کاربر فعال بخش رباتیک
****

ارسال‌ها: 1,363
موضوع‌ها: 139
تاریخ عضویت: آذر ۱۳۸۴

تشکرها : 974
( 1780 تشکر در 620 ارسال )
ارسال: #7
RE: TWI(I2C) in AT91Sam7S
برای رجیستر CWGR تو دیتاشیت نوشته که چطوری کلاک مشخص میشه... (محاسبه می خواد)

کلاک سنسور تصویر رو با واحد PMC درست کردم (همون 18 مگاهرتز) اما بازم جواب نداد!

آخرین حرکتی که میخوام بزنم تبدیل ولتاژ خط I2C با یه fet...
اگه اینم جواب نده دیگه دورشو خط میکشم

به راه بادیه رفتن، به از نشستن باطل ------------- اگرچه وصل نیابم، بقدر وسع بکوشمRolleyes
(آخرین ویرایش در این ارسال: ۰۳-مهر-۱۳۸۹, ۱۶:۵۳:۵۸، توسط محمد حسینی.)
۰۳-مهر-۱۳۸۹, ۱۶:۵۱:۰۷
ارسال‌ها
پاسخ
تشکر شده توسط : t3r!p3000, salehjg
hmg آفلاین
تازه وارد

ارسال‌ها: 8
موضوع‌ها: 1
تاریخ عضویت: شهریور ۱۳۸۸

تشکرها : 9
( 3 تشکر در 3 ارسال )
ارسال: #8
RE: TWI(I2C) in AT91Sam7S
(۲۴-شهریور-۱۳۸۹, ۰۳:۴۶:۵۷)salehjg نوشته است: با برطرف کردن این دو مشکل، و با قرار دادن دو عدد مقاومت pull up در مسیر های کلاک و دیتا، 24c64 با موفقیت! راه اندازی شد.
---------------
مشکلی بود در همین تاپیک مطرح کنید تا با هم فکری هم درستش کنیم.
---------------
با تشکر از شما
لطفا اگر امکان دارد یک شماتیک هم از مدارتون قرار دهید.
۰۶-مهر-۱۳۸۹, ۰۰:۰۹:۳۵
ارسال‌ها
پاسخ
salehjg آفلاین
مدیر بخش
*****

ارسال‌ها: 1,281
موضوع‌ها: 133
تاریخ عضویت: آذر ۱۳۸۸

تشکرها : 9560
( 8557 تشکر در 2603 ارسال )
ارسال: #9
RE: TWI(I2C) in AT91Sam7S
(۰۶-مهر-۱۳۸۹, ۰۰:۰۹:۳۵)hmg نوشته است: لطفا اگر امکان دارد یک شماتیک هم از مدارتون قرار دهید.
چیز خاصی نداره.
چون e0 , e1 ,e2 هیچ کدوم وصل نیستند پس آدرس اسلیو اییپرام با مقدار 1010000 در مبنای 2 برابر خواهد بود(البته بدون بیت R/W )

WC هم چون یه مقاومت پائین کشنده داخلی داره لازم نیست که به گراند وصلش کنید.

مقاومت های پول آپ هم می تونن از 2.7 کیلو تا 4.7 کیلو یا بیشتر(من تست نکردم) انتخاب بشن.

اینم عکس شماتیک»:
[تصویر:  DD_online.jpg]
(آخرین ویرایش در این ارسال: ۰۶-مهر-۱۳۸۹, ۱۶:۳۳:۲۲، توسط salehjg.)
۰۶-مهر-۱۳۸۹, ۰۱:۴۹:۱۳
وب سایت ارسال‌ها
پاسخ
تشکر شده توسط : t3r!p3000, reza555, hmg, رسول
hmg آفلاین
تازه وارد

ارسال‌ها: 8
موضوع‌ها: 1
تاریخ عضویت: شهریور ۱۳۸۸

تشکرها : 9
( 3 تشکر در 3 ارسال )
ارسال: #10
RE: TWI(I2C) in AT91Sam7S
(۰۶-مهر-۱۳۸۹, ۰۱:۴۹:۱۳)salehjg نوشته است: [quote='hmg' pid='136512' dateline='1285616375']

چیز خاصی نداره.
چون e0 , e1 ,e2 هیچ کدوم وصل نیستند پس آدرس اسلیو اییپرام با مقدار 1010000 در مبنای 2 برابر خواهد بود(البته بدون بیت R/W )

WC هم چون یه مقاومت پائین کشنده داخلی داره لازم نیست که به گراند وصلش کنید.

مقاومت های پول آپ هم می تونن از 2.7 کیلو تا 4.7 کیلو یا بیشتر(من تست نکردم) انتخاب بشن.

اینم عکس شماتیک»:
یعنی e0 و e1 و e2 نیازی نیست که به گراند وصل شند و خودشون مقاومت پایین کشنده دارند.
و اینکه پایه های PA.3 و PA.4 مربوط به TWI سخت افزاری هستند یا خودشما نرم افزاری اون پایه ها رو تعیین کردید.

۰۶-مهر-۱۳۸۹, ۱۹:۱۲:۱۷
ارسال‌ها
پاسخ
salehjg آفلاین
مدیر بخش
*****

ارسال‌ها: 1,281
موضوع‌ها: 133
تاریخ عضویت: آذر ۱۳۸۸

تشکرها : 9560
( 8557 تشکر در 2603 ارسال )
ارسال: #11
RE: TWI(I2C) in AT91Sam7S
نقل قول: یعنی e0 و e1 و e2 نیازی نیست که به گراند وصل شند و خودشون مقاومت پایین کشنده دارند.
طبق دیتاشیت بله.
نقل قول: و اینکه پایه های PA.3 و PA.4 مربوط به TWI سخت افزاری هستند یا خودشما نرم افزاری اون پایه ها رو تعیین کردید.
تا جایی که من می دونم سخت افزاری اند.

تا چند روز دیگه هدر راه اندازی باس twi به صورت نرم افزاری رو هم می زارم.
(شبیه سازی کردن با استفاده از پین ها)


۰۶-مهر-۱۳۸۹, ۱۹:۵۵:۳۴
وب سایت ارسال‌ها
پاسخ
تشکر شده توسط : t3r!p3000, hmg, electron113


موضوعات مرتبط با این موضوع...
موضوع نویسنده پاسخ بازدید آخرین ارسال
  رجیستر های AT91SAM7s salehjg 5 4,780 ۲۴-شهریور-۱۳۸۹, ۱۳:۰۸:۴۰
آخرین ارسال: 10845

پرش به انجمن:


کاربرانِ درحال بازدید از این موضوع: 2 مهمان

صفحه‌ی تماس | IranVig | بازگشت به بالا | | بایگانی | پیوند سایتی RSS