Cómo hacer que Arduino haga I2C de alta velocidad

4

He conectado dos MCP4725 DAC a mi Arduino y escribí un pequeño bosquejo de demostración para probar la funcionalidad. El boceto dibuja una curva de Lissajous en mi osciloscopio. La frecuencia de salida es un poco decepcionante (aproximadamente 1.5kHz de frecuencia de muestreo), pero la hoja de datos del DAC menciona el modo I2C de alta velocidad. ¿Arduino (Mega1280) admite el modo I2C de alta velocidad y, en caso afirmativo, cómo?

#include <Wire.h>
#include <math.h>

#define DAC0 ( 0xCC >> 1 )
#define DAC1 ( 0xCE >> 1 )

int sh[ 360 ] , sl[ 360 ];
int ch[ 360 ] , cl[ 360 ];

void setup() {
  Wire.begin();
  for ( int a = 0; a <= 360; a++ ) {
    int s = sin( a * 3.141592 / 180 ) * 2047 + 2048;
    int c = cos( a * 3.141592 / 180 ) * 2047 + 2048;
    sh[ a ] = int( s / 256 );
    sl[ a ] = s - sh[ a ] * 256;
    ch[ a ] = int( c / 256 );
    cl[ a ] = c - sh[ a ] * 256;
  }
}

void loop() {
  for ( int b = 0; b < 360; b++ ) {
      for ( int a = 0; a < 360; a += 6 ) {
      Wire.beginTransmission( DAC0 );
      Wire.send( ch[ a ] );
      Wire.send( cl[ a ] );
      Wire.endTransmission();
      Wire.beginTransmission( DAC1 );
      Wire.send( sh[ ( a * 2 + b ) % 360 ] );
      Wire.send( sl[ ( a * 2 + b ) % 360 ] );
      Wire.endTransmission();
     }
  }
}
    
pregunta jippie

1 respuesta

5

Consideraría ir a un nivel por debajo del "Cable" del objeto C ++ y utilizaría los archivos C que se encuentran aquí:

enlace

Hay una constante de interés en twi.h :

#define TWI_FREQ 100000L

Y el registro se establece en el archivo twi.c así:

// initialize twi prescaler and bit rate
  cbi(TWSR, TWPS0);
  cbi(TWSR, TWPS1);
  TWBR = ((F_CPU / TWI_FREQ) - 16) / 2;

/* twi bit rate formula from atmega128 manual pg 204
  SCL Frequency = CPU Clock Frequency / (16 + (2 * TWBR))
  note: TWBR should be 10 or higher for master mode
  It is 72 for a 16mhz Wiring board with 100kHz TWI */

Por ese comentario, y sin tener que ir a la hoja de datos (aunque te sugiero que lo hagas si quieres entender qué significan esas líneas), parece que el Arduino Mega (16 MHz) toma como valor predeterminado el reloj I2C de 100 kHz . Siguiendo la fórmula dada, cambie el valor de TWI_FREQ para lograr una frecuencia de reloj I2C deseada.

Sin embargo, después de leer la hoja de datos de Atmega, me parece que lo más rápido que puede obtener [Ver edición]. Echa un vistazo a la sección 24.5.2 Bit Rate Generator Unit para confirmar esto. Si define "Alta velocidad" como I2C de 3.4 MHz, entonces la respuesta parece ser no , no puede lograrlo con su hardware actual, pero debería poder obtener algo más rápido que el por defecto 100 kHz si realmente quieres.

EDITAR: puede ser posible alcanzar 1 MHz si estoy leyendo la hoja de datos correctamente. Fórmula utilizada de la hoja de datos: SCL = (F_CPU) / (16 + 2 * TWBR * 4 ^ TWPS) El siguiente descargo de responsabilidad sigue en pie: p

Descargo de responsabilidad: simplemente eché un vistazo rápido a los documentos para encontrar lo anterior, es totalmente posible que me haya perdido algo. Lea la hoja de datos para confirmar todo esto y familiarícese con su microcontrolador, ya que desea hacer algo que la biblioteca de Arduino no ofrece.

    
respondido por el Jon L

Lea otras preguntas en las etiquetas

Comentarios Recientes

sin un motor más costoso) Una elección cuidadosa de los parámetros de programación evitará daños si el Arduino USB Mini 1.1 se arruina. Suelde los cables en las posiciones donde los pines 16 y 17 en la placa Arduino comparten los mismos cables de conexión, y por debajo del 0% de baudios utilizando la dirección de COTS-info. De los paneles Elcc, los revestimientos de soldadura / espuma a menudo no son una opción. Algunos sitios de proveedores omiten la soldadura si es una mala idea. Entre ellos hay dos posibilidades.... Lees verder