سلام برای ساعت کتابخانه SPI رو آماده کردم.
رابط SPI یکی از رابط های سریال پر کاربرد هست که به صورت سنکرون داده ها رو منتقل میکنه و از سرعت بالایی برخورداره ، توی میکروهای آرم حداکثر سرعت این قسمت با سرعت CPU یکی هست یعنی تا 55 مگ میتونه سارعت داشته باشه و حداقل سرعت هم حاصل تقسیم کلاک سیستم بر 255 هست.
این رابط کاربرد های زیادی داره، از جمله راه اندازی حافظه های MMC و بعضی از انواع حافظه های فلش، برخی ماژول های مخابراتی ، و بعضی از رابط های شبکه و....
و اما این کتابخانه :
قبل از هرچیز لازم به ذکر است این کتابخانه صرفا برای سری SAM7 نوشته شده.
این کتابخانه فول سورس هست و از تمام امکانات پشتیبانی می کنید.
این کتابخانه به صورت خودکار رجیستر های کنترلی را برای تنظیم کلاک مقدار دهی می کند.
این کتابخانه رجیستر کنترلی PMC که کنترل توان را در اختیار دارد را مقدار دهی می کند.
این کتابخانه از هر دو رابط SPI پشتیبانی میکند.
این کتابخانه با استفاده از PDC بافرهای داده ای را دریافت و یا ارسال می کنه (بدون دخالت CPU و به صورت سخت افزاری)
تا یادم نرفته نکته خیلی مهم اینکه برای دریافت داده حتما باید یک بار داده بفرستید تا دادهای برای در یافت داشته باشید. سادش اینه که قبل از استفاده از تابع SPI_Read حتما تابع SPI_Write رو فراخوانی کنید.
شروع کار با کتابخانه:
- پایه های PIO را برای استفاده از SPI با استفاده از ماکروی SPI_Configure_PIO_MAKS و یا SPI_Configure_PIO_BIT مقدار دهی کنید.
- تنظمات کلی واحد SPI از جمله مستر یا اسلیو بودن ، شبکه بودن و.... با استفاده از تابع SPI_Configure انجام دهید.
- کانال های مورد استفاده را مقدار با استفاده از تابع SPI_ConfigureNPCS مقدار دهی کنید. (هر SPI خود داری 4 کانل مجزا هست که میتوانند مستقل از هم کار کنند.)
- رابط SPI را با استفاده از تابع SPI_Enable فعال کنید.
- و هم اکنون رابط SPI آماده ارسال و دریافت داده هست.
ماکروهای مورد استفاده کتابخانه:
کد:
#define SPI_SCBR(baudrate, masterClock)
ورودی های این ماکرو کلاک مورد نظر برای واحد SPI و کلاک کلی سیستم است.
این ماکرو در تابع SPI_ConfigureNPCS باعث تنظیم نرخ کلاک واحد SPI میشود.
کد:
#define SPI_DLYBS(delay, masterClock)
ورودی این تاخیر بر حسب نانوثانیه و کلاک سیستم هست.
این ماکرو در تابع SPI_ConfigureNPCS باعث تنظیم تاخیر ارسال داده بعد تغییر Chip Select می شود.
کد:
#define SPI_DLYBCT(delay, masterClock)
ورودی این تاخیر بر حسب نانوثانیه و کلاک سیستم هست.
این ماکرو در تابع SPI_ConfigureNPCS باعث تنظیم تاخیر در میان دو انتقال متوالی از اطلاعات در یکی از مسیر های Chip Select می شود.
دیگر ماکرو های مورد استفاده در تابع SPI_ConfigureNPCS
کد:
// SPI MODE
#define SPI_MODE_0 2 // L ACRIVE CLOCK & POS EDGE
#define SPI_MODE_1 0 // L ACTIVE ClOCK & NEG EDGE
#define SPI_MODE_2 3 // H ACTIVE CLOCK & NEG EDGE
#define SPI_MODE_3 1 // H ACTIVE CLOCK & POS EDGE
// DATA LEN IN SPI
#define SPI_8_BIT
#define SPI_9_BIT
#define SPI_10_BIT
#define SPI_11_BIT
#define SPI_12_BIT
#define SPI_13_BIT
#define SPI_14_BIT
#define SPI_15_BIT
#define SPI_16_BIT
چهار ماکروی اول مود کاری کانال را مشخص میکنند و باقی ماکرو ها تعداد بیت کانال را مشخص می کنند.
ماکرو های مورد استفاده در تابع SPI_Configure :
کد:
#define SPI_SLAVE (0<<0) // Set SLAVE MODE
#define SPI_MASTER (1<<0) // Set MASTER SPI
#define SPI_MULTI_DEVICE (1<<1) // SET MULTI DEVICE SUPORT
#define SPI_ONE_DEVIDE (0<<1) // SET ONE Device Suort
#define SPI_EN_DECODER (1<<2) // Chip Select Decode
#define SPI_MOD_FDIS (1<<4) // Disable Mode Fault Detection
#define SPI_LLB (1<<7) // ENABLE INTRNAL FEEDBACK
دو ماکروی اول مد مستر و اسلیو رو مشخص میکنند، ماکروی سوم و چهارم مشخص میکننده که چند دوایس به درگاه وصل شده یا فقط یک دوایس به درگاه وصل شده است. ماکروی پنجم حالت دکدر رو روی خطوط CS فعال میکند و با استفاده از این قابلیت میتوان خطوط CS را به یک مالتیپلکسر نصب کنیم که انگاه رابط میتواند 16 دوایس متفاوت رو ساپورت کنه، ماکروی ششم حالت تشخصی خطا رو غیر فعال میکنه، در حالت تشخیص خطا هرگاه یکی از خطوط CS به مثبت وصل بشه یا یک بشه به منزله اینه که دستگاه اسلیو نتونسته داده رو بگیره و بیت خطا تو رجیستر کنترلی یک میشه و رابط غیر فعال میشه و ماکروی آخر حالت فید بک داخلی رو فعال میکنه یعنی از داخل خطوط MISO , MOSI به هم وصل میشه برای خطا یابی خوبه.
خوب ماکرو ها تمام شد بریم سر توابع:
کد:
extern void SPI_Enable(AT91S_SPI *spi);
ورودی این تابع رابط SPI هست که متونه مقادیر AT91C_BASE_SPI0 و یا AT91C_BASE_SPI1 باشه و رابط رو فعال میکنه.
کد:
extern void SPI_Disable(AT91S_SPI *spi);
ورودی این تابع رابط SPI هست که متونه مقادیر AT91C_BASE_SPI0 و یا AT91C_BASE_SPI1 باشه و رابط رو غیر فعال میکنه.
کد:
extern void SPI_ConfigureNPCS(AT91S_SPI *spi,
unsigned int npcs,
unsigned int configuration);
تنظمیات کانال مورد نظر رو انجام میده، ورودی اول رابط SPI هست و ورودی دوم شماره کانال عددی بین 0 تا 3 و ورودی آخر مجموعه ای از کلید های پیکر بندی به مثال زیر توجه کنید:
کد:
SPI_ConfigureNPCS(AT91C_BASE_SPI0,
0, // Config Chanal 0
SPI_MODE_0| // L ACRIVE CLOCK & POS EDGE
SPI_8_BIT| // 8 Bit Data strim
SPI_SCBR(1000000,BORD_CLK)| // Clock Of SPI SET To 1 MHZ
SPI_DLYBCT(1000,BORD_CLK)); // Delay In Send Strim 1us
کد:
extern void SPI_Configure(AT91S_SPI *spi,
unsigned int id,
unsigned int configuration);
این تابع تنظیمات کلی رابط رو انجام میده ورودی اول خود رابط هست و ورودی دوم شماره ایدی رابط در رجیستر PMC و ورودی سوم مجموعه ای از کلید های پیکربندی هست. به مثال زیر توجه کنید:
کد:
SPI_Configure(AT91C_BASE_SPI0, // SPI0 TO USE
AT91C_ID_SPI0, // SPI0 PMC ID TO Active Power
SPI_MASTER| // SPI SET TO MASTER MODE
SPI_ONE_DEVIDE| // SPI Connct TO 1Device {NO MOLTI DEVICE}
SPI_MOD_FDIS); // Disable Mode Fault Detection
کد:
extern void SPI_Write(AT91S_SPI *spi, unsigned int npcs, unsigned short data);
این تابع مقداری رو روی رابط ارسال میکنه ورودی اول خود رابط SPI مورد استفاده هست و ورودی دوم کانال مورد استفاده و در آخر مقداری که باید ارسال شود.
کد:
extern unsigned char SPI_WriteBuffer(AT91S_SPI *spi,
void *buffer,
unsigned int length);
یک بافر را با استفاده از رابط SPI و PDC بودن دخالت CPU ارسال می کند.(اگر از نحوی کارکرد PDC اطلاعی ندارید فعلا از این تابع استفاده نکنید.)
کد:
extern unsigned char SPI_IsFinished(AT91S_SPI *pSpi);
این تابع چک میکند که عملیات ارسال یا دریافت پایان پذیرفته باشد.
کد:
extern unsigned short SPI_Read(AT91S_SPI *spi);
این تابع مقدار را از رجیستر دریافت داده میخوادند.
کد:
extern unsigned char SPI_ReadBuffer(AT91S_SPI *spi,
void *buffer,
unsigned int length);
یک بافر را با استفاده از رابط SPI و PDC بودن دخالت CPU دریافت می کند.(اگر از نحوی کارکرد PDC اطلاعی ندارید فعلا از این تابع استفاده نکنید.)
در مثال نمونه یه سری داده به شبفت رجیستر 74595 ارسال میشه، عکس ار نحوی اتصال شبفت رجیستر قرار دادم !
یه فیلم هم از نحوه عملکردش گرفتم که میتونید از لینک زیر دانلود کنید:
SAM7 SPI & 74ls595.3gp - 4shared.com - file sharing - download movie file
دانلود کتابخانه به همراه مثال کاملا تست شده: