سلام دوستان . توابعی برای کار با i2c نوشتم در کد ویژن . این توابع در مد MT و SR به راحتی کار میکنن
اما بر عکسش یعنی MR ST کار نمیکنه
اسلیو ادرشو میشناسه اما وقتی چیزی ارسال میکنه برای مستر یا چیزی غیر اونی که من میخوام ارسال میکنه و ACK میگیره یا با کمی دست کاری اونی که من میخوام رو ارسال میکنه اما NACK میگیره (ار I2C debugger پروتئوس استفاده میکنم ) . چند روزیه در گیرشم حتی عین نوشته کتاب پرتویی فر هم دیگه کپی زدم تو کار اما جواب نداد
این توابع مد مستر:
MT که درست کار میکنه:
MR: که نمیدونم مسکل از اینه یا از slave
تو تابع بالایی بدون فرستادن 0xc4 جوابای پرتو پلا میگرفتم ولی ACk میداد مستر با اون عدد درست میگرفت اما nack میداد مستر و یه عدد دیگه برمیگردوند
ST: اینم نمیدونم اشتباهه یا نه تو مد SR جواب گرفته بودم (البته نه با همین برنامه) اما ترنسمیت ! :cry2:
طبق روش کتاب باید جواب میداد اما شاید کتاب مشکل داره یا من چیزی رو از نوشتهای کتاب از قلم انداختم .
اما بر عکسش یعنی MR ST کار نمیکنه
اسلیو ادرشو میشناسه اما وقتی چیزی ارسال میکنه برای مستر یا چیزی غیر اونی که من میخوام ارسال میکنه و ACK میگیره یا با کمی دست کاری اونی که من میخوام رو ارسال میکنه اما NACK میگیره (ار I2C debugger پروتئوس استفاده میکنم ) . چند روزیه در گیرشم حتی عین نوشته کتاب پرتویی فر هم دیگه کپی زدم تو کار اما جواب نداد
این توابع مد مستر:
MT که درست کار میکنه:
کد:
void twi_mt(char slaveadd,char data)
{
TWBR=0x00;
TWCR=0xA4; // in male mode MT ke dorost kar mikone
while(!(TWCR&0x80));
if((TWSR==0X08)||(TWSR==0X10))
{
TWDR=slaveadd;
TWCR=0x84;
while(!(TWCR&0x80));
}
if((TWSR&0xf8)==0X18)
{
TWDR=data;
TWCR=0xB4;
while(!(TWCR&0x80));
}
TWCR=0x94;
}
کد:
unsigned char twi_mr(char slaveadd)
{
unsigned char __data=0;
TWCR=0xA4; //ijad vaziyate start
while(!((TWCR&0x80)==0x80)); //entezar free shodane etsal i2c
if((TWSR==0X08)||(TWSR==0X10)) //start ack??
{
TWDR=(slaveadd|0x01); //ferestadan addres ba darkahste gereftane etelaat be slave
TWCR=0x84; //pak kardane INT
while(!(TWCR&0x80)); //Entezar baraye payane ersal va azad shodane i2c
}
if((TWSR==0x40)||(TWSR==0x50)) // slave addres ack??
{
TWCR=0xC4; //ferestadane ack(nemidonam chera bayad estefade she copy az ro ketb bod
while(!(TWCR&0x80)); // entezar
__data=TWDR; // khondane dade
TWCR=0xc4; // khali kardane TWDR
while(!((TWCR&0x80)==0x80)); //entezar
}
TWCR=0x94; //Stop
return __data; //return data gerfte shode
}
ST: اینم نمیدونم اشتباهه یا نه تو مد SR جواب گرفته بودم (البته نه با همین برنامه) اما ترنسمیت ! :cry2:
کد:
#include <mega32.h>
#include <delay.h>
interrupt[20] void ss (void)
{
if(TWSR==0xA8)
{
TWDR=0x10;
TWCR|=0x80;
}
}
void main(void)
{
SREG|=0x80;
DDRA=0xFF;
DDRB=0xFF;
TWBR=12;
DDRD=0xFF;
TWAR=0X10;
TWCR=0x45;
while(1)
{
}
}




دیدگاه