PDA

توجه ! این یک نسخه آرشیو شده میباشد و در این حالت شما عکسی را مشاهده نمیکنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : کمک در مورد واحد spi



xp10
29-09-2013, 23:45
با سلام.
دوستان بنده یک مشکل در پورت spi داشتم. که از دوستان بزرگوار درخواست کمک دارم.
من با کدویژن کار میکنم و در راه اندازی این پورت با تابع اماده مشکلی ندارم.
ولی مشکلم اینجاست که میخواستم بدون استفاده از این تابع این کار رو بکنم. تونستم از یه چند جایی یه مطالبی پیدا کنم ولی کدی پیدا نکردم.
از دوستان در خواست دارم بنده رو راهنمایی کنن.
اگه یه کد کوچیک بزارن و یه کوچولو توضیح بدنم که عالی میشه.پ
با تشکر

shahrivar88
30-09-2013, 02:12
این یک برنامه است که برای دو تا میکروی اسلیو و مستر نوشته شده یک ارتباط بین دو تا میکرو که فایل پروتیوسش هم هست.

xp10
30-09-2013, 10:58
این یک برنامه است که برای دو تا میکروی اسلیو و مستر نوشته شده یک ارتباط بین دو تا میکرو که فایل پروتیوسش هم هست.
خیلی ممنون از راهنمایی شما ولی دوست عزیز من در این مورد مشکلی ندارم.
مشکل من اینجاست که میخوام spi را بدون استفاده از دستور spi() راه اندازی کنم.
دوستان اگه بشه کمک کنن.
با تشکر

Shapour_Ardebil
30-09-2013, 11:06
با سلام.
دوستان بنده یک مشکل در پورت spi داشتم. که از دوستان بزرگوار درخواست کمک دارم.
من با کدویژن کار میکنم و در راه اندازی این پورت با تابع اماده مشکلی ندارم.
ولی مشکلم اینجاست که میخواستم بدون استفاده از این تابع این کار رو بکنم. تونستم از یه چند جایی یه مطالبی پیدا کنم ولی کدی پیدا نکردم.
از دوستان در خواست دارم بنده رو راهنمایی کنن.
اگه یه کد کوچیک بزارن و یه کوچولو توضیح بدنم که عالی میشه.پ
با تشکر

با سلام

آقای کی نژاد در این مورد فیلم خوبی دارد مثال هم براش داره اگر میخواهید اصولی یاد بگیرید من پیشنهادم همین است

You can see links before reply

shahrivar88
30-09-2013, 15:16
ببخشید. من درست متوجه خواسته شما نشدم.
برای اینکه شما بتونید بدون استفاده از تابع spi() داده را دریافت و ارسال کنید باید مستقیما با ریجستر های این واحد کار کنید.
کد زیر خود تابع spi() است شما هم مشابه همین کد ها اگر نیاز داشتید استفاده کنید.




unsigned char spi(unsigned char data)
{
SPDR=data;
while ((SPSR & (1<<SPIF))==0);
return SPDR;
}




نخست تنظیمات مورد نظر با استفاده از ریجستر spcr تنظیم کنید
داده ای که میخواهید ارسال کنید را در ریجستر spdr (ریجستر داده) قرار دهید
پس از ارسال داده دوباره ریجستر داده را بخوانید. (با ارسال هر بیت داده یک بیت داده نیز دریافت میشود و در همان ریجستر spdr قرار میگیرد. پس، بعد از ارسال 8 بیت داده، 8 بیت داده دریافت میشود ودر ریجستر داده نوشته میشود)

xp10
30-09-2013, 22:04
با تشکر

unsigned char spi(unsigned char data) { SPDR=data; while ((SPSR & (1<<SPIF))==0); return SPDR; }
من تاجایی که خونده بودم نوشته بود که باید پایه ss رو ابتدا صفر کنیم بعد داده رو ارسال کنیم.
مشکل دومم هم دقیقا تو این کد هست. اگه بشه یه توضیحی در این مورد بدین. دقیقا این حلقه رو متوجه نمیشم.
while ((SPSR & (1<<SPIF))==0);
مبتدیم دیگه.
یکی هم این قسمت دقیقا چکار میکنه.
1<<SPIF

shahrivar88
01-10-2013, 01:13
شما پایه ای رو در میکروی مستر در نظر بگیرید. مثلا PORTA.0 این پایه را به SS اسلیو وصل کنید. حال شما با صفر و یک کردن PORTA.0 میتونید ss اسلیو رو کنترل کنید. در نظر داشته باشید نباید ss مستر رو به ss اسلیو وصل کنید و انتظار داشته باشید این کار خود به خود انجام بشه. برای مطالعه بیشتر به پروژه ای که قرار دادم توجه کنید.



1<<SPIF
این دستور یعنی عدد 00000001 را به اندازه SPIF (که عدد 7 است) به چپ شیفت بده. که میشه 10000000
ُ بیت هفتم ریجستر SPSR است که پرچم وقفه است. این بیت زمانی 1 میشه که ارسال کامل بشه. توی برنامه وقتی داده را در ریجستر SPDR قرار داد توی این خط منتظر میمونه که داده کامل ارسال بشه.




while ((SPSR & (1<<SPIF))==0);
دستور بالا با دستور زیر هیچ تفاوتی ندارد



while ((SPSR & (1<<7))==0);

توی هر دو مورد برنامه با چک کردن بیت هفتم ریجستر SPIF منتظر پایان ارسال میمونه. SPIF درون کتابخانه کد ویژن به عدد 7 define شده علتش هم اینه که به جای نوشتن 7 این عبارت رو مینویسن تا شما راحت تر متوجه بشید این 7 چیه!

برای سایر موارد هم باز اگر پروژه مستر رو بررسی کنید متوجه میشید که داده را چطوری باید ارسال کرد.