Arduino a CPLD para encender un LED usando I2C

3

Tengo un CPLD (Lattice MachXO2) que emite una señal de un Arduino para encender un LED.

Arduino:

//send out .1s pulse on output pin 2 when a 'q' is recieved
void loop () {
  USBinByte = Serial.read();
   if (USBinByte == 'q') {
     digitalWrite(ledPin, HIGH);
     delay (100);
     digitalWrite(ledPin, LOW);
   } 
}

CPLD:

//When LEDin goes high toggle LED
module toggleLED (
 LED,
 LEDin);
    output LED;
    input LEDin;
    reg LED;

    assign led_next = ~LED;
    always @(posedge LEDin) begin
        LED = led_next;
    end
endmodule

¿Cómo configuro I2C en ambos chips para poder cargar un registro de 8 bits en el CPLD y también leer el registro, por lo que puedo configurar varios LED? He hecho I2C entre tres Arduinos antes de usar la biblioteca WIRE. I2C es necesario para un proyecto en el que estoy trabajando.

    
pregunta Ben Elo

2 respuestas

7

Deberá comenzar con la detección de la condición de inicio: SDA va de alto a bajo, mientras que SCL es alto. Esto debería restablecer su lógica I2C.

Luegocambieen8bits(cuéntelos)y,despuésderecibireloctavobit,compareladirecciónconladireccióndelCPLD(losprimeros7bits).Sicoinciden,tiredeSDAhastaelsiguientepulsodereloj.¡Noolvidequeestodeberíaserunasalidadedrenajeabierto!

Eloctavobitrecibidofueelbit\$\mathrm{R/\overline{W}}\$,peroprobablementesolodeseeescribir,luegoignorarloonoreconocersielbitestáestablecido(indicandounaoperacióndelectura).

Siladireccióncoincide,espereelsiguientebyte.Denuevocambiaen8bits,yacéptalodespuésdeloctavo.

Esto debería completar una transmisión, y cuando detectes una condición de parada (SDA se está elevando mientras SCL está alta) engancha los ocho bits de datos recibidos.

Lecturas adicionales
Especificación I2C

    
respondido por el stevenvh
4

Steven proporciona una buena descripción del protocolo I2C. He trabajado con el protocolo antes; diseñar una implementación que cumpla con las especificaciones sería más difícil que diseñar un registro de cambios SPI, como Saad comentó anteriormente.

Si necesita usar I2C y no desea desarrollar su propia implementación, puede usar o examinar una implementación existente (fuente abierta).

Por ejemplo, puede consultar este proyecto I2C Slave en opencores.org

    
respondido por el B Pete

Lea otras preguntas en las etiquetas