PDA

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



mzarkoob
29-01-2012, 20:11
با سلام
گفتم این تایپیک را بزنم تا رجیستر های مد SPI در میکرو lpc2378 را بیشتر بررسی کنیم. آقای عبداللهی زحمت نوشتن یک کتابخونه را کشیدند (اینجا (You can see links before reply)) ولی می خواهیم بیشتر با کار هر کدام از رجیستر ها برای راه اندازی آشنا بشیم که این شرط اول استفاده است.
چون میدونم کسی استقبال نمی کنه بعد از مطرح کردن موارد خودم شروع به سوال پرسیدن هم می کنم:0013:
چند تا قانون داریم
1- غلط غولوط هم میذارم غاطی متالب تا اصاتید هم مجبور به مشارکت و قلت گیری بشند!
2- سنت حسنه نصفه کاره رها کردن تایپیک را هم حتما رعایت میکنم تا کسی تعجب نکنه!
3- همیشه بند 1و2 را در نظر میگیریم:mrgreen:
نظری ندارید شروع کنم.

M.ABDOLLAHI
29-01-2012, 20:53
سلام چطوری مهدی جان آفرین ادامه بده نظر من اینه که بهتره بیشتر روی ssp کار کنیم بعد اینکه برای نمونه مثال کاربردی فکر میکنم بهتره ماژول rfm12 را با این رابط راه اندازی کنیم من با نرم افزاری تونستم ولی هر کار کردم نتونستم با رابط ssp که خوشبختانه تا 16 بیت هم ساپورت میکنه راه اندازی کنم .در ضمن فکر میکنم اگر بتونیم کتابخانه FAT که برای SSP میکرو LPC1768 هست را برای LPC2378 تغییر بدیم خیلی خوب میشه ...

mzarkoob
29-01-2012, 21:33
نظر من اینه که بهتره بیشتر روی ssp کار کنیم حالا قدم قدم. مشکلی نیست از قانون 2 استفاده می کنیم وسط کار میریم سراغ اون ssp !


(Serial Peripheral Interface)ارتباط سریال SPI یک پروتکل ارتباط سریال سنکرون باسرعت بالا می باشد. به وسیله مد SPI می توانیم داده را روی پورت SPI بخوانیم یا بنویسیم. این مد دارای 4 پایه خروجی می باشد. 1- پین کلاک خارجی SCS 2- پین انتخاب اسلیو SSEL 3و4- دو پین داده MISO,MOSI

همین طور این مد دارای 5 رجیستر کنترل(S0SPCR)، وضعیت(S0SPSR)، داده(S0SPDR)، شمارنده کلاک(S0SPCCR) و پرچم وقفه(S0SPINT) می باشد:

You can see links before reply



در سیمولینک کیل این رجیستر ها به این صورت می باشد:


You can see links before reply


در پست بعدی رجیستر کنترل بررسی می شود.

mzarkoob
29-01-2012, 21:55
ابتدا از فعال بودن این مد اطمینان حاصل می کنیم:

PCONP |= (1 << 8);
تا مثل اینجا (You can see links before reply) نشه!
1- رجیستر کنترل SPCR :این رجیستر کنترل عملیات spi را به عهده دارد و دارای هفت بیت می باشد:


You can see links before reply

بیت BitEnable : با صفر بودن این بیت کنترلر SPI فقط 8 بیت ارسال دریافت می کند. با 1 کردن این بیت مطابق مقداری که در بیت 8 تا 11(Bits) ست شده است تبادل انجام می شود.
بیت CPHA : با یک کردن این بیت داده بر روی آخرین لبه سیگنال SCK نمونه گیری می شود. با صفر بودن این بیت این کار بر روی اولین لبه انجام می شود.
بیت CPOL : با یک کردن این بیت، پایه SCK در حالت بیکاری یک خواهد بود و با صفر کردن این بیت، پایه SCK در حالت بیکاری صفر خواهد بود .

ma-bah
29-01-2012, 22:12
در ضمن فکر میکنم اگر بتونیم کتابخانه FAT که برای SSP میکرو LPC1768 هست را برای LPC2378 تغییر بدیم خیلی خوب میشه ...

اینا پایه هستم چون که من یه دونه 2378 دارم که پایه ی مربوط به دیتا توی واحد mci زدیم کنیم و فقط می تونم با spi رم sd رو راه اندازی کنم .

