Important changes to forums and questions
All forums and questions are now archived. To start a new conversation or read the latest updates go to forums.mbed.com.
6 years, 12 months ago.
i2c communication failure
My master keeps asking for reading data, but the slave takes some time to fill his buf and respond, after that I can not get the ack.
#include "stm32f103c8t6.h" #include "mbed.h" #define address ((uint8_t) 0xA0) DigitalOut myled(PA_1); InterruptIn chave(PA_0); Serial S(PA_9, PA_10); void bat(void); void status(void); void start(void); void date(void); //PROGRAMA PRINCIPAL int main(){ Serial S(PA_9, PA_10); I2C mestre(PB_7, PB_6); confSysClock(); while(1){ bat(); status(); } } //ESTADO DA BATERIA LED=1=LIGADO/LED=0=DESLIGADO void bat(void){ int estado; estado = 0; if(chave==1&&estado==0){ myled= !myled; wait(0.25); estado= 1; } if(chave==0&&estado==1){ estado=0; } } //STATUS DO LED void status(void){ Serial S(PA_9, PA_10); if(myled==0){ S.printf("\r\n"); S.printf("SEM BATERIA\r\n"); S.printf("\r\n"); bat(); } if(myled==1){ S.printf("\r\n"); S.printf("LIGADO"); S.printf("\r\n"); start(); } } // start sistema void start(void){ Serial S(PA_9, PA_10); I2C mestre(PB_7, PB_6); char startcommand[]= "slaveready"; char tempostart[]= "100917103020"; char respo1[11],respo2[13],respo3[10],respo4[113]; char pacote[7]="020030"; int x; memset(respo1,'\0',11); memset(respo4,'\0',113); x = 0; // Começo master envia readslave para o escravo if(x==0){ int resposta = mestre.write(address,startcommand,11); S.printf("\r\n"); S.printf("M.ENVIOU<%s>\r\n ",startcommand); x = 1; } // Só acontecera se o master ja estiver enviado o read para o escravo // o master lê o a msg enviada pelo escravo if(x==1){ mestre.read(address,respo1,11); S.printf("\rM.RECEBEU<%s> \r\n ",respo1); x = 2; } //Só acontece se o master ja recebeu mastersalve que enviou // master escrefvetimerstamp para o escravo if(x==2){ int resposta1 = mestre.write(address,tempostart,13); S.printf("\r2M.ENVIOU<%s>\r\n",tempostart); x = 3; } // Só acontece se o master ja escreveu timerstamp // master lê o timerstamp que enviou if(x==3){ mestre.read(address,respo2,13); S.printf("\r2M.RECEBEU<%s> \r\n ",respo2); x = 4; } //Só acontece se o mater ja leu o timerstamp // master ira ler o dados com timerstamp if(x==4){ wait(5); mestre.read(address,respo3,10); S.printf("\r3M.RECEBEU<%s> \r\n ",respo3); x = 5; } if(x==5){ mestre.write(address,pacote,7); S.printf("\r3M.ENVIOU<%s>\r\n",pacote); x = 6; } if(x==6){ int jk = mestre.read(address,respo4,113); S.printf("\r4M.RECEBEU<%s> \r\n ",respo4); while(jk!=0){ int jk = mestre.read(address,respo4,113); S.printf("\r4M.RECEBEU<%s> \r\n ",respo4); } } }
Slave
#include "stm32f103c8t6.h" #include "mbed.h" int main() { char buf[11],buf1[13],buf3[7],caf[3],caf1[3],caf2[100],caf3[23]; // Buffer o qual ira quardar a mensagem do mestre char buf2[]="BUFCMP"; char resul[]= "FFFFFFFFFFFFFFFFFFFFBBBBBBBBVVFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"; confSysClock(); // Configure system clock (72MHz HSE clock, 48MHz USB clock) Serial S(PA_9, PA_10); // Definindo portas serial (TX e RX) I2CSlave slave(PB_7, PB_6); // Definindo portas do I2C(SDA e SCL ) slave.address(0xA0); //atribuindo um valor no escravo int aju,j,k; aju = 0; while (1){ int i = slave.receive(); // Analisando se o mestre mandou alguma informacao switch (i) { case I2CSlave::WriteAddressed: // O escravo percebeu seu address especifico if(aju==0){ //memset(buf1,'\0',113); slave.read(buf,11); S.printf("S.RECEBEU<%s>\r\n",buf); aju = 1; } if(aju==2){ slave.read(buf1,13); S.printf("2S.RECEBEU<%s>\r\n",buf1); aju = 3; } if(aju==5){ memset(caf3,'\0',23); slave.read(buf3,7); S.printf("3S.RECEBEU<%s>\r\n",buf3); strncpy(caf,buf3,3); int pca = atoi(caf); /* num recebe 20 */ strncpy(caf1, buf3+3 ,3); int pca1 = atoi(caf1); /* num recebe 30 */ j= pca1-pca; k=13+j; //12 char no timerstamp strncpy(caf2, resul+pca ,j); strcat(caf3,buf1); strcat(caf3,caf2); aju = 6; } break; case I2CSlave::ReadAddressed: if(aju==1){ int j = slave.write(buf,11); S.printf("S.ENVIOU<%s>\r\n",buf); aju = 2; } if(aju==3){ int k = slave.write(buf1,13); S.printf("2S.ENVIOU<%s>\r\n",buf1); aju = 4; } if(aju==4){ wait(5); int l = slave.write(buf2,10); S.printf("3S.ENVIOU<%s>\r\n",buf2); aju = 5; } if(aju==6){ int jk = slave.write(caf3,k); S.printf("< %s >\r\n",caf3); while(jk != 0){ int jk = slave.write(caf3,k); S.printf("< %s >\r\n",caf3); } aju = 0; } break; } } }
Please edit this and use
So that the code is readable.
posted by Andy A 30 Nov 2017Thank you for your help
posted by Alan Silva 30 Nov 2017