رفتن به مطلب

اموزش میکرو کنترلرهای avrگام به گام


ارسال های توصیه شده

قسمت بیست و یکم:ادامه ارتباط سریال SPI

طرز کار پایه SS در مد Slave :

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

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

بنابراین نرم افزار Master باید پایه های SS مربوط به Slave ها را کنترل کند .

طرز کار با پایه 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 بیت I واقع در رجیستر SREG قبلا فعال شده باشند ، سرویس وقفه اجرا می گردد .

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

لینک به دیدگاه

قسمت بیست و دوم:ادامه ارتباط سریال SPI

SPI وبرنامه ریزی میکرو به صورت ISP :

از آنجایی که و.اسطه SPI برای برنامه ریزی میکرو کنترلرهای AVR نیز استفاده می شود ، اگر شما قصد دارید تا علاوه بر استفاده از واسطه SPI میکرو کنترلررا نیز داخل مدار برنامه ریزی کنید ، لازم است تا برای اطمینان از عملکرد صحیح هردو سیستم از یک مقاومت سری 100 اهمی بین هریک از سه خط مشخص شده استفاده کنید .

بیت SPI interrupt Enable) SPIE-7 ):

با یک شدن این بیت در صورتی که بیت I در رجیستر SREG نیز یک شده باشد وقفه SPI فعال می گردد در این صورت اگر بیت SPIE واقع در رجیستر SPSR یک شود وقفه روی می دهد .

بیت SPI Enable ) SPE-6 ):

زمانی که این بیت یک شود SPI فعال می گردد .

بیت Data order) DORD-5 ) :

زمانی که این بیت یک شود ، ابتدا بیت LSB ارسال می گردد و در غیر این صورت ابتدا بیت MSB فرستاده شود

بیت Master/Slave Select) MSTR-4 ):

اگر این بیت یک شود SPI در حالت Master انتخاب می شود و در غیر این صورت SPI در حالت Slave تنظیم شود . اگر این بیت یک و SS به صورت ورودی تنظیم شده باشد و پایه SS صفر می گردد . MSTR پاک خواهد شد و بیت SPIF واقع در رجیستر یک می شود. در این صورت کاربرکاربر باید MSRT را بریا فعال سازی مجدد مد Master در SPI برابر یک تنظیم کند .

بیت CTock poiarity ) CPOL-3 ):

اگر این بیت یک باشد . در حالت بیکاری پایه SCK یک خواهد بود و در غیر این صورت این پایه صفر می شود .

بیت CIock phase) CPHA-2 ):

نحوه تنظیم این بیت مشخص می کند که داده بر روی اولین لبه یا آخرین لبه سیگنال SCK نمونه گیری شو.د .

بیتهای SPI Ciock Rate select Iand 0) SPRI ,SPRO – 0,1 ):

این دو بیت فرکانس کلاک پایه SCK را در حالت Master کنترل می کند . این بیتها در حالت Slave تأثیری ندارد .

لینک به دیدگاه

قسمت بیست و سوم:ادامه توضیح رجیسترهای ارتباط سریال SPI

بیت (SPI interrupt Flag)SPIF-7 :

زمانی که ارسال داده تکمیل شود ، پرچم SPIF یک می گردد و در صورتی که بیت SPIF در رجیستر SPCR یک وقفه ها به صورت سراسری فعال باشند . یک وقفه ایجاد می گردد .

بیت (Write COLision Flag)WCOL-6 :

اگربیت ECOL یک باشد با خواندن رجیستر (SPSR) SPI بیتهای SPIF ,WCOL پاک می شوند و سپس دسترسی به رجیستر داده SPI صورت می گیرد .

بیتهای (Reserved Bit )Res-5..1 :

این بیتها برای استفاده های بعدی ذخیره شده اند .

بیت (Double SPI speed Bit)SPI2X :

زمانی که SPI در حالت Master قرار داشته باشد با یک کردن این بیت سرعت SPI ( فرکانس SCK) دو برابر خواهد شد .

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

انواع مد های عملکرد اطلاعاتی (Data Modes) :

با توجه به داده سریال چهار ترکیب مختلف از فاز و پولاریته SCK وجود دارد که توسط بیتهای کنترلی CPOL , CPHA مشخص می گردند .

لینک به دیدگاه

قسمت بیست و چهارم:توابع کتابخانه Spi.h :

توابع کتابخانه Spi.h :

کامپایلر codevision کتابخانه spi.h را برای ساده نمودن بر قراری ارتباط بین برنامه های c و سایل جانبی از طریق باس SPI ارائه نموده است . تعریف این تابع در زیر دایرکتوری ../INC قرار دارد . قبل از استفاده از توابع موجود در آن باید آن را به کمک include #به ابتدای خود اضافه کنید . توابع SPI به قرار زیراند :

unsigned char spi (unsigned char data)i:

این تابع یک بایت داده را می فرستد و به طور همزمان یک بایت دریافت می کند . قبل از استفاده از تابع spi باید رجیستر کنترل SPI (SPCR)i را بر اساس مطالب ذکر شده در برگه های اطلاعاتی Atmel تنظیم نمود .

از آنجایی که تابع spi برای ارتباط SPI از روش polling استفاده می کند نیازی به فعال کردن وقفه SPI نیست . در ادامه مثالی از استفاده تابع spi برای برقراری ارتباط مبدل با آنالوگ به دیجیتال AD7896 آورده شده است :

