Comunicación con dispositivos I2C usando un RTL8710

1

He conectado un RTL8710 ( en forma "Rtlduino" ) a un MCP23008 (en una placa de pruebas) a través de I2C de la siguiente manera:

Estoyusando rustl8710 para programar el RTL8710, que funciona bien y ya conecté una pantalla a través de SPI sin cualquier problema.

He configurado este código para probar el MCP23008:

led1.write(DigitalValue::High);
let mut handle = i2c_t::default();
i2c_init(&mut handle as *mut i2c_t, PinName::PC_4, PinName::PC_5);
i2c_frequency(&mut handle as *mut i2c_t, 1000);
led2.write(DigitalValue::High);
if i2c_write(&mut handle as *mut i2c_t, 0x20, &[ 0x00, 0xff as i8, 0, 0, 0, 0, 0, 0, 0, 0, 0 ][0] as *const i8, 11, 1) != 1
{
    panic!("Byte write failed!");
}

led3.write(DigitalValue::High);
loop { }

Siéntase libre de ignorar todas las líneas que comienzan con led* , simplemente tiran de algunos pines GPIO para iluminar los 3 LED internos en el dispositivo para que pueda ver si funciona sin usar gdb .

Alternativamente, este código C muestra el mismo problema:

#include "i2c_api.h"
#include "PinNames.h"

void main(void)
{
    ConfigDebugInfo = 0xffffffff;

    char data[] = { 0x00, 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
    i2c_t handle;
    i2c_init(&handle, PC_4, PC_5);
    i2c_frequency(&handle, 1000);
    i2c_write(&handle, 0x20, data, 11, 1);

    while(1) { }
}

Pegue el código anterior en lugar de main en main.c y luego flashear y ejecutar el código usando make && make flash && make debug . El código nunca alcanzará el bucle while , y colgará en i2c_write .

El código efectivamente hace lo mismo que este código en una biblioteca de Adafruit para el MCP23008 .

La configuración I2C (primeras 5 líneas) funciona, pero cuando se llama a i2c_write , el RTL8710 simplemente cuelga infinitamente en algún lugar en un bucle en RtkI2CSend_Patch () at component/soc/realtek/8195a/fwlib/src/hal_i2c.c:1324 (según gdb )

El MCP23008 funciona bien, lo he usado con éxito en un ATTiny85.

Otras cosas que podrían ser relevantes:

  • PC_5 (también conocido como GC5) también está conectado a un botón en la placa de evaluación, que tira del pin alto cuando no se presiona no .
  • La RTL8710 imprime RTL8195A[HAL]: ISR 0 didb't bee register!!!␊ en los puertos UART_LOG. Esto parece ser de una función eso no está disponible en formato fuente, por lo que no estoy muy seguro de cómo debería interpretarlo.

¿Qué estoy haciendo mal?

    
pregunta Size43

1 respuesta

0

Resulta que, de hecho, no fui el único que notó este problema. Tanto en los SDK 3.5a como en los 4.0b (rustl8710 usa el SDK 3.5a), hay un error en el código I2C. Realtek ha publicado una solución para este error, pero esta solución no se incluye en las descargas del SDK, ni aparece en la página de descarga, ni aparece en las notas de la versión .

En su lugar, debe descargar una biblioteca fija de la página de preguntas frecuentes aquí: enlace . Para rustl8710, que usa el SDK 3.5a, debe hacer clic en 'Arreglar 3.5a GCC SDK I2C problema', luego descargar el archivo zip vinculado (nota: es posible que necesite crear una cuenta antes de poder descargar el archivo). Este archivo zip contiene un solo lib_platform.a , que deberá copiar sobre el archivo existente en component/soc/realtek/8195a/misc/bsp/lib/common/GCC/lib_platform.a .

Después de esto, usa estos comandos make para reconstruir todo:

make clean
make

Para mí, I2C todavía no funciona la primera vez después de parpadear. Esto se puede solucionar iniciando una sesión de depuración con make debug , luego saliendo de q y reiniciando la sesión de depuración con make debug de nuevo.

    
respondido por el Size43

Lea otras preguntas en las etiquetas