STM8S I2C Maestro falta ACK

1

Utilizo la comunicación I2C con dos tableros stm8s.

Mi código maestro:

I2C_GenerateSTART(ENABLE);
I2C_Send7bitAddress(0x30, I2C_DIRECTION_TX);
I2C_SendData(0x61);
I2C_GenerateSTOP(ENABLE);
delay(1500);

Mi dirección de esclavo es 0x30. Te envío 0x61. Analicé el tablero maestro de stm8s con ossiloscope. Veo desde lister:

Dirección: 30R

Datos: cualquier cosa

Falta ACK: X (con fondo rojo)

Mi señal de la placa maestra con stm8s: [! [ingrese la descripción de la imagen aquí] [1]] [1]

¿Cuál podría ser el problema por faltar ack? Y, ¿es verdadera la dirección y los valores de los datos? ¡Gracias!

Y,

Mi código de arduino maestro:

Wire.beginTransmission(0x30); // transmit to device 0x30
Wire.write(0x61);              // sends one byte
Wire.endTransmission();    // stop transmitting
delay(500);

Y esta foto del master arduino codifica con ossiloscope:

Aquí,ladirecciónes30W,peroladireccióndelcódigomaestrodemistm8ses30R.Cambiéestalíneadelcódigomaestrodestm8s:

I2C_Send7bitAddress(0x30,I2C_DIRECTION_RX);//I2C_Send7bitAddress(0x30,I2C_DIRECTION_TX);

Peroladirecciónsiguesiendo30R.

códigodeestalínea:

/***@briefTransmitsthe7-bitaddress(toselectthe)slavedevice.*@paramAddress:Specifiestheslaveaddresswhichwillbetransmitted.*@paramDirection:SpecifieswhethertheI2CdevicewillbeaTransmitteroraReceiver.*Thisparametercanbeanyofthe@refI2C_Direction_TypeDefenumeration.*@retvalNone*/voidI2C_Send7bitAddress(uint8_tAddress,I2C_Direction_TypeDefDirection){/*Checkfunctionparameters*/assert_param(IS_I2C_ADDRESS_OK(Address));assert_param(IS_I2C_DIRECTION_OK(Direction));/*Clearbit0(direction)justincase*/Address&=(uint8_t)0xFE;/*SendtheAddress+Direction*/I2C->DR=(uint8_t)(Address|(uint8_t)Direction);}

y

/***@briefI2Ctransferdirection*Warning:thevaluescorrespondtotheADD0bitpositionintheOARLregister*/typedefenum{I2C_DIRECTION_TX=(uint8_t)0x00,/*!<Transmissiondirection*/I2C_DIRECTION_RX=(uint8_t)0x01/*!<Receptiondirection*/}I2C_Direction_TypeDef;

/**************************NOW*******************************************/CambiémicódigomaestroI2Cstm8s:

I2C_GenerateSTART(ENABLE);I2C_Send7bitAddress(0x30,I2C_DIRECTION_TX);I2C_SendData(0x60);//Ihavenoidea,itrieditandworksforwrite/readselectionI2C_SendData(0x61);//mysenddataI2C_GenerateSTOP(ENABLE);delay_delay(1500);

Ladirecciónesde30W,ahora.Esciertoporquequieroescribiralesclavo.Entonces,viestaseñaldelossiloscopio:

Esta señal es la misma que la del transmisor maestro Arduino.

Pero, no puedo ver la señal de los datos. ¿Cuál podría ser la razón de ésto? ¿Falta ACK u otra cosa? No lo sé, pero la señal de datos no es de la señal de arduino. ¿Falta ACK?

¡Gracias!

    
pregunta kbtr

1 respuesta

1

Hay dos formatos estándar para direcciones I2C de 7 bits: 0x7F y 0xFE. Parece que I2C_Send7bitAddress () espera el formato 0xFE. Si su dirección de esclavo real es 0x30, intente enviar 0x60 (que es 0x30 < < 1) y vea si funciona.

El motivo del formato 0xFE es que le permite tratar el bit de dirección de lectura / escritura como parte de la dirección del esclavo, dando un valor de 8 bits. Eso es lo que realmente ves en el autobús.

    
respondido por el Adam Haun

Lea otras preguntas en las etiquetas