اطلاعیه

Collapse
No announcement yet.

مقداردهی رجیستر

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    مقداردهی رجیستر

    سلام

    اول به گله کنم!! چرا هر سوالی من اینجا(بخش ARM) میپرسم هیچکی جواب نمیده؟ برفرض که یه سوال از TWI پرسیدم و کسی تاحالا باهاش کار نکرده. وقعا ارزشش رو نداره چند دقیقه ای وقت بذارین... ؟؟! میدونم خیلی حرفه ها اینجا هستن. اما... همش درمورد انواع میکروها و بوردها بحث میشه...! یکم ما تازه کارام راهنمایی کنید دیگه!

    ایندفه یه سوال خیلی راحت میپرسم که چندوقته خیلی ذهنم مشغول کرده

    این کد، قسمتی از به مثال از application notes سایت atmel : (نترسین سوالم خیلی ساده)

    /*----------------------------------------------------------------------------
    Function : AT91F_TWI_WriteSingleIadr
    Arguments: <AT91PS_TWI pTwi> : Pointer to the TWI structure.
    <SlaveAddr>: Address of the slave device to read from.
    <data>: Pointer to the data to write
    <IntAddr>: Internal slave device address. Set to 0 if no.
    <IntAddrSize>: Size of the internal address.Set to 0 if no.
    Comments : Write a single data into a slave device with an internal
    address.
    Takes into account the NACK errata.

    Return Value: AT91C_TWI_NACK if so.
    -----------------------------------------------------------------------------*/
    int AT91F_TWI_WriteSingleIadr(const AT91PS_TWI pTwi,
    int SlaveAddr,
    int IntAddr,
    int IntAddrSize,
    char *data)
    {
    unsigned int end = 0, status, error=0;

    /* Enable Master Mode */
    pTwi->TWI_CR = AT91C_TWI_MSEN ;

    /* Set the TWI Master Mode Register */
    pTwi->TWI_MMR = SlaveAddr | IntAddrSize & ~AT91C_TWI_MREAD;

    /* Set TWI Internal Address Register if needed */
    pTwi->TWI_IADR = IntAddr;

    /* Write the data to send into THR. Start conditionn DADDR and R/W bit
    are sent automatically */
    pTwi->TWI_THR = *data;

    /* NACK errata handling */
    /* Do not poll the TWI_SR */
    /* Wait 3 x 9 TWCK pulse (max) 2 if IADRR not used, before reading TWI_SR */
    /* From 400Khz down to 1Khz, the time to wait will be in µs range.*/
    /* In this example the TWI period is 1/400KHz */
    AT91F_TWI_WaitMicroSecond (40) ;

    while (!end)
    {
    status = AT91C_BASE_TWI->TWI_SR;
    if ((status & AT91C_TWI_NACK) == AT91C_TWI_NACK)
    {
    error++;
    end=1;
    }
    /* Wait for the Transmit ready is set */
    if ((status & AT91C_TWI_TXRDY) == AT91C_TWI_TXRDY)
    end=1;
    }

    /* Wait for the Transmit complete is set */
    status = AT91C_BASE_TWI->TWI_SR;
    while (!(status & AT91C_TWI_TXCOMP))
    status = AT91C_BASE_TWI->TWI_SR;

    return error;
    }


    تابع برای انجام عمل write با TWI. سوالم ار مقداردهی رجیستر MMR هست.
    pTwi->TWI_MMR = SlaveAddr | IntAddrSize & ~AT91C_TWI_MREAD;

    طبق دیتاشیت، آدرس slave باید تو بیت های 16 تا 22 (DADR) رجیستر MMR قرار بگیره. یعنی این کد باید SlaveAddr رو 16 بیت به چپ شیفت میداد. درست نمیگم؟؟ من نمیفهمم این چیکار کرده!! لطفا توضیح بدین. تو توابع دیگه این فایل هم همین آش و همین کاسه !!

    راستی میکرو، خانواده AT91SAM7S و AT91SAM7X
    https://www.linkedin.com/in/mohammadhosseini69

    http://zakhar.blog.ir

    #2
    پاسخ : مقداردهی رجیستر

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

    دیدگاه


      #3
      پاسخ : مقداردهی رجیستر


      من فکر میکردم int دو بایت! ولی الان امتحان کردم 4 بایت بود. اگه اینطور باشه که امکانش هست...

      پس چرا نوشته :
      <SlaveAddr>: Address of the slave device to read from.
      https://www.linkedin.com/in/mohammadhosseini69

      http://zakhar.blog.ir

      دیدگاه

      لطفا صبر کنید...
      X