در این برنامه مبدل آنالوگ به دیجیتال AD7896 به میکروکنترلر AT90S8515 متصل شده است.این برنامه هر 100 میلی ثانیه یکبار،مقدار ولتاژ ADC را به کمک تابع read_adc() به صورت سریال می خواند و بر روی LCD نمایش می دهد.

/*

Digital voltmeter using an

Analog Devices AD7896 ADC

connected to an AT90S8515

using the SPI bus

Chip: AT90S8515

Memory Model: SMALL

Data Stack Size: 128 bytes

Clock frequency: 4MHz

AD7896 connections to the AT90S8515

[AD7896] [AT9S8515 DIP40]

1 Vin

2 Vref=5V

3 AGND – 20 GND

4 SCLK – 8 SCK

5 SDATA – 7 MISO

6 DGND – 20 GND

7 CONVST- 2 PB1

8 BUSY – 1 PB0

Use an 2×16 alphanumeric LCD connected

to PORTC as follows:

[LCD] [AT90S8515 DIP40]

1 GND- 20 GND

2 +5V- 40 VCC

3 VLC

4 RS – 21 PC0

5 RD – 22 PC1

6 EN – 23 PC2

11 D4 – 25 PC4

12 D5 – 26 PC5

13 D6 – 27 PC6

14 D7 – 28 PC7 */

#asm

.equ __lcd_port=0×15

#endasm

#include // LCD driver routines

#include // SPI driver routine

#include

#include

#include

// AD7896 reference voltage [mV]

#define VREF 5000L

// AD7896 control signals PORTB bit allocation

#define ADC_BUSY PINB.0

#define NCONVST PORTB.1

// LCD display buffer

char lcd_buffer[33];

unsigned read_adc(void)

{

unsigned result;

// start conversion in mode 1

// (high sampling performance)

NCONVST=0;

NCONVST=1;

// wait for the conversion to complete

while (ADC_BUSY);

// read the MSB using SPI

result=(unsigned) spi(0)

// read the LSB using SPI and combine with MSB

result|=spi(0);

// calculate the voltage in [mV]

result=(unsigned) (((unsigned long) result*VREF)/4096L);

// return the measured voltage

return result;

}

void main(void)

{

// initialize PORTB

// PB.0 input from AD7896 BUSY

// PB.1 output to AD7896 /CONVST

// PB.2 & PB.3 inputs

// PB.4 output (SPI /SS pin)

// PB.5 input

// PB.6 input (SPI MISO)

// PB.7 output to AD7896 SCLK

DDRB=0×92;

// initialize the SPI in master mode

// no interrupts, MSB first, clock phase negative

// SCK low when idle, clock phase=0

// SCK=fxtal/4

SPCR=0×54;

// the AD7896 will work in mode 1

// (high sampling performance)

// /CONVST=1, SCLK=0

PORTB=2;

// initialize the LCD

lcd_init(16);

lcd_putsf(“AD7896 SPI busnVoltmeter”);

delay_ms(2000);

lcd_clear();

// read and display the ADC input voltage

while (1)

{

sprintf(lcd_buffer,”Uadc=%4umV”,read_adc());

lcd_clear();

lcd_puts(lcd_buffer);

delay_ms(100);

{;

{

انجام تنظیمات اولیه ارتباط سریال SPI در Codewizard :

در صورتی که در برنامه Codewizard بر روی لبه SPI کلیک کنید می توانید ویژگیهای ارتباط SPI را تنظیم کنید . با انتخاب گزینه SPI enabled ارتباط SPI در داخل میکرو فعال می شود .

اگر قصد دارید تا پس از اتمام یک ارسال SPI، وقفه تولید گردد باید گزینه SPI interrupt را علامت بزنید علاوه بر این شما می توانید پارامترهای زیر را تنظیم کنید:

SPI clock rate:

کلاک استفاده شده در پایه SCK برای ارسال داده ها را مشخص می کند .

Clock phase :

موقعیت لبه سیگنال SCK را نسبت به بیت داده مشخص می کند .

Clock polarity :

وضعیت پایه SCK را در حالت بیکاری تعیین می کند .

SPI Type :

حالت عملکرد SPI را به صورت Master یا slave مشخص می کند .

Data order :

ترتیب ارسال بیتهای داده ( اول LSB یا اول MSB ) را تعیین می کند .

انتخاب گزینه clock Rate*2 که برای بعضی از تراشه های VAR وجود دارد ،سرعت کلاک SPI را دو برابر می کند

برای بر قراری ارتباط از طریق واسطه SPI در صورتی که وقفه SPI غیر فعال باشد ، از توابع SPI استفاده می شود و در صورتی که وقفه SPI فعال باشد باید از روتین وقفه spi_isr که توسط Codewizard تولید می شود ،استفاده نمود .

لینک به دیدگاه
  • 3 ماه بعد...

به گفتگو بپیوندید

هم اکنون می توانید مطلب خود را ارسال نمایید و بعداً ثبت نام کنید. اگر حساب کاربری دارید، برای ارسال با حساب کاربری خود اکنون وارد شوید .

مهمان
ارسال پاسخ به این موضوع ...

×   شما در حال چسباندن محتوایی با قالب بندی هستید.   حذف قالب بندی

  تنها استفاده از 75 اموجی مجاز می باشد.

×   لینک شما به صورت اتوماتیک جای گذاری شد.   نمایش به صورت لینک

×   محتوای قبلی شما بازگردانی شد.   پاک کردن محتوای ویرایشگر

×   شما مستقیما نمی توانید تصویر خود را قرار دهید. یا آن را اینجا بارگذاری کنید یا از یک URL قرار دهید.

×
×
  • اضافه کردن...