پیش نیاز : دوره آموزشی AVR
دسترسی سریع به بخش های قبلی :
مقدمه
در بخش گذشته با برخی از واحدهای مهم میکروکنترلر LPC2138 آشنا شدیم. در ادامه معرفی و تشریح واحدها به بخش مهمی از واحدها به نام ارتباطات سریال می رسیم. ارتباطات سریال در میکروکنترلرهای ARM7 به صورت UART ( آسنکرون ) ، SPI ، SSP و I2C وجود دارد. در این بخش این ارتباط ها به جز SSP را معرفی می کنیم و توابع کار با آن ها را ارائه خواهیم کرد. برای درک بهتر عملکرد واحدهای ارتباطی سریال توصیه می شود آموزش ارتباط سریال در AVR و همچنین آموزش استاندارهای ارتباطی سریال را قبل از ادامه مطالعه بفرمایید.
راه اندازی واحد UART
یکی از مهمترین ارتباطات سریال در میکروکنترلرهای ARM7 واحد UART (مخفف Universal Asynchronous Reciever and Transmitter به معنای فرستنده و گیرنده آسنکرون جهانی ) می باشد. هر ارتباط UART میتواند به یکی از دو صورت Half-Duplex ( نیم دوطرفه ) یا Full-Duplex ( تمام دوطرفه ) باشد. در این ارتباط حداقل سه اتصال RX ( Receive Data ) و TX ( Transmitt Data ) و زمین ( GND ) وجود دارد. شکل زیر نحوه سیم بندی این ارتباط به صورت تمام دوطرفه را نشان می دهد.
راه اندازی واحد UART در LPC2138
این واحد ارتباط سریال توسط پروتکل UART را فراهم می آورد. در این میکروکنترلر دو واحد UART0 و UART1 وجود دارد. برای UART0 دو پایه RXD0 و TXD0 وجود دارد. از UART0 میتوان برای پروگرام کردن میکرو به صورت بوت سریال نیز استفاده کرد. اما واحد UART1 علاوه بر پایه های RXD1 و TXD1 دارای پایه های دیگری همچون RTS1 ، CTS1 ، DSR1 ، DTR1 و RI1 می باشد که برای کنترل جریان در شبکه ها ( Flow Control ) و ارتباط با تجهیزات دارای ترمینال همچون پرینترها و مودم ها به کار گرفته می شود. در جدول زیر پایه های اصلی این دو واحد و شماره پورت آنها را مشاهده می کنید.
RXD | TXD | Pin |
P0.1 | P0.0 | UART0 |
P0.9 | P0.8 | UART1 |
رجیسترهای واحد UART
رجیستر UxLCR ( مخفف UART Line Control Register )
یک رجیستر 8 بیتی می باشد که تنظیمات دیتای ارسالی را مشخص می کند. دیتای ارسالی با عنوان فریم ( Frame ) شناخته می شود که در شکل زیر آن را مشاهده می کنید.
بیت 0 و 1 : این دو بیت با هم به صورت زیر طول دیتای ارسالی را مشخص می کند:
1 2 3 4 |
00 : 5 bit 01 : 6 bit 10 : 7 bit 11 : 8 bit |
بیت 2 : این بیت تعداد Stop بیت ها را مشخص می کند. در حالت دیفالت این بیت 0 بوده و تعداد Stop بیت ها 1 می باشد. در صورتی که این بیت 1 شود تعداد Stop بیت ها 2 می شود.
بیت 3 : در صورتی که این بیت 0 باشد No parity و در صورتی که 1 باشد یک بیت Parity در فریم ارسالی وجود خواهد داشت.
بیت 4 و 5 : این دو بیت تنظیم وضعیت بیت Parity در صورت وجود را به صورت زیر مشخص می کند :
1 2 3 4 |
00 : Odd Parity 01 : Even Parity 10 : parity=1 11: parity=0 |
توضیح : در حالت Odd ابتدا تعداد بیت های 1 دیتا را می شمارد و در صورت فرد بودن Parity=1 و در غیر این صورت Parity=0 می شود. در حالت Even نیز ابتدا تعداد بیت های 1 دیتا را می شمارد و در صورت زوج بودن Parity=1 و در غیر این صورت Parity=0 می شود. در دو حالت بعدی بیت Parity همیشه ثابت است.
بیت 6 : این بیت که Break Control نام دارد ، کنترل جریان نرم افزاری ایجاد می کند. به طوری که در صورت 1 شدن این بیت ارسال متوقف شده و پایه TXD منطق 0 می گیرد.
بیت 7 : این بیت اجازه انجام تقسیم فرکانس در رجیسترهای UxDLL و UxDLM را می دهد. بنابراین برای تنظیم Baud Rate ابتدا این بیت 1 می شود و بعد از مقداردهی به رجیسترها باید مجددا این بیت 0 شود.
رجیسترهای UxDLL و UxDLM ( مخفف UART Divisor Latch LSB و UART Divisor Latch MSB )
این رجیسترها تقسیم کننده هستند که به منظور ساخت Baud Rate دلخواه تنظیم می شوند. هر دو این رجیسترها 8 بیتی هستند و درون آنها عدد 16 بیتی زیر قرار می گیرد:
رجیستر UxRBR ( مخفف UART Receiver Buffer Register )
یک رجیستر 8 بیتی فقط خواندنی ( Read Only ) می باشد که دیتای مورد نظر جهت ارسال درون آن قرار می گیرد.
رجیستر UxTHR ( مخفف UART Transmit Holding Register )
یک رجیستر 8 بیتی فقط نوشتنی ( Write Only ) می باشد که دیتای مورد نظر بعد از دریافت درون آن قرار می گیرد.
رجیستر UxLSR ( مخفف UART Line Status Register )
این رجیستر 8 بیتی فقط خواندنی است و از هر بیت آن به منظور خواندن وضعیت قسمت های مختلف واحد UART به شرح زیر استفاده می شود.
بیت 0 : زمانی که این بیت 1 شود به معنای تمام شدن دریافت کاراکتر توسط واحد UART می باشد و بعد از آن میتوان از رجیستر UxRBR دیتای وارد شده را خواند.
بیت 5 : زمانی که این بیت 1 شود به معنای مشغول بودن واحد UART در ارسال کاراکتر می باشد و به محض 0 شدن آن میتوان دیتا ارسالی را درون رجیستر UxTHR ریخت.
مراحل راه اندازی UART0 و UART1 ( بدون وقفه )
- انجام تنظیمات Frame در رجیستر UxLCR و 1 کردن بیت 7 آن
- تعیین نرخ ارسال/دریافت ( Baud Rate ) در رجیستر UxDLL و UxDLM
- باز گرداندن بیت 7 ام رجیستر UxLCR به حالت اولیه خود یعنی 0
- تعیین عملکرد پایه های RXD و TXD میکرو در رجیستر PINSEL
توابع راه اندازی UART0 و UART1 ( بدون وقفه )
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
void uart0_init(unsigned short baud) { unsigned short div; div = (unsigned short)(PCLK/(baud*16)); U0LCR = 0x83; U0DLL = (div); U0DLM = (div>>8); U0LCR &= ~(1<<7); PINSEL0 = (1<<3)|1; } void uart1_init(unsigned short baud) { unsigned short div; div = (unsigned short)(PCLK/(baud*16)); U1LCR = 0x83; U1DLL = (div); U1DLM = (div>>8); U1LCR &= ~(1<<7); PINSEL0 = (1<<16)|(1<<18); } |
توابع ارسال و دریافت در ارتباط سریال UART
این توابع برای ارسال یک کاراکتر یا دریافت یک کاراکتر مورد استفاده قرار می گیرند.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
int U0Write(int data) { while( (U0LSR & (1<<5))== 0); return (U0THR = data); } int U0Read(void) { while( (U0LSR & (1<<0))==0); return U0RBR; } int U1Write(int data) { while( (U1LSR & (1<<5))== 0); return (U1THR = data); } int U1Read(void) { while( (U1LSR & (1<<0))==0); return U1RBR; } |
مثال عملی شماره 19 : با راه اندازی واحد UART در میکروکنترلر LPC2138 و اتصال آن به کامپیوتر برنامه ای بنویسید که با دریافت هر کاراکتر توسط میکرو ، همان کاراکتر مجددا به سمت کامپیوتر ارسال شود.
لینک دانلود سورس مثال عملی شماره 19
فعالسازی وقفه دریافت UART
برای فعال سازی وقفه دریافت کافی است ابتدا واحد VIC را برای UART شماره X تنظیم کرده و سپس بیت صفرام رجیستر UxIER را برابر 1 کنیم. همچنین یک تابع سابروتین وقفه به برنامه اضافه می شود که کافی است درون آن یک رشته با اندازه دلخواه تعریف کنیم و مقدار آن را برابر رجیستر UxRBR قرار دهیم. در نتیجه با آمدن هر وقفه ، یک کاراکتر دریافت و درون رشته مورد نظر ذخیره می شود.
مثال عملی شماره 20 : با راه اندازی واحد UART و فعالسازی وقفه دریافت در میکروکنترلر LPC2138 برنامه ای بنویسید که با دریافت هر کاراکتر توسط میکرو آن را به سمت کامپیوتر ارسال نماید.
لینک دانلود سورس مثال عملی شماره 20
راه اندازی واحد SPI
این واحد ارتباط سریال توسط پروتکل SPI ( مخفف Serial Pheripheral Interface ) را فراهم می آورد. پروتکل SPI یک ارتباط دوطرفه با سرعت بسیار بالا می باشد که بین Master و Slave در فواصل کوتاه برقرار می شود. شکل زیر نحوه سیم بندی این ارتباط را نشان می دهد.
راه اندازی واحد SPI در LPC2138
این واحد ارتباط سریال توسط پروتکل SPI را فراهم می آورد. در میکروکنترلر LPC2138 دو واحد SPI0 و SSP/SPI1 وجود دارد. این رابط های SPI هر یک ارتباط دو طرفه Full Duplex ، به صورت سنکرون ، با سرعت حداکثر 30Mhz و قابلیت 8 تا 16 بیت در هر ارسال و دریافتی را فراهم می آورد. شکل زیر نحوه ارتباط بین Master و Slave توسط این پروتکل را نشان می دهد.
همانطور که مشاهده می کنید ، واحد SPI دارای 4 پایه به نام های زیر می باشد :
1 2 3 4 |
SCK : Serial Clock MISO : Master in Slave out MOSI : Master out Slave in SSEL : slave select |
در جدول زیر پایه های مربوط به این واحد در میکروکنترلر LPC2138 مشاهده می کنید.
SSEL | MOSI | MISO | SCK | |
P0.7 | P0.6 | P0.5 | P0.4 | SPI0 |
P0.20 | P0.19 | P0.18 | P0.17 | SPI1 |
نکته مهم : نام رجیسترهای SPI0 و SSP/SPI1 با یکدیگر تفاوت دارد در نتیجه برنامه ای جداگانه برای راه اندازی هر یک باید نوشته شود که در این آموزش SPI0 راه اندازی می شود و برای SPI1 نیز با کمی تفاوت میتواند مورد استفاده قرار گیرد.
رجیسترهای واحد SPI0
رجیستر S0SPCR ( مخفف SPI0 Serial Peripheral Control Register )
این رجیستر مربوط به تنظیمات کنترلی واحد SPI می باشد:
بیت 2 ( BitEnable ) : در صورتی که این بیت 0 باشد در هربار ارسال/دریافت 8 بیت جابجا می شود اما وقتی این بیت 1 باشد در هربار ارسال/دریافت بین 8 تا 11بیت جابجا می شود.
بیت 3 ( CPHA ) : در صورتی که این بیت 0 باشد دیتا در زمان رسیدن در لبه بالارونده SCK خوانده می شود و در صورتی که 1 باشد در لبه پایین رونده SCK خوانده می شود.
بیت 4 ( CPOL ) : این بیت تعیین کننده Polarity سیگنال SCK در حالتی است که دیتا رد و بدل نمی شود به طوری که وقتی این بیت 0 باشد سیگنال SCK در حالت عادی High و در صورتی که این بیت 1 باشد سیگنال SCK در حالت عادی Low است.
بیت 5 ( MSTR ) : تعیین Master یا Slave بودن عملکرد واحد SPI است ( سیگنال SCK همیشه توسط Master تولید می گردد ) به طوری که در صورت 0 بودن این بیت Slave و در صورت 1 بودن این بیت Master می باشد.
بیت 6 ( LSBF ) : این بیت جهت ارسال بیت های دیتا را مشخص می کند به طوری که در صورت 0 بودن این بیت جهت ارسال از با ارزشترین بیت ( MSB First ) تا کم ارزشترین بیت می باشد و در صورت 1 بودن این بیت جهت ارسال از کم ارزشترین بیت ( LSB First ) تا با ارزشترین بیت می باشد.
بیت های 8 تا 11 ( BITS ) : زمانی که بیت دوم همین رجیستر 1 باشد میتوان به صورت زیر مقدار دیتای جابجا شده در هر بار انتقال را مشخص کرد.
1 2 3 4 5 6 7 8 9 |
1000 : 8Bit 1001 : 9Bit 1010 : 10Bit 1011 : 11Bit 1100 : 12Bit 1101 : 13Bit 1110 : 14Bit 1111 : 15Bit 0000 : 16Bit(default) |
رجیستر S0SPSR ( مخفف SPI0 Serial Peripheral Status Register )
این رجیستر 8 بیتی فقط خواندنی ( Read Only ) می باشد و وضعیت های زیر را نشان می دهد:
بیت 3 ( ABRT ) : زمانی که این بیت 1 شود نشان دهنده در دسترس نبودن Slave می باشد ( Slave Abort )
بیت 4 ( MODF ) : زمانی که این بیت 1 شود نشان دهنده خطا در تنظیمات SxSPCR است.
بیت 5 ( ROVR ) : زمانی که این بیت 1 شود نشان دهنده سرریز شدن در هنگام دریافت ( خواندن ) دیتا است ( Read Overrun )
بیت 6 ( WCOL ) : زمانی که این بیت 1 شود نشان دهنده تصادم در هنگام نوشتن ( ارسال ) دیتا است ( Write Collision )
بیت 7 ( SPIF ) : زمانی که این بیت 1 شود نشان دهنده پایان یافتن صحیح ارسال می باشد. این بیت در پایان هر ارسال صحیح یکبار 1 می شود. ( SPI Transfer Complete Flag ).
رجیستر S0SPDR ( مخفف SPI0 Serial Peripheral Data Register )
این رجیستر مربوط به دیتایی است که ارسال/دریافت می شود. در حالت عادی در هر مرحله 8 بیت ارسال می شود و در صورتی که بیت 2 رجیستر SxSPCR تنظیم شده باشد ، به تعداد تنظیم شده در بیت های 8 تا 11 رجیستر SxSPCR ارسال/دریافت خواهیم داشت. در هر کلاک SCK یک بیت جابجا می شود تا اینکه انتقال پایان یابد.
رجیستر S0SPCCR ( مخفف SPI0 Clock Counter Register )
این رجیستر تنظیمات فرکانس SCK در حالت Master را مشخص می کند. اگر مقداری که درون این رجیستر ریخته می شود را X بنامیم ، X همیشه زوج و بزرگتر مساوی 8 باید باشد. با داشتن Pclk و قرار دادن فرکانس مورد نظر Fspi مقدار X به صورت زیر بدست می آید:
مراحل راه اندازی SPI0
- انجام تنظیمات S0SPCR ( برای Master و Slave )
- انجام تنظیمات S0SPCCR ( فقط برای Master )
- انجام تنظیمات پایه ها در رجیستر PINSEL
- فعال سازی Slave توسط Master ( فقط برای Master )
تابع راه اندازی واحد SPI0 در Master
در میکرو کنترلر Master در صورتی که فرض کنیم Pclk=3Mhz و Fspi=100Khz داریم :
1 2 3 4 5 6 7 8 |
void spi0_master_init(void) { S0SPCCR=0x1E;//Fspi S0SPCR=0x20;//master8bit PINSEL0|=0x00005500; ssel_init; ssel_1; } |
تذکر : از هر کدام از پایه های میکرو میتوان به عنوان SSEL برای انتخاب Slave ها استفاده نمود. در خطوط انتهایی تابع فوق باید پایه SSEL خروجی شود و سپس برابر 1 شود تا Slave فعال گردد. برای مثال میتوان نوشت :
1 2 |
IO0DIR|=(1<<8);//ssel_init IO0SET|=(1<<8);//ssel_1 |
تابع راه اندازی واحد SPI0 در Slave
در صورتی که یک LPC2138 دیگر به صورت Slave با Master در ارتباط باشد ، از تابع زیر برای راه اندازی آن استفاده می گردد:
1 2 3 4 5 |
void spi_slave_init(void) { S0SPCR =0x00;//slave8bit PINSEL0|=0x00005500; } |
تابع انتقال دیتا در واحد SPI0
تابعی که یک انتقال در میکروکنترلر Master یا میکروکنترلر Slave ( در صورت وجود ) انجام می دهد به صورت زیر می باشد. این تابع یک 8 بیتی را در ورودی خود دریافت کرده و در 8 کلاک از SCK آن را بین Master و Slave جابجا می کند. در نهایت تابع ، 8 بیت دریافت شده را به خروجی برمیگرداند.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
unsigned char spi0_master(unsigned char data) { ssel_0; S0SPDR = data; while((S0SPSR&0x80)==0); ssel_1; return S0SPDR; } unsigned char spi0_slave(unsigned char data) { S0SPDR=data; while((S0SPSR&0x80)==0); return S0SPDR; } |
مثال عملی شماره 21 : دو میکرو LPC2138 را توسط پورت SPI به یکدیگر متصل نمایید. برنامه ای بنویسید که هر یک از میکروکنترلرها به دیگری کاراکتر دلخواهی ارسال کند. میکروکنترلر دیگر کاراکتر را بررسی کرده و در صورتی که کاراکتر صحیح دریافت شده باشد یک LED را روشن کند.
لینک دانلود سورس مثال عملی شماره 21
راه اندازی واحد I2C
یکی از پروتکل های ارتباطی سریال پرکاربرد I2C یا پروتکل دو سیمه می باشد. در این پروتکل از دو سیم SCL ( مخفف Serial Clock ) و SDA ( مخفف Serial Data ) استفاده می شود. این دو سیم باید با یک مقاومت 2.2K پول آپ شود. حداکثر سرعت در این پروتکل400Khz است. در این پروتکل یک وسیله Master و حداکثر127 وسیله Slave وجود دارد که همگی SDA ها و SCL های آنها به هم متصل است. شکل زیر نحوه ارتباط توسط این پروتکل را نشان می دهد.
راه اندازی واحد I2C در LPC2138
میکروکنترلر LPC2138 دارای دو واحد I2C0 و I2C1 سخت افزاری مجزا می باشد که هر یک میتواند Master یا Slave باشد. پایه های SDA و SCL مربوط به واحد I2C را در جدول زیر مشاهده می کنید.
SDA | SCL | |
P0.3 | P0.2 | I2C0 |
P0.14 | P0.11 | I2C1 |
توضیحات پروتکل I2C
قالب دیتا در پروتکل I2C دارای 4 وضعیت مختلف است :
وضعیت Start ، وضعیت آدرس ، وضعیت دیتا و وضعیت Stop .
در وضعیت عادی باس High می باشد تا زمانی که شروع به ارسال/دریافت شود و SDA و SCL برابر 0 شوند ( وضعیت Start ) سپس 7 بیت برای تعیین آدرس به همراه یک بیت تعیین وضعیت خواندن یا نوشتن ( R/W ) روی باس قرار می گیرد ( وضعیت آدرس ). سپس دیتای 8 بیتی مورد نظر روی باس قرار می گیرد ( وضعیت دیتا ) و در نهایت باس به حالت اولیه خود باز می گردد ( وضعیت Stop ). در وضعیت های آدرس و دیتا یک بیت به نام ACK ( مخفف Acknowledge ) از طرف گیرنده به فرستنده ارسال می شود که نشان دهنده وجود گیرنده و نیز صحیح در یافت شدن دیتا می باشد.
با توجه به حالت های عملکرد Master/Slave و اینکه هر یک میتواند دیتا ارسال/دریافت نماید چهار حالت زیر بوجود می آید :
- حالت Master Transmitter : زمانی که Master به Slave دیتا ارسال می کند.
- حالت Master Receiver : زمانی که Master از Slave دیتا دریافت می کند.
- حالت Slave Transmitter : زمانی که Slave به Master دیتا ارسال می کند.
- حالت Slave Receiver : زمانی که Slave از Master دیتا دریافت می کند.
رجیسترهای واحد I2C
رجیستر I2CxCONSET ( مخفف I2C Control Set Register )
این رجیستر تنظیمات کلی واحد I2C را به صورت زیر مشخص می کند:
بیت 2 ( AA ) : در صورت 1 کردن این بیت یک وضعیت Acknowledge ایجاد می شود.
بیت 3 ( SI ) : بیت وقفه می باشد که در صورت هر گونه تغییر در وضعیت باس I2C این بیت 1 می شود.
بیت 4 ( STO ) : در صورت 1 کردن این بیت یک وضعیت Stop در حالت Master روی باس I2C ایجاد می شود.
بیت 5 ( STA ) : در صورت 1 کردن این بیت یک وضعیت Start در حالت Master روی باس I2C ایجاد می شود.
بیت 6 ( I2EN ) : در صورت 1 کردن این بیت واحد I2C فعال می شود.
نکته : برای غیر فعال کردن بیت های رجیستر CONSET باید از رجیستر CONCLR استفاده کرد. صفر کردن بیت ها تاثیری ندارند.
رجیستر I2CxCONCLR ( مخفف I2C Control Clear Register )
بیت 2 ( AAC ) : در صورت 1 کردن این بیت ، AA در رجیستر I2CxCONSET پاک می شود. در نتیجه وضعیت ACK پاک می شود.
بیت 3 ( SIC ) : در صورت 1 کردن این بیت ، SI در رجیستر I2CxCONSET پاک می شود. در نتیجه وقفه غیر فعال می گردد.
بیت 5 ( STAC ) : در صورت 1 کردن این بیت ، STA در رجیستر I2CxCONSET پاک می شود. در نتیجه وضعیت Start پاک می شود.
بیت 6 ( I2ENC ) : در صورت 1 کردن این بیت ، I2CEN در رجیستر I2CxCONSET پاک می شود. در نتیجه واحد I2C غیر فعال می شود.
رجیستر I2CxSTAT ( مخفف I2C Status Register )
بیت های 3 تا 7 از این رجیستر وضعیت باس I2C را مشخص می کند به طوری که برای هر یک از حالت های چهارگانه عملکرد سیستم یک جدول وجود دارد. این جدول ها را به طور کامل در صفحه 174 تا 177 از UM10120 مشاهده می کنید. برای مثال در حالت Master Transmitter وضعیت های زیر را داریم :
0X08 : یک وضعیت Start ارسال شده است.
0X10 : یک وضعیت Start تکرار شده است.
0X18 : آدرس Slave و بیت R/W ارسال شده است و ACK دریافت شده است.
0X20 : آدرس Slave و بیت R/W ارسال شده است اما ACK دریافت نشده است.
0X28 : دیتای روی I2CxDAT ارسال شده است و ACK دریافت شده است.
0X30 : دیتای روی I2CxDAT ارسال شده است اما ACK دریافت نشده است.
0X38 : آدرس Slave ، بیت R/W یا دیتای روی I2CxDAT از بین رفته است.
رجیستر I2CxADR ( مخفف I2C Slave Address Register )
در صورت 1 کردن بیت 0 این رجیستر General Call ( اعلان عمومی ) در حالت Slave فعال می گردد. در بیت های 1 تا 7 از این رجیستر آدرس Slave مورد نظر که عددی بین 0 تا 127 است ، قرار می گیرد.
رجیستر I2CxDAT ( مخفف I2C Data Register )
دیتای 8 بیتی جهت ارسال درون این رجیستر قرار می گیرد.
رجیستر های I2CxSCLL و I2CxSCLH ( مخفف I2C SCL High و I2C SCL Low )
این رجیسترها فرکانس SCL در حالت Master را به صورت زیر مشخص می کند به طوری که عدد مورد نظر برای فرکانس SCL حداکثر 400Khz می باشد.
مراحل راه اندازی واحد I2C
- تنظیم رجیسترهای کنترلی I2CxCONSET و I2CxCONCLR ( در Master و Slave )
- تنظیم سرعت SCL در رجیسترهای I2CxSCLL و I2CxSCLH ( فقط در Master )
- تنظیم پورت پایه های SCL و SDA در رجیستر PINSEL ( در Master و Slave )
- تشخیص حالت عملکرد مورد نیاز و قرار دادن Switch روی رجیستر I2CxSTAT ( در Master و Slave )
- استفاده از رجیسترهای I2CxADR و I2CxDAT برای آدرس و دیتا ( در Master و Slave )
توابع راه اندازی I2C در حالت Master
1 2 3 4 5 6 7 8 9 |
void i2c0_master_init (void ) { PINSEL0|=(1<<4)|(1<<6); I2C0SCLL=50; I2C0SCLH=50; I2C0CONCLR=0xFF; I2C0CONSET=0x40; I2C0CONSET=0x20; } |
1 2 3 4 5 6 7 8 9 |
void i2c1_master_init (void ) { PINSEL0|=(3<<22)|(3<<28); I2C1SCLL=50; I2C1SCLH=50; I2C1CONCLR=0xFF; I2C1CONSET=0x40; I2C1CONSET=0x20; } |
راه اندازی I2C در حالت Slave
1 2 3 4 5 6 |
void i2c0_slave_init( void ){ PINSEL0|=(1<<4)|(1<<6); I2C0CONCLR=0xFF; I2C0CONSET=0x44; I2C0ADR=0x02; } |
1 2 3 4 5 6 |
void i2c1_slave_init( void ){ PINSEL0|=(3<<22)|(3<<28); I2C0CONCLR=0xFF; I2C0CONSET=0x44; I2C0ADR=0x02; } |
نمونه تابع Switch برای حالت Master Transmitt
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
switch(I2C0STAT) { case 0x08://start condition I2C0CONCLR=0x02; I2C0DAT=0x02; I2C0CONCLR=0x08; break; case 0x18://ack ok I2C0DAT='H';//sample data I2C0CONCLR=0x08; break; case 0x20://not ack I2C0DAT=0x20; I2C0CONCLR=0x08; break; case 0x28://data ack ok I2C0CONSET=0x10; I2C0CONCLR=0x08; I2C0CONCLR=0x10; } |
مثال عملی شماره 22 : دو میکرو LPC2138 را توسط پورت I2C به یکدیگر متصل نمایید. برنامه ای بنویسید که هر یک از میکروکنترلرها به دیگری کاراکتر دلخواهی ارسال کند. میکروکنترلر دیگر کاراکتر را بررسی کرده و در صورتی که کاراکتر صحیح دریافت شده باشد یک LED را روشن کند.
لینک دانلود سورس مثال عملی شماره 22
راه اندازی I2C نرم افزاری در LPC2138
همانطور که مشاهده می کنید راه اندازی I2C سخت افزاری به علت رجیسترهای زیاد و وضعیت های مختلف پیچیدگی خاص خود را دارد. از آن جایی که معمولا از میکروکنترلر در حالت Master استفاده می شود ، میتوان از I2C نرم افزاری به جای I2C سخت افزاری استفاده نمود. در I2C نرم افزاری میتوان هر دو پایه دلخواه را به عنوان SDA و SCL انتخاب کرد. با اضافه کردن هدر فایل i2c.h به برنامه میتوان با Slave توسط پروتکل I2C ارتباط برقرار کرد. با اضافه کردن این هدر فایل از توابع زیر در برنامه استفاده می شود :
1 2 3 4 5 6 7 |
1. void i2c_start(void) 2. void i2c_stop(void) 3. unsigned char i2c_write(unsigned char data) 4. unsigned char i2c_read(unsigned char ack) |
مثال عملی شماره 23 : با استفاده از میکروکنترلر LPC2138 و AT24C512 که یک آی سی EEPROM توسط پروتکل I2c می باشد ، برنامه ای بنویسید که یک عبارت رشته ای را ابتدا درون EEPROM ریخته و سپس خوانده و روی LCD نشان دهد.
لینک دانلود سورس مثال عملی شماره 23
پایان دوره آموزشی ARM7
برای ادامه آموزش ARM روی تصویر زیر کلیک کنید.
در صورتی که این مطلب مورد پسندتان بود لایک و اشتراک گذاری فراموش نشود
دیدگاه (15)
مثل همیشه بسیار عالی بود ممنون
سپاس دوست و همراه عزیز
با سلام.ممنون از آموزشش بسیار عالی و خوبتون.آیا آموزش arm تموم شد یا منتظر بخش های بعدی هم باشیم؟
سلام سپاسگزارم خیر ادامه خواهد داشت و همچنین منتظر بسته کامل آموزش ARM باشید
ممنون بی صبرانه منتظریم.اگه ممکنه تاریخ تقریبی ادامه آموزش را اعلام کنید.
سلام!
خیلی ممنون!
مثه همیشه کامل بود!
سلام دوست عزیز ممنون از همراهیتون
کارت درسته…
ادامه بده همین طور …
سلام خسته نباشید
میشه مقادیر ذکر شده توی دیتا شیت lpc2138 رو هم توضیحاتشو قرار بدین که هر کدوم مربوط به چی می شن ؟
خیلی متشکر از سایت خوبتون
سلام دوست عزیز ممنون از لطفتون
امکان آوردن دیتاشیت در آموزش متنی نبود و هر چیزی که درون دیتاشیت مورد نیاز بود در اینجا هم آورده شده است
سلام خسته نباشید.
سایت خیلی عالیه.
من یه مشکل اساسی با وقفه uart دارم و اونم اینه که میره تو روتین وقفه میمونه و روتین وقفه تشکیل یک حلقه میده و از روتین خارج نمیشه.
علت چیست؟
سلام دوست عزیز ممنونم
آخر روتین وقفه UART باید پرچم وقفه رو از بین ببرید و به حالت اول برگردونید وگرنه همواره روتین وقفه اجرا میشه
سلام و خسته نباشید.
زمانی که وقفه RTC وUART و یا دیگر وقفه ها رو تک تک فعال میکنم برنامه به درستی کار می کند اما زمانی باهم فعال می شوند برنامه هنگ می کند.(برنامه نویسی در keil). در واقع در روتین یکی از وقفه ها تشکیل حلقه می دهد. و برنامه هنگ می کند.
لطفا راهنمایی کنید که چرا این مشکل پیش می آید.
با تشکر
با سلام
پرچم وقفه uart1 در کدام رجیستر موجود است.
من هرچه pdf 2138 میخونم پیدا نمی کنم.
لطفا راهنمایی کنید.
سلام خسته نباشید
من اگه بخوام یه دیتایی رو از یه میکرو با یه nrf24 به nrf24 عه یه میکرو دیگه بفرستم چیکار باید بکنمم…ممنون میشم اکه کمکم کنید گیر کردم
میکرو ها stm32 هستند