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
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 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); }
Mais je bloque pour le i2c_readWord qui doit être finalement la récupération de 2 bytes:
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); }
Si j'essaye:
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 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(); }
Merci pour votre aide, c'est peu être simple mais je bloque
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]); }
Partager