سلام خدمت اساتید محترم
لطفا این تیکه کد رو اگه ممکنه توضیح بدید که میخواد چیکار کنه
در مورد ارتباط CAN تو میکرو کنترلر avr
[CODE]uint8_t mcp2515_get_message(tCAN *message)
{
سلام خدمت اساتید محترم
لطفا این تیکه کد رو اگه ممکنه توضیح بدید که میخواد چیکار کنه
در مورد ارتباط CAN تو میکرو کنترلر avr
[CODE]uint8_t mcp2515_get_message(tCAN *message)
{
ویرایش توسط bmvali : 08-06-2017 در ساعت 02:22
این کد قسمتی از توابع مربوط به ارتباط با mcp2515 می باشد که طی یک پروتکل خاص از طریق spi با ماژول ارتباط برقرار می کند و یک رشته را برایش ارسال میکند.
بله ممنون از پاسختون
بیشتر میخوام در مورد اعمال بیتی و او عملگرای بیتی و همچنین نحوه تغییرات روی بیتها رو بدونم
مثلا در عبارت
message->id = (uint16_t) spi_putc(0xff) << 3;
message->id چه متغیریه و نوعش چیه؟
یا تو ارسال مقدار به تابعspi_putc
0xff) << 3
چه اتفاقی میفته؟
<< این عملگر و این >> شیفت به چپ و راست و عملگر -> همان . است یعنی message.id =0
id یک المان از تابع message است مانند serial.print
یعنی در عبارت
message->id = (uint16_t) spi_putc(0xff) << 3;
message.id =صفر کن و برو از تابع spi_putc پرش کن
داخل پرانتز(0xff) برای چه کاریه؟
همچنین عبارت
(uint16_t) چیه؟
سلام
message->id
همونطور که دوستمون گفت id یک المانی از message هست
spi_putc(0xff)
تابع spi بالا داره دیتای 0xff رو بصورت سریال ارسال میکنه
uint16_t
منظور از عبارت بالا اینه که متغیرمون 16 بیتی هست به عبارتی قراره 16 بیت دیتا داخل id قرار بگیره پس id میتونه 16 بیت یا بیشتر دیتا قبول کنه
این قسمت کارش اینه ک میگه 0xff رو که با spi ارسال میکنی 3 تا به چپ شیفت بده بعد بریز داخل المان id
معادل باینری 16 بیتی 0xff میشه این : 0000000011111111
حالا 3 تا شیفت پیدا کنه میشه این : 0000011111111000
اگه بد توضیح دادم ببخشید بازم جای سوال بود بفرمائید اساتید هستن پاسخ میدن
*** اللّهم عجّل لولیک الفرج ***
از راهنمایی های صبورانه شما تشکر میکنم
تو توضیح (این قسمت کارش اینه ک میگه 0xff رو که با spi ارسال میکنی 3 تا به چپ شیفت بده بعد بریز داخل المان id
اول شیف میکنه و بعد ارسال میشه یا برعکس داده دریافتی رو شیفت میده و ذخیره میکنه؛من اینو نفهمیدم؟
تقدم و تاخر با کدومشونه؟
uint8_t length = spi_putc(0xff) & 0x0f;
الان یعنی در عبارت بالا هگز 0x0f رو میفرسته و بعد دریافت اطلاعات رو در uint8_t length ذخیره میکنه درسته
پس اون هگز خارج از پرانتز چیه؟
حالا تو خط قبلی برنامه 2 بار spi_putc(0xff); اینو میفرستیم اما چیزی دریافت نمیشه؟ داده دریافتی کجا میره پس؟
سلام
اولا اینجا اصلا تقدم و تاخر مهم نیست
spi همیشه داره 0xff رو ارسال میکنه پس اینجا 0x0f همیشه با 0xff اند میشه
احتمالا مشکل در ارسال و دریافت میباشدحالا تو خط قبلی برنامه 2 بار spi_putc(0xff); اینو میفرستیم اما چیزی دریافت نمیشه؟ داده دریافتی کجا میره پس؟
شما وقتی می خوای یک داده روی باس spi بخونی باید کلاک تولید کنید ( مستر وظیفه تولید کلاک رو داره) ( رجیستری رو که میخواید بخونید از قبل مشخص میکنید)
برای تولید کلاک رو باس همیشه از بایت 0xff استفاده میشه.
در رابطه با اولویت ؛ همیشه مقدار سمت راست مساوی ( نسبت به اولیت عملگر ) محاسبه میشه بعد مساوی مقدار سمت چپ قرار داده میشه.
پس اول شما از باس spi میخونی بعد مقدار خونده شده رو با مقدار 0x0f ؛ and باینری میکنید ( 4 بیت بالا رو صفر میکنید بدلیل بی ارزش بودنش) بعد مقدارش رو برابر با متغییر length قرار میدید.
در رابطه با سوال اخر هم همیشه شما داده رو دریافت میکنید و میکرو به طور اتوماتیک مقدار دریافتی رو داخل ریجستر داده Spi قرار میده اما اینکه شما ازش استفاده کنید یا نه به خودتون مربوطه.
بعضی وقت ها شما لازم دارید یه سری کلاک تولید کنید تا یک کاری انجام بشه.
مثلا فرض کنید داخل کد شما مقدار id 4 بایت هست و شما احتیاج دارید یه 2 بایت اولش ولی ای سی همیشه 4 بایت رو می فرسته پس شما باید به اندازه 4 بایت کلاک تولید کنید
اما فقط 2 بایت اول رو میخونید و بقیه رو دور میریزید.
بسیار ممنون از شما
ویرایش توسط bmvali : 08-06-2017 در ساعت 02:23