Salut

J'ai repris ce Si7021 que je pilote avec une carte maître FPGA programmée en Verilog. J'ai pas mal galéré

, mais j'obtiens enfin quelque chose...
Après avoir envoyé la commande de température en mode
No Hold Master (commande 0xF3), je lance et relance la commande de lecture (
Setup Read 0x40). Tant que la conversion n'est pas terminée, le capteur n'acquitte pas (
NAK) :

(point vert =
Start ou
Start Repeating, point orange =
Stop)
Environ 7ms plus tard (conforme à la doc qui annonce 7ms typique et 10,8ms maxi), la conversion est terminée et le capteur acquitte enfin (
Setup Read 0x40 + ACK):

Il reste alors à lire les 3 octets retournés (successivement poids fort MSB, poids faible LSB, et Checksum)
0x6034, il fait 19,2°C

Je pourrai en dire davantage quand j'aurai fini la mise au point, je ne maîtrise pas tout encore et je ne suis pas au bout de mes peines

extrait du code (machine à états finis en Verilog)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| ...
s_I2C_ADRR : // Slave Address (0x40) + Read
begin
if (!i2c_busy) begin
i2c_start = 0;
i2c_write = 1;
i2c_data_in = I2C_ADRSi7021_Read;
r_I2C_State_Next = s_I2C_MEASURE_CHECK;
end
end
s_I2C_MEASURE_CHECK :
begin
if (!i2c_busy) begin
if (i2c_ack_write) begin // si NAK
i2c_write = 0;
i2c_start = 1;
r_I2C_State_Next = s_I2C_ADRR; // si NAK, la conversion n'est pas terminée, on retourne à l'étape précédente
end else
begin // si AK
r_I2C_State_Next = s_I2C_MEASURE; // si AK, fin de la conversion, il faut récupérer les données de température à l'étape suivante
end
end
end
s_I2C_MEASURE : // conversion terminée
begin
if (!i2c_busy) begin
i2c_write = 0;
i2c_read = 1;
i2c_ack_read = 1;
r_I2C_State_Next = s_I2C_READ_MSB;
end
end
s_I2C_READ_MSB :
begin
... |
2 |
0 |