سلام
اول به گله کنم!! چرا هر سوالی من اینجا(بخش 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 هست.
طبق دیتاشیت، آدرس slave باید تو بیت های 16 تا 22 (DADR) رجیستر MMR قرار بگیره. یعنی این کد باید SlaveAddr رو 16 بیت به چپ شیفت میداد. درست نمیگم؟؟ من نمیفهمم این چیکار کرده!! لطفا توضیح بدین. تو توابع دیگه این فایل هم همین آش و همین کاسه !!
راستی میکرو، خانواده AT91SAM7S و AT91SAM7X
اول به گله کنم!! چرا هر سوالی من اینجا(بخش 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
دیدگاه