mzarkoob
29-01-2012, 23:23
ادامه رجیستر کنترل SPCR :

You can see links before reply


بیت MSTR: با یک کردن این بیت SPI در حالت Master قرار می گیرد و با صفر بودن این بیت در حالت Slave قرار می گیرد.
بیت LSBF : با یک کردن این بیت ارسال از LSB(بیت 0 یا کم ارزش) آغاز می شود و با صفر بودن این بیت ارسال از MSB(بیت 7 یا باارزش) آغاز می شود.
بیت SPIE: با یک کردن این بیت، وقفه این مد فعال می شود به صورتی که وقتی بیت SPIF یا MODF فعال شد یک وقفه بیاید.
بیت BITS: همان طور که در قسمت BitEnable بیان شد با فعال بودن بیت BitEnable ، تعداد بیتی که ارسال می شود در اینجا مشخص می شود.

mzarkoob
30-01-2012, 15:53
2- رجیستر وضعیت SPSR:

You can see links before reply

بیت ABRT: شکست Slave! موقعی این بیت 1 می شود که Slave کردن بی نتیجه باشد. این بیت با خواندن این رجیستر پاک می شود.
بیت MODF: موقعی این بیت 1 می شود که خطای مد رخ دهد.

You can see links before reply


بیت ROVR : یک شدن این بیت نشان می دهد که خواندن مجدد انجام شده است. این بیت با خواندن این رجیستر پاک می شود.
بیت WCOL: با نوشته شدن داده جدیدی در رجیستر داده (SPDR) در حین انتقال داده قبلی، بیت WCOL یک می شود.
بیت SPIF: با تکمیل شدن ارسال داده این بیت یک می شود. و اگر بیت وقفه(SPIE) هم فعال باشد یک وقفه ایجاد می شود.

mzarkoob
30-01-2012, 20:08
3- رجیستر دیتا SPDR :

You can see links before reply


این رجیستر برای انتقال داده به کار می رود. با نوشتن بر روی این رجیستر داده ارسال می شود و خواندن این رجیستر باعث خواندن بافر مربوط به دریافت شیفت رجیستر می شود.

دارای 8 بیت پایینی و هشت بیت بالایی است. موقعی از 8 بیت بالایی استفاده می شود که بیت BitEnable فعال باشد و مقداری بیشتر از 1000 در بیت 8 تا 11 قرار گیرد.

mzarkoob
30-01-2012, 21:09
4- رجیستر شمارنده کلاک CCR :

You can see links before reply


این رجیستر فرکانس SCK مستر را کنترل می کند.



5- رجیستر وقفه SPINT :


You can see links before reply





این رجیستر هم شامل پرچم وقفه می باشد.

mzarkoob
30-01-2012, 21:21
یه مقدار به نظرم زوده بند قانون 2 را انجام بدم . به نظرتون تونستم بند 1 را رعایت کنم!؟

mzarkoob
31-01-2012, 14:34
انگار استقبال از این موضوع خیلی زیاده !! برای همین به خودم گفتم حیفه ادامه ندم:0013:
در این چند تایپیک هم در مورد نحوه عملکرد این مد چند مطلب میذارم(از کتاب ره افروز) و بعد اگه استقبال به همین شکل ادامه پیدا کنه میریم سراغ ست کردن رجیستر های شرح داده شده در lpc2378


آشنایی با طرز کار مد SPI:

همان طور که در شکل زیر مشاهده می شود از دو شیفت رجیستر و یک تولید کننده کلاک در Master تشکیل شده است:

You can see links before reply

زمانی که Master پایه SS (Slave Selection)مربوط به Slave را زمین کند سیکل ارتباطی آغاز می گردد ،در این صورت Master پالسهای کلاک لازم برای انتقال اطلاعات بین Master و Slave را بر روی پایه SCK تولید می کند.داده ها همواره به کمک پایه MOSI از Master به Slave و به کمک پایه MISO از Slave به Master شیفت می یابند. در پایان هربسته از داده ها نیز Master ، Slave را با یک پایه SS با خود سنکرون می کند.در حقیقت با اتصالMaster و Slave رجیسترهای 8 بیتی داده SPI در این دو وسیله یک شیفت رجیستر 16 بیتی را تشکیل می دهند که هربار محتویات آن به صورت چرخشی یک واحد شیفت می یابد، بنابراین در صورتی که محتویات این رجیستر 8 بار شیفت پیدا کند ، محتویات رجیستر های داده MasterوSlave با یک دیگر تعویض می گردند.
SPI درحالت ارسال یک بافر و در حالت دریافت دو بافر دارد . این بدان معنی است که تا زمانی که عمل شیفت کامل نشود، نمی توان داده دیگری را برای ارسال در داخل رجیستر داده SPI نوشت . در زمان دریافت نیز باید قبل از رسیدن کارکتر بعدی ، کارکتر دریافت شده از داخل رجیستر داده SPI خوانده شود، در غیر این صورت بایت اول از بین خواهد رفت.
میمونه
طرز کار پایه SS در مد Slave
و
طرز کار با پایه SS در مد Master

mzarkoob
31-01-2012, 16:38
طرز کار پایه SS در مد Slave :
اگر SPI به صورت Slave تنظیم شود ، پایه SS همیشه ورودی خواهد بود . زمانی که SS صفر شود SPI فعال می گردد و پایه MISO در صورتی که از قبل، توسط کاربر به صورت خروجی تنظیم شده باشد می تواند وظیفه اش را انجام دهد و دو پایه دیگر SPI نیز به صورت ورودی خواهند ماند . زمانی هم که SS یک باشد تمامی پایه های ورودی می شوند و SPI غیر فعال می گردد که در این صورت داده های رسیده دریافت نمی شوند . توجه داشته باشید که SPI با یک شدن پایه RESET ، SS می شود و داده موجود در شیفت رجیستر از بین می رود و در حقیقت پایه SS برای سنکرون کردن SLAVE با Master به کار می رود.
از آنجایی که دریک سیستم SPI می تواند در یک زمان چند Slave وجود داشته باشد به راهی برای انتخاب Slaveمورد نظر برای ارتباط با آن نیاز داریم :

You can see links before reply




برای تحقق این امر می توانیم از پایه SS استفاده کنیم. اگر SS در وضعیت بالا نگه داشته شود ، تمامی پایه های SPI در Slaveبه صورت ورودی خواهند بود و داده SPI را دریافت نمی کنند . به بیان دیگر اگر این پایه در حالت پایین قرار گیرد ، SPI فعال می شود .
بنابراین نرم افزار Master باید پایه های SS مربوط به Slave ها را کنترل کند .

mzarkoob
31-01-2012, 18:46
طرز کار با پایه SS در مد Master :
اگر SPI به صورت Master تنظیم شود جهت پایه SS توسط کاربر تعیین می گردد .
اگر پایه SS به صورت خروجی تنظیم شود بر روی عملکرد سیستم SPI تأثیر نمی گذارد . معمولا از این پایه برای کنترل پایه SS در Slave استفاده می گردد .اگر پایه SS به صورت ورودی تنظیم شود، باید برای اطمینان از عملکرد صحیح Master به صورت یک نگه داشته شود (Pull-up ).اگر پایه SS توسط یک مدار جانبی در زمانی که SPI به صورت Master و پایه SS به صورت ورودی تنظیم شده اند، صفر گردد ، سیستم SPI آن را به عنوانMaster دیگری که SPI را به صورت Slave انتخاب کرده است تعیبر می کند و ارسال داده ها به آن را آغاز می نماید .
سیستم SPI برای جلو گیری از اتصال باس ، اعمال زیر را انجام می دهد :
1- بیت MSTR واقع در رجیسترSPCR صفر می شود و سیستم SPI به صورت Slave در می آید و با تبدیل SPI به یک slave ، پایه های SCK و MOSI ورودی می گردند .
2- پرچم SPIF واقع در رجیستر SPSR یک می شود در صورتی که وقفه SPI قبلا فعال شده باشند، سرویس وقفه اجرا می گردد .
بنابراین زمانی که در مدMaster از وقفه ارسال SPI استفاده می گردد و این احتمال وجود دارد که پایه SS صفر شود ،وقفه باید همیشه از یک بودن بیت MSTR مطمئن گردد و در صورتی که این بیت توسط پایه SS صفر شده است با یک کردن آن SPI دوباره به صورت Master فعال نماید .

mzarkoob
31-01-2012, 22:57
پیکربندی:

از پایه p0.15 برای کلاک SCK و از پایه p0.16 برای انتخاب اسلیو (SSEL) و از پایه p0.17 و p0.18 به ترتیب برای MISO و MOSI استفاده می کنیم:


