PsySc0rpi0n Posted May 29, 2023 at 10:16 PM Report Share #631135 Posted May 29, 2023 at 10:16 PM (edited) Boas. Estou a escrever um pequeno código para escrever e ler uma string (ou várias) numa eeprom, usando o protocolo I2C e livrarias do Arduino. O sistema é composto pelo seguinte: USB-TTL <-> ESP8266 <-> EEPROM O código completo pode ser consultado aqui. O que acontece é que a livraria Wire.h para o ESP8266 tem um buffer the 128 bytes e portanto, se a string tiver mais que 128 bytes, eu tenho que fazer a leitura por várias vezes. Ao fazer a leitura de 128 bytes em 128 bytes, o que me está a acontecer é que no 128º byte, eu recebo um NACK do I2C e embora na próxima leitura de 128 bytes eu esteja a ler este último byte que devolveu NACK e de a string estar completa, não consigo perceber porque é que neste byte 128 recebo sempre um NACK em vez de um ACK. A função que lê os bytes e os envia para a porta série é a seguinte: // Read bytes from eeprom device void readEEPROM(uint8_t intaddr, uint16_t datalen){ char singleChar; for(uint16_t i = 0; i < datalen; i++){ if(!(i % 128)){ Wire.beginTransmission(I2C_SLAVE_ADDR7); Wire.write(intaddr + i); Wire.endTransmission(); Wire.requestFrom(I2C_SLAVE_ADDR7, (int) (datalen - i)); } singleChar = Wire.read(); Serial.print(singleChar); } } Se alguém me conseguir identificar o bug, ou se me souber explicar porque é que isto acontece ou se é normal acontecer, eu agradeço. Edited; É isto que acontece: Edited May 29, 2023 at 10:27 PM by PsySc0rpi0n Kurt Cobain - Grunge misses you Nissan GT-R - beast killer Link to comment Share on other sites More sharing options...
sergio17 Posted June 2, 2023 at 03:27 PM Report Share #631175 Posted June 2, 2023 at 03:27 PM (edited) if(!(i % 128)) esta condição não executa a lógica se o i=128 ou se o i=0 que é onde estas a ter o problema. Não sei se ajuda Edited June 2, 2023 at 04:12 PM by sergio17 Link to comment Share on other sites More sharing options...
Solution PsySc0rpi0n Posted June 2, 2023 at 04:55 PM Author Solution Report Share #631179 Posted June 2, 2023 at 04:55 PM (edited) On 6/2/2023 at 4:27 PM, sergio17 said: if(!(i % 128)) esta condição não executa a lógica se o i=128 ou se o i=0 que é onde estas a ter o problema. Não sei se ajuda Aí só pretendo verificar quando é que o i é igual a 128, através do operador % (remainder), que devolve 0 caso o i seja igual a 128. Mas já cheguei à conclusão que afinal não há bug nenhum. Segundo as especificações do protocolo I²C, no fim de um ciclo de leitura, o último byte do ciclo devolve NACK. Quote If the controller wishes to read from the target, then it repeatedly receives a byte from the target, the controller sending an ACK bit after every byte except the last one. E a função alterou um pouco: void readBytes(uint8_t intaddr, uint16_t dataln){ char singleChar; uint16_t req = 128; if(dataln <= 128){ Wire.beginTransmission(I2C_SLAVE_ADDR7); Wire.write(intaddr); Wire.endTransmission(); Wire.requestFrom(I2C_SLAVE_ADDR7, (int) (dataln)); for(uint8_t i = 0; i < dataln; i++){ singleChar = Wire.read(); Serial.print(singleChar); } }else{ for(uint8_t i = 0; i <= (dataln + i - 1) / dataln; i++){ Wire.beginTransmission(I2C_SLAVE_ADDR7); Wire.write(intaddr + i * 128); Wire.endTransmission(); Wire.requestFrom(I2C_SLAVE_ADDR7, (int) (req)); for(uint8_t j = 0; j < req; j++){ singleChar = Wire.read(); Serial.print(singleChar); } req = dataln - 128; } } } Edited June 2, 2023 at 04:56 PM by PsySc0rpi0n Kurt Cobain - Grunge misses you Nissan GT-R - beast killer Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now