Proč posíláš za sebou dva starty a proč při tom čtení nic nečteš?
V popisu píšou, že komunikace probíhá jako u EEPROM 24xx. Takže je potřeba poslat start, adresu čipu+READ/WRITE, pak adresu registru a pak buď příkaz (když se zpisuje příkaz) nebo opakovaný start s READ a pak přečíst obsah registru. Zakončit to stopem. Po spuštění měření vzdálenosti trvá 70ms než je k dispozici změřená vzdálenost.
Příklad komunikace s EEPROM 24xx je i v tom Hčkovém souboru.
void main(void)
{
char x;
unsigned int range,angle;
long delay;
u08 line = 0;
setup();
init();
delay_1ms_u16(20);
init_lcd();
clear_disp();
put_string_xy(3,0,"I2C TESTER");
//put_string_xy(3,1,"ULTRASONIC");
_delay_ms(2000);
while(1){
for(delay=0; delay<30000L; delay++); // just a refresh rate delay
i2c_transmit(0xE0,0,0x51); // srf02 ping command, result in cm
_delay_ms(100);
range = i2c_read(0xE0,2) <<8; // read srf02 range, high byte
range += i2c_read(0xE0,3); // read srf02 range, low byte
sprintf(s,"SRF02 = %d cm",range); // fills char string s with srf02 line text and data
//clear_disp();
put_string_xy(0, 0, s);
cursor_disp_ctrl(0x04);
//_delay_ms(20);
}
}
TWCR = 0xA4; // send a start bit on i2c bus
while(!(TWCR & 0x80)); // wait for confirmation of transmit
TWDR = address; // load address of i2c device
TWCR = 0x84; // transmit
while(!(TWCR & 0x80)); // wait for confirmation of transmit
TWDR = reg; // send register number to read from
TWCR = 0x84; // transmit
while(!(TWCR & 0x80)); // wait for confirmation of transmit
TWCR = 0xA4; // send repeated start bit
while(!(TWCR & 0x80)); // wait for confirmation of transmit
TWDR = address+1; // transmit address of i2c device with readbit set
TWCR = 0xC4; // clear transmit interupt flag
while(!(TWCR & 0x80)); // wait for confirmation of transmit
TWCR = 0x84; // transmit, nack (last byte request)
while(!(TWCR & 0x80)); // wait for confirmation of transmit
read_data = TWDR; // and grab the target data
TWCR = 0x94; // send a stop bit on i2c bus
return read_data;
}
void i2c_transmit(char address, char reg, char data)
{
TWCR = 0xA4; // send a start bit on i2c bus
while(!(TWCR & 0x80)); // wait for confirmation of transmit
TWDR = address; // load address of i2c device
TWCR = 0x84; // transmit
while(!(TWCR & 0x80)); // wait for confirmation of transmit
TWDR = reg;
TWCR = 0x84; // transmit
while(!(TWCR & 0x80)); // wait for confirmation of transmit
TWDR = data;
TWCR = 0x84; // transmit
while(!(TWCR & 0x80)); // wait for confirmation of transmit
TWCR = 0x94; // stop bit
}
Nemůžete odesílat nové téma do tohoto fóra. Nemůžete odpovídat na témata v tomto fóru. Nemůžete upravovat své příspěvky v tomto fóru. Nemůžete mazat své příspěvky v tomto fóru. Nemůžete hlasovat v tomto fóru. Nemůžete připojovat soubory k příspěvkům Můžete stahovat a prohlížet přiložené soubory
Informace na portálu Elektro bastlírny jsou prezentovány za účelem vzdělání čtenářů a rozšíření zájmu o elektroniku. Autoři článků na serveru neberou žádnou zodpovědnost za škody vzniklé těmito zapojeními. Rovněž neberou žádnou odpovědnost za případnou újmu na zdraví vzniklou úrazem elektrickým proudem. Autoři a správci těchto stránek nepřejímají záruku za správnost zveřejněných materiálů. Předkládané informace a zapojení jsou zveřejněny bez ohledu na případné patenty třetích osob. Nároky na odškodnění na základě změn, chyb nebo vynechání jsou zásadně vyloučeny. Všechny registrované nebo jiné obchodní známky zde použité jsou majetkem jejich vlastníků. Uvedením nejsou zpochybněna z toho vyplývající vlastnická práva. Použití konstrukcí v rozporu se zákonem je přísně zakázáno. Vzhledem k tomu, že původ předkládaných materiálů nelze žádným způsobem dohledat, nelze je použít pro komerční účely! Tento nekomerční server nemá z uvedených zapojení či konstrukcí žádný zisk. Nezodpovídáme za pravost předkládaných materiálů třetími osobami a jejich původ. V případě, že zjistíte porušení autorského práva či jiné nesrovnalosti, kontaktujte administrátory na diskuzním fóru EB.