Tengo el siguiente esquema:
elconectordelarnésvaa
segúnlahojadedatosdelIC,ladirecciónes0x70ypuedefuncionarcon100kHzo400kHz.HeejecutadoestecódigoeneluC:
#defineF_CPU8000000UL#defineSCL_CLOCK400000//I'vetriedboth100khztoo#defineBAUD9600#defineMYUBRRF_CPU/8/BAUD-1#defineTWIMUX0x70#include<avr/io.h>#include<util/delay.h>#include<stdio.h>#include<util/twi.h>#include<avr/interrupt.h>voidinit_i2c(void){uint8_ttwst;charadd=0x70;shorti=0;TWSR=0;//noprescalerTWBR=((F_CPU/SCL_CLOCK)-16)/2;TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN);printf("TWCR 0x%x \n",TWCR);
while(!(TWCR & (1<< TWINT)));
printf(" Start condition has been transmitted \n");
if( (TWSR & 0xF8) != TW_START){
printf(" TWSR start 0x%x\n",TWSR);
}
for ( i =0 ; i< 8 ; i++ ){ // After trying everything with 0x70 I tought the problem could be with the address
// Setting Address
TWDR = add;
// clearing TWCR
TWCR = (1<<TWINT) |(1<<TWEN);
while (!(TWCR & (1<<TWINT)));
twst = (TWSR&0xF8);
if ((TWSR & 0xF8) != TW_MT_SLA_ACK){
printf("Device address wrong at TWSR 0x%x SLA_ACK 0x%x address 0x%x \n",twst, TW_MT_SLA_ACK,add); // here is the problem !!!!!!!!! TWSR value should be 0x18
add++;
}else {
printf("device found at 0x%x TWSR : 0x%x \n",add,TWSR);
}
}
}
.............................................
int main(void)
{
unsigned short i = 0 ;
DDRD |= (1 << PD5); // damit ist dann PB0 ein Ausgang
// UART init and printf
init_uart(MYUBRR);
stdout = &mystdout;
init_i2c();
while(1){
}
}
Aquí está la salida que obtengo:
Entonces,comopuedesver,noobtengoelACKdelesclavo.
aquíesloquepuedoverenelalcance:
para100Khz:
para400kHz
Ambas medidas son para la dirección 0x70. mi pregunta es qué estoy haciendo mal aquí, y ¿por qué tanto SCL como SDA no están en una posición de alto despiste? ¿Es una configuración de software que me falta?
gracias por tu ayuda!