سلام : از اونجایی که سری های محدودی از ARM های ساخت STM ایپیرام داخلی دارن و اکثر این میکروکنترلر ها ایپیرام داخلی ندارن تصمیم گرفتم که کتابخونه ای برای کار با ایسی های ایپیرام رو بزارم ایسی های سری AT24CXX توسط این کتابخونه پشتیبانی میشن؛ این سری ایپیرام ها هم قیمت ارزونی دارن و رابطشون I2C هستش؛ یک پین هم دارن که تعیین میکنه تا اطلاعای روی ایسی قفل بشه یا نه (در صورت قفل کردن دیتاهای ایسی امکان نوشتن روی ایسی وجود نداره و و فقط میشه دیتا ها رو از رو ایسی خوند )؛ ( کتابخانه راه اندازی eeprom خارجی با stm32 )

کتابخانه راه اندازی eeprom خارجی با stm32

کتابخانه راه اندازی eeprom خارجی با stm32

چندتا نکته راجب این ایسی :

۱) عدد بعد از C در شماره ایسی نشان دهنده ضرفیت حافظه ایسی هست مثلا

AT24C02 دارای دو کیلوبایت ایپیرام

AT24C32 دارای ۳۲ کیلو بایت ایپیرام هستش

۲) از اونجایی که رابط این ایسی I2C هستش باید برای دوتا پین SDA (دیتای I2C ) و SCL (کلاک I2C) مقاومت پول اپ بزارید و از اونجایی که سطح ولتاژ ما در کار با این ایسی ۳٫۳ ولت هستش مقدار این مقاومت ها باید ۱ کیلواهم باشد.

۳) لزومی به اتصال پین WP ایسی به میکروکنترلر ضرورری نیستش ( در صورت متصل نشدن به میکرو باید در سخت افزار به عنوان زمین تعریف شود ) (توضیحات صفحه ۳ دیتاشیت )

Write Protect (WP): The Write Protect input, when connected to GND, allows normal write operations. When WP is connected directly to VCC, all Write operations to the memory are inhibited. If the pin is left floating, the WP pin will be internally pulled down to GND; however, due to capacitive coupling that may appear during customer applications, Atmel recommends always connecting the WP pins to a known state. When using a pull-up resistor, Atmel recommends using 10kΩ or less

خب میریم سراغ فایل ها کتابخونه :

پس برای استفاده از کتابخانه دو فایل i2c.c و i2c.h رو به محل پروژه مون کپی میکنیم و به پروژه اضافه میکنیم.

خب حالا وارد فایل i2c.h میشیم توابع زیر رو داریم

بترتیب توابع رو توضیح میدیم

از این تابع برای ایشنال کردن ایسی و میکرو استفاده میشه …

برای نوشتن بایت در ادرس خاصی از حافظه استفاده میشه … ارگومان اول مقدار و ارگومان دوم ادرس هستش

برای خوندن مقدار بایت ایپیرام استفاده میشه ورودی یک ارگومان داره که ادرس هست و خروجی هم مقدار خونده شده از اون بایت

این تابع هم برای نوشتن متغیر های ۱۶ بیتی روی ایپیرام استفاده میشه این تابع از دو بایت متوالی برای نوشتن متغیر ۱۶ بیتی استفاده میکنه؛ ارگومان اول مقدار متغیر هست و ارگومان دوم ادرس نوشتن

نکته : برای مثال اگر در ادرس ۰ یک متغیر ۱۶ بیتی رو توی ایپیرام بریزیم این تابع از ادرس ۰+۱ هم برای نوشتن ۸ بیت دوم متغیر ۱۶ بیتی استفاده میکنه و در عمل دوبایت از ایپیرام رو اشغال میکنه.

از این تابع هم برای خوندن مقدار متغیر ۱۶ بیتی از ایپیرام استفاده میشه ارگومان اول برای ادرس هست و تابع مقدار ۱۶ بیتی خونده شده از ادرس رو توی خروجی برمیگردونه؛ خب بریم سراغ i2c.c توی این فایل هم دوتا دیفاین مهم داریم

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

حالا کتابخونه ما رو پیشفرض ایپیرام رو به i2c1 متصل هست ( نیازی به تغیر نیست )؛ ولیکن برای اتصال به i2c دوم یک مثال میارم ….

باید توی این تابع دستکاری کنیم اولین ادیت اینه که

این خط اومده کلاک رو برای i2c1 وصل کرده ولی ما باید کلاک رو به i2c2 وصل کنیم؛ پس اینجوری ادیت میکنیم

دومین ادیت ابنه که پینای i2c2 رو دیفاین کنیم

این خط رو اینجوری تغیر میدیم؛ اینجا توی استراکچر i2c هم نیازی به تغیر نیست ولی میتونید سرعت ارتباط رو تعیین کنید

الان سرعت i2c روی ۱۰۰ کیلوهرتز تنظیم هست (۱۰۰۰۰۰هرتز)

حالا کل تابع کانفیگ ما برای i2c2 میشه اینجوری

حالا فقط باید این تابع رو توی main اجرا کنیم تا میکرو و ایپیرام ایشنال بشن تا بتونیم توی بقیه برنامه با توابعی که بالا توضیح دادم کار کنیم و دیتا بنویسم و بخونیم؛ این خط هم توی تابع main مینویسیم

به همین سادگی smile برام دعا کنید … با ارزوی موفقت  heart