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
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?