/* Port 0.15 SPI SCK, port0.16 uses GPIO SPI_SEL, port0.17 MISO, port0.18 MOSI */
PINSEL0 |= 0xC0000000; // 1100 0000 0000 0000 0000 0000 0000 0000
PINSEL1 |= 0x0000003C; // 0000 0000 0000 0000 0000 0000 0011 1100





You can see links before reply







دقت شود که این جا پایه p0.16 در مد GPIO می باشد. برای همین 00 قرار می گیرد. اگر می خواستیم در حالت SSEL باشد 11 قرار می دادیم که بدین ترتیب داشتیم :

PINSEL1 |= 0x0000003F; // 0000 0000 0000 0000 0000 0000 0011 1111خوب حالا یک سوال: کی پایه 16 را در مد GPIO و چه موقع در مد SSEL قرار می دهیم؟

mzarkoob
01-02-2012, 13:57
کسی نبود!!! :sa:

mzarkoob
01-02-2012, 16:40
تنظیمات رجیستر کنترل(S0SPCR) :

ساده ترین حالت تنظیم بدین صورت است که SPI را در مد Masrer (یا Slave)قرار داده و ارسال از بیت کم ارزش LSB انجام شود و 8 بیت هم ارسال داشته باشیم. اگه دلمون هم خواست! وقفه را هم می زنیم:


You can see links before reply





S0SPCR = 0x60;


خوب حالا میکرو آماده است تا داده ای را در رجیستر داده S0SPDR قرار دهد تا ارسال انجام شود. خوب حالا باید تابعی داشته باشیم که داده را در آن قرار دهیم و وقتی ارسال تکمیل شد به ما خبر دهد تا داده بعدی انجام شود و ....
این تابع چی میتونه باشه؟

mzarkoob
01-02-2012, 19:13
استفاده از رجیستر وضعیت (SPSR) :

برای ارسال و دریافت باید از این رجیستر استفاده کنیم. دو کار می توانیم انجام دهیم . یا از بیت وقفه استفاده نکنیم و یا استفاده بکنیم. برنامه هایی که من دیدم اینهاست:

اگه استفاده بکنیم :


unsigned int SPI0(unsigned int val)
{
unsigned int received=0;
S0SPDR=val;
while( !(S0SPSR & SPIF)); //wait for transfer to be completed
received=S0SPDR;
return(received);
}


آقای عبدالهی یه توضیحی میدید این ارسال میکنه یا دریافت!؟ آخه هم یه چیزی میریزه در S0SPDR هم از S0SPDR میخونه.

و اگه از بیت وقفه نکنیم:


while(1)
{
for(i=0;i<8;i++){
S0SPDR = x[i];
while(!(S0SPSR & 0x80)); //wait for transfer to be compeleted
for(j=0;j<1000000;j++);
}
}


خوب یکی میگه اون 0x80 کارش چیه؟ (نیست سوال قبلی ها را جواب دادید ، اینم روش!!)

mzarkoob
02-02-2012, 10:52
بازم کسی نبود!!!؟
انگار دیگه از lpc قرار نیست بخاری بلند بشه:baad:

esi_52000
02-02-2012, 14:00
بازم کسی نبود!!!؟
انگار دیگه از lpc قرار نیست بخاری بلند بشه:baad:

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

mzarkoob
02-02-2012, 16:34
اِ یکی اومد نظر داد!!:018: یا دارم خواب میبینم:mrgreen:

esi_52000
02-02-2012, 17:05
نه مهدی جان.من پیگیر پیگیرم .راستش رو بخوایی من خودم زبانم افتضاحه.واسه همین نمی نونستم دیتاشیت رو ترجمه کنم.اما این آموزشات خیلی کمکم کرده.دمت گرم داداش.خیر ببینی مادددددر:mrgreen:
منتظر بقیه اون هستیماااااااااااااااااا

mzarkoob
02-02-2012, 20:08
منتظر بقیه اون هستیماااااااااااااااااا
یعنی میگید قانون بند یک را اجرا نکنیم!!؟ این جوری بد میشها !

در ضمیمه دو فایل spi.c و spi.h هست که کمک میکنه. در فایل اول چند تا تابع هست . برای روتین وقفه:

void SPI0Handler (void) __irq پیکربندی اولیه:

DWORD SPIInit( void )ارسال:

void SPISend( BYTE buf)دریافت:

void SPIReceive( BYTE *buf, DWORD Length )دریافت بایت:

