ارتباط سريال SPI
ويژگي هاي اين ارتباط را در زير مشاهده ميکنيد:
1- ارتباط سريال سنکرون با سرعت بالا
2- از اين ارتباط ميتوان براي اتصال ميکرو هاي avr به يکديگر يا اتصال ميکرو به هر وسيله اي که اين ارتباط را پشتيباني مي کند استفاده کرد
3- ارسال و دريافت داده هم زمان
4- استفاده از 4 سيم براي انتقال اطلاعات
5- قابليت تنظيم سرعت انتقال ديتا
6- داراي منبع وقفه پايان ارسال
7- حداکثر طول کابل ارتباطي بدون سيم شيلد در يک منطقه با نويز متوسط پنجاه سانتي متر است
8- ارتباط به صورت هاي مستر يا اسليو
9- نياز به سيم گراند براي ارتباط
در اين ارتباط از چهار پايه mosi و miso و sck و ss استفاده مي شود که در ميکرو مگا 16 به ترتيب پايه 5 تا 8 ميباشد (از portb.4 تا portb.7 ).
در زير نحوه پيکر بندي spi در بسکام امده است:
دستورپيکره بندي SPI :
کد php:
Config Spi = Hard,Interrupt=On/Off,Data Order = Lsb/Msb,Master = Yes/No,Polarity=High/Low,Phase=0/1,Clock Rate=4/16/64/128,Noss=0/1
INTERRUPT=ON/OFF : در صورت استفاده از وقفه در ارتباط سريال از گزينه ON استفاده مي شود ، در اين حالت تنها زماني که داده اي ميخواهد منتقل شود ميکرو کار ميکند .
DATA ORDER = LSB/MSB: در صورت انتخاب LSB ، ابتدا LSB (بيت کم ارزش ) و سپس MSB(بيت پرارزش) داده ارسال مي شود و بالعکس.
MASTER = YES/NO: اين گزينه مشخص ميکن ميکرو master ( فرمانده) است يا slave (فرمانبردار) گه گزينه yes مشخص کننده ميکرو مستر و گزينه no مشخص کننده ميکرو اسليو است.
POLARITY=HIGH/LOW : اين گزينه و ضعيت پايه کلاک را در زمان بيکاري ميکرو مشخص ميکن که ميتواند صفر (low ) يا يک ( high) باشد .
CLOCK RATE=4/16/64/128: مشخص کننده فرکانس کلاک SPIاست .
NOSS=0/1: زماني که در حالتMASTER نمي خواهيد سيگنال /SS ايجاد شود، يک انتخاب مي شود ودر اين حالت کاربر به صورت نرم افزاري بايد پايه SLAVE مورد نظر را پايين نگه دارد.
در حالت بالا از پايه هاي پيشفرض براي انتقال ديتا استفاده مي شود ، در صورتي که ميخ.اهيد آنها را به پيه هاي ديگر تغيير دهيد بايد از دستور زير استفاده کنيد:
کد php:
CONFIG SPI=SOFT, DIN=PIN, DOUT = PIN , SS = PIN|NONE, CLOCK = PIN
DIN=PIN :نشانگر پايه MISO است و پين نام پايه دل خواه ميباشد.
DOUT = PIN : نشانگر پايه MOSI است و پين نام پايه دل خواه ميباشد.
SS = PIN|NONE نشانگر پايه SS است و پين نام پايه دلخواه ميباشد. ( در صورتي از گزينه NONE استفاده کنيد پايه تغيير نميکند
CLOCK = PIN : نشانگر پايه SCK است و پين نام پايه دلخواه ميباشد.
مانند:
کد php:
CONFIG SPI=SOFT, DIN=PIND.0, DOUT = PIND.1 , SS = PIND.2, CLOCK = PIND.3
ديگر دستورات مربوط به SPI :
SPIINIT توسط اين دستور پايه هاي که براي SPI (mosi و miso و sck و ss (در ميکرو مگا 16 به ترتيب پايه 5 تا 8 ميباشد (ازportb.4 تا portb.7 ))).استفاده ميشوند ، براي اين مد فعال مي گردند و ديگر نميتوان از آنها به عنوان ورودي يا خروجي استفاده کرد.
توسط اين دستور به تعداد BAYT از درگاه SPI اطلاعات دريافت مي شود و در متغيير VAR قرار ميگيرد ، در صورتي که متغير شما از جنس WORD يا ديگر متغيير ها است ، شما بايد تعداد بايت متغيير را به جاي BAYT بنويسيد .
مانند:
کد php:
'MASTER
$regfile = "m16def.dat"
$crystal = 8000000
Config Lcdpin = Pin , Db4 = Pind.2 , Db5 = Pind.3 , Db6 = Pind.4 , Db7 = Pind.5 , Rs = Pind.0 , E = Pind.1
Config Lcd = 16 * 2
Dim A As Byte
Config Spi = Hard , Interrupt = On , Data Order = Lsb , Master = Yes , Polarity = High , Phase = 0 , Clockrate = 128
Spiinit
Do
Spiin A , 1
Locate 1 , 1
Lcd A
Loop
End
توسط اين دستور به تعداد BAYT، داده VAR به درگاه SPI اطلاعات ارسال مي شود ، در صورتي که متغير شما از جنس WORD يا ديگر متغيير ها است ، شما بايد تعداد بايت متغيير را به جاي BAYT بنويسيد.
مانند:
کد php:
'SLAVE
$regfile = "m16def.dat"
$crystal = 8000000
Dim A As Word
Config Spi = Hard , Interrupt = On , Data Order = Lsb , Master = No , Polarity = High , Phase = 0 , Clockrate = 128
Spiinit
Do
Incr A
Waitms 300
Spiout A , 1
Loop
End
هر دو مثال بالا مربوط به ارتباط SPI بين دو ميگرو مگا 16 است که مدار آن را در زير مشاهده ميفرماييد:
از اين دستور در زمان ارتباط دوطرفه استفاده مي شود ، توسط اين دستور متغيير BAYT به باس SPI ارسال شده و همزمان داده دريافت شده از باس در متغير VAR قرار ميگيرد.
مثال:
برنامه SLAVE:
کد php:
$regfile = "m16def.dat": $crystal = 8000000
Dim A As Byte,B As Byte
Config Lcdpin = Pin , Db4 = Pind.2 , Db5 = Pind.3 , Db6 = Pind.4 , Db7 = Pind.5 , Rs = Pind.0 , E = Pind.1
Config Lcd = 16 * 2
Config Spi = Hard , Interrupt = On , Data Order = Lsb , Master = No , Polarity = High , Phase = 0 , Clockrate = 128
Spiinit
Do
B = Spimove(a)
A = A + 2
Locate 1 , 1 :Lcd "Spiout:"; A
Locate 2 , 1: Lcd "SPIIN:" ; B
Waitms 300
Loop
End
برنامه MASTER :
کد php:
$regfile = "m16def.dat": $crystal = 8000000
Dim A As Byte,B As Byte
Config Lcdpin = Pin , Db4 = Pind.2 , Db5 = Pind.3 , Db6 = Pind.4 , Db7 = Pind.5 , Rs = Pind.0 , E = Pind.1
Config Lcd = 16 * 2
Config Spi = Hard , Interrupt = On , Data Order = Lsb , Master = Yes , Polarity = High , Phase = 0 , Clockrate = 128
Spiinit
Do
B = Spimove(a)
Incr A
Locate 1 , 1: Lcd "Spiout:"; A
Locate 2 , 1 :Lcd "SPIIN:" ; B
Waitms 300
Loop
End
مثال:
در اين مثال پايه هاي مربوط به ارتباط SPI تغيير کرده اند ، شما ميتوانيد آنها را به حالت پيش فرض برگردانيد:
برنامه SLAVE :
کد php:
$regfile = "m16def.dat":$crystal = 8000000
Dim A As Byte,B As Byte
Config Lcdpin = Pin , Db4 = Pind.2 , Db5 = Pind.3 , Db6 = Pind.4 , Db7 = Pind.5 , Rs = Pind.0 , E = Pind.1
Config Lcd = 16 * 2
Config Spi = Soft , Din = Pina.0 , Dout = Pina.1 , Ss = Pina.2 , Clock = Pina.3
Spiinit
Do
B = Spimove(a)
A = A + 2
Locate 1 , 1: Lcd "Spiout:"; A
Locate 2 , 1: Lcd "SPIIN:" ; B
Waitms 300
Loop
End
[/quote]
برنامه MASTER :
[quote]
$regfile = "m16def.dat":$crystal = 8000000
Dim A As Byte,B As Byte
Config Lcdpin = Pin , Db4 = Pind.2 , Db5 = Pind.3 , Db6 = Pind.4 , Db7 = Pind.5 , Rs = Pind.0 , E = Pind.1
Config Lcd = 16 * 2
Config Spi = Soft , Din = Pina.0 , Dout = Pina.1 , Ss = Pina.2 , Clock = Pina.3
Spiinit
Do
B = Spimove(a)
Incr A
Locate 1 , 1: Lcd "Spiout:"; A
Locate 2 , 1: Lcd "SPIIN:" ; B
Waitms 300
Loop
End
مدار مورد استفاده:
منبع :
http://www.iranled.com/forum/showthread.php?tid=10869