entendiendo cómo establecer valores cuando se usan los 8 bits de una dirección más los 2 siguientes de la siguiente dirección

0

Espero que esté redactando esto correctamente, pero aquí va. He estado creando un servicio para MSRDS para ejecutar mi prototype board . La gente probablemente me ha visto hacer preguntas sobre esto antes. He tenido bastante éxito con él y tengo una interfaz que me permite escribir y leer, pero no estoy seguro de cómo tratar con direcciones como 0x53-0x54, donde usan los 8 bits de 53H y luego 2 más de 0x54.

Por ejemplo, puedo configurar la dirección 0x4D (que controla si los puertos digitales son de entrada o salida) en 0x01 y luego configurar 0x4E en 0x01 y el LED que he enchufado en la placa de pan se enciende; eso es fácil porque en En ambos casos, solo trato con una única dirección de 8 bits. Mi problema surge cuando intento configurar el voltaje en la salida analógica O0. Pensé que solo podía enviar dos comandos, el primero configuraba la dirección de 0x55 a 0xFF y luego configuraba 0x56 a 0xC0. He intentado varias combinaciones de esto, sin embargo, nunca puedo obtener el voltaje por encima de aproximadamente 1 voltio y creo que es porque no estoy configurando los valores correctamente.

Con suerte, he dejado esto suficientemente claro para que alguien pueda informarme sobre lo que se necesita hacer para comprender mejor lo que estoy haciendo.

Este es el código que realmente maneja el envío del mensaje a través del enlace serial USB al dispositivo I2C. Es algo complejo y no muy claro porque se está publicando en un servicio (el servicio de ladrillos), he pasado horas con él pero sospecho que no le dirá a nadie más lo que esté al tanto. Es de una versión modificada del código fuente de NXT incluido en las muestras de MSRDS. Dicho esto, puedo decirle que funciona bastante bien cuando trato con una sola dirección de 8 bits. Además, no se llama ReadFromI2cAddressHandler porque con el protocolo lego USB siempre obtiene una respuesta acolchada de 16 bits, en el caso de que simplemente escriba algunos datos, simplemente la ignore porque de todos modos es cero. Si desea ver más del código, está en mi cuenta github .

 [ServiceHandler(ServiceHandlerBehavior.Exclusive)]
    public virtual IEnumerator<ITask> ReadFromI2cAddressHandler(ReadFromI2cAddress readRequest)
    {
        var write = new LegoLSWrite
        {
            Port = _state.SensorPort,
            TXData = readRequest.Body.TxData,
            ExpectedI2CResponseSize = readRequest.Body.ExpectedResponseSize
        };


        Activate(Arbiter.Choice(_legoBrickPort.SendNxtCommand(write),
                                EmptyHandler,
                                f => LogInfo(f.ToException().InnerException + " " + f.ToException().Message)));

        Activate(Arbiter.Receive(false, TimeoutPort(80), EmptyHandler));

        var read = new LegoLSRead(_state.SensorPort);
        Activate(Arbiter.Choice(_legoBrickPort.SendNxtCommand(read),
                                r => readRequest.ResponsePort.Post(new ReadResponse {Bytes = r.CommandData}),
                                f => readRequest.ResponsePort.Post(f)));
        yield break;
    }
    
pregunta Kenn

1 respuesta

2

Nunca he usado MSRDS y al hacer clic en "Aprender" en el sitio vinculado aparece "No hay resultados", no importa lo que haga. Tampoco ha proporcionado ningún código. Así que la siguiente es una conjetura completa.

Por lo que puedo decir, está intentando comunicarse con un dispositivo a través de I2C y la dirección en la que está intentando escribir tiene una longitud de 10 bits. Estás intentando hacer esto como:

[Address][Data][Address][Data]

Eche un vistazo a la sección sobre direccionamiento de 10 bits en la parte inferior de la Especificación I2C .

  

El direccionamiento de 10 bits se puede usar junto con el direccionamiento de 7 bits ya que   La dirección especial de 7 bits (1111 0XX) se usa para señalar la dirección I2C de 10 bits.   Cuando un maestro quiere direccionar un dispositivo esclavo usando direccionamiento de 10 bits,   genera una condición de inicio, luego envía 5 bits de señalización de 10 bits   direccionamiento (1111 0), seguido de los dos primeros bits de la dirección I2C   y luego el bit de lectura / escritura estándar.

  

Sielmaestroescribedatoseneldispositivoesclavo,debeenviarel  Los8bitsrestantesdeladireccióndelesclavocomosegundobyte.

    

Sielmaestroleerálosdatosdeldispositivoesclavo,debeenviarel  Completeladirecciónde10bits(dosbytes)encuantoalaescritura,luegounarepetición  elinicioseenvíaseguidodelprimerbytededirecciónconelbitdelectura/escritura  ajustealtoparaindicarlalectura.Despuésdeesteprocedimientolosdatospuedenser  leerdesdeeldispositivoesclavo.

No sé cómo obtener MSRDS para indicar el direccionamiento de 10 bits. Pero necesitas hacer eso y luego hacer:

[Address][Address][Data][Data]
    
respondido por el embedded.kyle

Lea otras preguntas en las etiquetas