BYTE SPIReceiveByte( void )که در فایل spi.h ثوابت تعریف شده اند.
با سر در آوردن از اینها میشه یه برنامه ساده تر اجرا کرد. حالا ما یکی یکی سوال میکنیم تا اساتید جواب بدند(مثل قبلی ها که جواب دادند!)

این دستور در پیکر بندی اولیه SPI برای چی هست:


IODIR0 |= 0x4000;

sadmonew
02-02-2012, 21:33
سوال:
این دستور در پیکر بندی اولیه spi برای چی هست؟


iodir0 |= 0x4000;

سلام
مهندس من خيلي با arm كار نكردم. شما بيشتر وارد هستيد.
اين دستور تمام پين هاي پورت 0 رو به غير از پين p0.14 رو به ورودي تبديل ميكنه. نميدونم شايد دارم اشتباه ميگم.

mzarkoob
02-02-2012, 21:47
اين دستور تمام پين هاي پورت 0 رو به غير از پين p0.14 رو به ورودي تبديل ميكنه. نميدونم شايد دارم اشتباه ميگم.
بله من دیباگ کردم دیدم تیک p0.14 برداشته میشه. ولی این سوالمه که این چه کارایی برای ما اینجا داره؟ ما که از 4 پایه p0.15 و p0.16 و p0.17 و p0.18 استفاده می کنیم. این چیکارس!

sadmonew
02-02-2012, 21:52
راستي شما براي اين فايل راه انداز(spi.h , spi.c) مثال هم داريد، نميدنم اما يه چيزي به ذهنم رسيد اول ميخوام مطمئن بشم بعد اگه درست بود عنوان ميكنم.

mzarkoob
02-02-2012, 22:27
در فایلی که هست چند فایل کمه خطا داره در اجرا. امروز داشتم بهش ور می رفتم نشد که خطاها را برطرف کنم. البته تا الان. فکر کنم را حل منطقیش اینه که یکی یکی بریم جلو . مثلا فقط فایل ارسال بعد ...

sadmonew
02-02-2012, 22:59
فکر کنم را حل منطقیش اینه که یکی یکی بریم جلو . مثلا فقط فایل ارسال بعد ...
بله مرحله مرحله پيش بريم. منظورتون دستور ارساله ديگه؟ يا؟
راستي همون مثال پر از Error رو هم بذاريد، بد نيست.

mzarkoob
02-02-2012, 23:06
بله دستور ارسال
اصل فایل همینه که گذاشتم. فقط یه فایل اصلی داره که از اینها استفاده می کنه
اینم فایل:

sadmonew
02-02-2012, 23:17
خوب به نظر شما چيكار كنيم؟
شما ميگيد كه تابع ارسال رو توضيح بديم در واقع هدف اصلي اين باشه كه دقيقا كار هر كدوم از رجيستر هارو يا بگيريم و اينكه براي دستور ارسال دقيقا چه رجيسترهايي رو بايد برنامه ريزي كنيم. بعد يه مثال هم در آخر كار براش مي نويسيم.

mzarkoob
02-02-2012, 23:46
خوب به نظر شما چيكار كنيم؟
شما ميگيد كه تابع ارسال رو توضيح بديم در واقع هدف اصلي اين باشه كه دقيقا كار هر كدوم از رجيستر هارو يا بگيريم و اينكه براي دستور ارسال دقيقا چه رجيسترهايي رو بايد برنامه ريزي كنيم. بعد يه مثال هم در آخر كار براش مي نويسيم.
هر کدوم ما را به هدفمون برسنه فرقی نمی کنه
اگه اولی را بخواهیم انجام بدیم می خواهیم دستور :

SPISend(data)را راه بندازیم. در تابع اصلی از این دستور استفاده شده. تابع آن هم اینه:

void SPISend( BYTE buf)
{
BYTE Dummy;

IOCLR0 |= 0x4000;
S0SPDR = buf;
while(0==(S0SPSR&0x80));
IOSET0 |= 0x4000;
Dummy = S0SPDR; /* Flush the RxFIFO */
Dummy = Dummy; /* ·ÀÖ¹±àÒëÆ÷±¨´í */

return;
}موارد ابهام اینهاست:
این چیه! : BYTE Dummy
ما با پایه 14 چیکار داریم؟ IOSET0 |= 0x4000
اگه ارسال می کنیم چرا رجیستر داده را می خونیم؟ Dummy = S0SPDR
البته در پست 17 (You can see links before reply) کتابخونه آقای عبداللهی که گذاشتند هم مورد سوال را گفته ام.

esi_52000
02-02-2012, 23:47
داداش مهدی.به نظر من بدونیم کار رجیسترها چیه خیلی عالیه.هر چند در عمل ممکنه زیاد کاری باهاش نداشته باشیم(چون همواره از لایبری استفاده میکنیم)ولی خوب واسه کار با میکرو های دیگه کمکمون میکنه.چون بالاخره همشون از رجیسترهای مشابه استفاده میکنن.بازم میگم دمت گرم داداشی.منتظر دومیش هستییییییییییییییییم:018:

sadmonew
03-02-2012, 00:03
...موارد ابهام اینهاست:
این چیه! : Byte dummy
ما با پایه 14 چیکار داریم؟ ioset0 |= 0x4000
...
نميدونم شايد اين راه انداز رو براي سخت افزار خاصي نوشتن كه تو اون سخت افزار لازمه از پين 14 پورت صفر استفاده كنن.

sadmonew
03-02-2012, 00:11
...موارد ابهام اینهاست:
این چیه! : Byte dummy
اگه ارسال می کنیم چرا رجیستر داده را می خونیم؟ dummy = s0spdr
...
البته فكر ميكنم اين خط از برنامه براي اينه كه به ما بگه ديتا درست ارسال شده يا نه؟!

mzarkoob
03-02-2012, 00:36
حالا پایه 14 مهم نیست. اصل مطلب نحوه ارسال است که چگونه باید انجام شود.

M.ABDOLLAHI
04-02-2012, 15:37
سلام علیکم خوبی بهتره شما روی مبحث بافر 8 بایتی دریافت و ارسال رابط ssp هم کار کنی...

hamidchi
26-05-2012, 12:31
سلام
ببخشید سوالم ناشیانه س ولی این سیمولینک کیل ار کجا باز میشه ؟ تو کدوم قسمتشه؟

hamidchi
26-05-2012, 16:51
پیکربندی:

از پایه p0.15 برای کلاک SCK و از پایه p0.16 برای انتخاب اسلیو (SSEL) و از پایه p0.17 و p0.18 به ترتیب برای MISO و MOSI استفاده می کنیم:


/* Port 0.15 SPI SCK, port0.16 uses GPIO SPI_SEL, port0.17 MISO, port0.18 MOSI */
PINSEL0 |= 0xC0000000; // 1100 0000 0000 0000 0000 0000 0000 0000
PINSEL1 |= 0x0000003C; // 0000 0000 0000 0000 0000 0000 0011 1100





You can see links before reply







دقت شود که این جا پایه p0.16 در مد GPIO می باشد. برای همین 00 قرار می گیرد. اگر می خواستیم در حالت SSEL باشد 11 قرار می دادیم که بدین ترتیب داشتیم :

PINSEL1 |= 0x0000003F; // 0000 0000 0000 0000 0000 0000 0011 1111خوب حالا یک سوال: کی پایه 16 را در مد GPIO و چه موقع در مد SSEL قرار می دهیم؟

:hi:

میشه بگید چرا پایه های P0.15 و P0.16 v رو در حالت GPIO قرار دادین ؟

مگه اولی پایه 15 نباید به عنوان SCK به کار بره ؟ و مقدار PINSEL0 براش 11 باشه ؟
همین طور برای پایه 16 که باید در حالت SSEL باشه و مقدار 11 رو بریزیم توی PINSEL0 مربوطه؟

hamidchi
26-05-2012, 19:15
استفاده از رجیستر وضعیت (SPSR) :

برای ارسال و دریافت باید از این رجیستر استفاده کنیم. دو کار می توانیم انجام دهیم . یا از بیت وقفه استفاده نکنیم و یا استفاده بکنیم. برنامه هایی که من دیدم اینهاست:

اگه استفاده بکنیم :


unsigned int SPI0(unsigned int val)
{
unsigned int received=0;
S0SPDR=val;
while( !(S0SPSR & SPIF)); //wait for transfer to be completed
received=S0SPDR;
return(received);
}


آقای عبدالهی یه توضیحی میدید این ارسال میکنه یا دریافت!؟ آخه هم یه چیزی میریزه در S0SPDR هم از S0SPDR میخونه.

و اگه از بیت وقفه نکنیم:


