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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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