Lire des words à la place de bytes (fonction I2C)
Bonjour à tous,
je programme en C un microcontroleur. Je souhaite communiqué avec un capteur en I2C. Il y a deja une librairie de faite pour le capteur et et j'ai besoin d'utiliser dans cette librairie:
i2c_readByte(SLAVE_ADDR_L, DEV_ID_REG, &val[0]);
i2c_readWord(SLAVE_ADDR_L, MAN_ID_REG, &readBackVal[0]);
i2c_writeWord(SLAVE_ADDR_L, RCOUNT_CH0_REG, PROXIMITY_REFCOUNT);
J'ai le
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| void i2c_writeWords(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint16_t *value)
{
uint8_t i=0;
I2C_MasterSendStart(devAddr, I2C_WRITE_XFER_MODE);
I2C_MasterWriteByte(regAddr);
while (i++ < length) {
I2C_MasterWriteByte(((uint8_t)*value) >> 8);
I2C_MasterWriteByte((uint8_t)*value++);
}
I2C_MasterSendStop();
}
void i2c_writeWord(uint8_t devAddr, uint8_t regAddr, uint16_t value)
{
i2c_writeWords(devAddr, regAddr, 1, &value);
} |
et le
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| void I2CReadBytes(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint8_t *value)
{
uint8_t i=0;
I2C_MasterSendStart(devAddr, I2C_WRITE_XFER_MODE);
I2C_MasterWriteByte(regAddr);
I2C_MasterSendRestart(devAddr, I2C_READ_XFER_MODE);
while (i++ < (length-1)) {
*value++ = I2C_MasterReadByte(I2C_ACK_DATA);
}
*value = I2C_MasterReadByte(I2C_NAK_DATA);
I2C_MasterSendStop();
}
void i2c_readByte(uint8_t devAddr, uint8_t regAddr, uint8_t *value)
{
I2CReadBytes(devAddr, regAddr, 1, value);
} |
Mais je bloque pour le i2c_readWord qui doit être finalement la récupération de 2 bytes:
Si j'essaye:
Code:
1 2 3 4 5 6 7 8 9 10 11
| void i2c_readWord(uint8_t devAddr, uint8_t regAddr, uint16_t *value)
{
uint16_t result = 0;
uint8_t b;
I2C_MasterSendStart(devAddr, I2C_WRITE_XFER_MODE);
I2C_MasterWriteByte(regAddr);
I2C_MasterSendRestart(devAddr, I2C_READ_XFER_MODE);
b = I2C_MasterReadByte(I2C_ACK_DATA) << 8;
*value = b + I2C_MasterReadByte(I2C_ACK_DATA);
I2C_MasterSendStop();
} |
en mettant bien un uint16_t *value en parametre , plus tard dans une des fonction j'ai un warning:
Code:
1 2 3 4 5 6 7 8 9 10 11
| void Sensor_checkDevice(void)
{
uint8_t val[1] = {0};
uint8_t readBackVal[2] = {0};
uint16_t data = 0;
i2c_readByte(SLAVE_ADDR_L, DEV_ID_REG, &val[0]);
i2c_readWord(SLAVE_ADDR_L, MAN_ID_REG, &readBackVal[0]); <---------INCOMPATIBLE POINTER TYPE PASSING Uint8_t to Uint16_t
data = ((uint16_t) (readBackVal[0] << 8) | readBackVal[1]);
} |
Merci pour votre aide, c'est peu être simple mais je bloque