سلام دوستان . توابعی برای کار با 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) { } }
دیدگاه