Uso de dispositivos I2C en la interfaz SMBus

3

Estoy desarrollando en una pila PC / 104 que aparentemente tiene una interfaz I2C. Sin embargo, en una investigación adicional, en realidad es una interfaz SMBus, pero dice que los dos son intercambiables hasta 400kHz. Sin embargo, la única forma de acceder a él es a través de una DLL proporcionada por el proveedor. La DLL solo tiene comandos específicos de SMBus, pero al leer SMBus puedo ver que la funcionalidad read_byte parece ser la misma que para I2C.

La DLL muestra la interfaz para read_byte como:

//
// Call this function to reads a byte on the SMBus. This function
// requires the proper values to be setup in the SMB_REQUEST structure.
// This call is valid after a successful OPEN call has been made.
//
// Parameters: handle - Handle to open SMBus API
//      request - input SMB_REQUEST structure 
//
// Returns: 0=SUCCESS, non-zero = FAIL
//
SMBUS_API int SmBusReadByte( SMBUS_HANDLE handle, SMB_REQUEST *request );

.... definiendo la estructura SMB_REQUEST como

typedef struct _SMB_REQUEST
{
 unsigned char Address;
 unsigned char Command;
 unsigned char BlockLength;
 unsigned char Data[SMB_MAX_DATA_SIZE];
} SMB_REQUEST;

Relacionando esto con I2C, estoy pensando que: Dirección es la dirección del dispositivo I2C. El comando es el registro para leer BlockLength la cantidad de bytes para leer Los datos son el búfer de memoria utilizado para devolver el resultado.

Sin embargo, usarlo así no parece funcionar. También hay una función SmReceiveReadByte () con la misma interfaz, así que no estoy seguro de si debo utilizar esa o esta función. También hay una función SmBusReadWord () con la misma interfaz, por lo que me hace creer que tengo una idea equivocada acerca de BlockLength. ¿Qué más podría ser? Probablemente no estoy usando esto correctamente en absoluto. ¿Alguien podría arrojar algo de luz sobre esto por mí?

Gracias

    
pregunta

2 respuestas

2

Si se toma un tiempo y busca en Wikipedia encontrará una página que describe las diferencias entre I2C y SMBus; el que probablemente te está consiguiendo es la suma de comprobación de paquetes o PEC; esto no es necesario para las transferencias I2C, pero los dispositivos SMBus lo quieren. No es difícil calcular y adjuntar a la transferencia, por lo que es posible que desee comenzar allí.

Obviamente, si tiene un analizador lógico, sería prudente poner eso primero y ver si eso es lo que realmente está causando sus problemas antes de intentar escribir el código. :-) También es probable que pueda levantar el código de generación PEC del núcleo de Linux, ya que tiene controladores I2C y SMBus y lugares como el Referencia cruzada de Linux son excelentes para ayudarte a descubrir dónde se esconde el código que te interesa.

¡Buena suerte!

    
respondido por el akohlsmith
1

eso es muy interesante, ¡nunca me di cuenta de que PC / 104 tenía una interfaz SMbus e I2C! gracias :) Siempre he usado tarjetas de estantería pero degresé .....

Le sugeriría que monitoree las líneas con un alcance que tenga interpretación I2C y se conecte y vea qué sucede con los comandos de escritura equivalentes. Esto puede darle una mejor idea de lo que realmente están haciendo los comandos. Sigue esto conectando un microcontrolador y un código simple para leer y escribir cosas en el i2c como dispositivo esclavo y luego vuelve a intentar los comandos de lectura.

Al saber lo que está colocando en el bus con el microcontrolador y al monitorear la comunicación con el alcance, será más fácil tratar de averiguar la API.

Sé que lo anterior tardará un poco en configurarse, pero cuando lo tenga, simplificará todas las pruebas y la depuración en la computadora PC104.

    
respondido por el smashtastic

Lea otras preguntas en las etiquetas