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