while(1)
{
for(i=0;i<8;i++){
S0SPDR = x[i];
while(!(S0SPSR & 0x80)); //wait for transfer to be compeleted
for(j=0;j<1000000;j++);
}
}


خوب یکی میگه اون 0x80 کارش چیه؟ (نیست سوال قبلی ها را جواب دادید ، اینم روش!!)

:hi::hi:

0X80 شماره بیت SPIF در رجیستر SPSR هست که منم اول تو برنامم نوشته بود SPIF ولی خطا گرفت که با نوشتن 0X80 بر طرف شد

و همچنین در مورد برنامه بالایی ،هم میفرسته هم میگیره چون بعد از انتقال SPI شیفت رجیستر ها اطلاعاتشونو با هم عوض میکنند.:mrgreen:

hamidchi
26-05-2012, 19:42
آقایون اساتید سلام

چرا کسی جواب سوال منو نمیده ؟:(

اگه پایه p0.16 رو با رجیستر pinsel0 در حالت ssel قرار بدیم ، باز هم میشه که مقدار اون رو در خروجی تغییر داد ؟

من برای کار با آیسی صدای isd4004 این رو میپرسم

esi_52000
26-05-2012, 21:34
آقایون اساتید سلام

چرا کسی جواب سوال منو نمیده ؟:(

اگه پایه p0.16 رو با رجیستر pinsel0 در حالت ssel قرار بدیم ، باز هم میشه که مقدار اون رو در خروجی تغییر داد ؟

من برای کار با آیسی صدای isd4004 این رو میپرسم

سلام دوست عزیز .من خوذم با 2378 کار نمیکنم و با 1768 کار میکنم.
در حالت کلی همه سعی میکنن کار پایه ssel رو به برنامه واگذار نکنن و خوذشون اونو کنترل کنن. من خوذم هم با وجود اینکه با ذستورات cmsis کار میکنم اما بازم این پایه رو در حالت gpio نگه میدارم و خوذم کنترلش میکنم.شما میتونیذ این کار رو نکننین و کنترل ائن رو به برنامه بسپرین.انتخاب با شماست دااشم

hamidchi
27-05-2012, 09:21
سلام دوست عزیز .من خوذم با 2378 کار نمیکنم و با 1768 کار میکنم.
در حالت کلی همه سعی میکنن کار پایه ssel رو به برنامه واگذار نکنن و خوذشون اونو کنترل کنن. من خوذم هم با وجود اینکه با ذستورات cmsis کار میکنم اما بازم این پایه رو در حالت gpio نگه میدارم و خوذم کنترلش میکنم.شما میتونیذ این کار رو نکننین و کنترل ائن رو به برنامه بسپرین.انتخاب با شماست دااشم

میشه یکم بیشتر توضیح بدین
یعنی وقتی در حالت ssel باشه همیشه ارتباط برقراره ؟
منظورتون از این که گفتین کنترلش رو به برنامه بسپارین چی بود ؟؟؟؟

hamidchi
27-05-2012, 09:29
دوستان میشه یه توضیحی درباره رجیستر S0SPCCR بدین ..... همونیکه مربوط به تنظیمات کلاک میشه .. آخی توی دیتا شیتش هم چیز زیادی نگفته و فقط اینو گفته که 8 تا بیت داره واسه تنظیم کردنش
حالا چه مقداری رو باید برای چه تنظیماتی ریخت داخلش .. الله اعلم ؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟

خواهشا اگه میدونید ، حالت های مختلفشو بگید ما هم بدونیم خو :baad::baad:

sadmonew
27-05-2012, 19:23
میشه یکم بیشتر توضیح بدین
یعنی وقتی در حالت ssel باشه همیشه ارتباط برقراره ؟
منظورتون از این که گفتین کنترلش رو به برنامه بسپارین چی بود ؟؟؟؟
سلام مهندس
اون پايه رو ميشه تو دو حالت تنظيم كرد:
1- به صورت سخت افزاري
2- به صورت نرم افزاري

hamidchi
27-05-2012, 20:33
سلام مهندس
اون پايه رو ميشه تو دو حالت تنظيم كرد:
1- به صورت سخت افزاري
2- به صورت نرم افزاري

یه مقداراگه فرقشو بیشتر توضیح بدین ممنون میشم

hamidchi
27-05-2012, 20:36
دوستان یه سوال دیگه

چطور میتونم توسط رجیستر spccr کلالک سیستم رو خیلی کم کنم ؟
میخام فرکانس خیلی پایین باشه