Bonsoir à tous,
Je découvre la communication en I2C sur MPLAB, et j'aimerais lire les données d'un accéléromètre LIS3DH sur un microcontroleur PIC24FJ1024GB610
Pour cela j'ai téléchargé la librairie I2C pour PIC24 : https://www.microchip.com/forums/m745734.aspx
Dans cette librairie se trouve une fonction read (détaillée ci-dessous), j'aimerais l'utiliser pour afficher les valeurs (selon les 3 axes x,y,z) d'accélération sur l'écran de ma carte.
Après avoir consulté la documentation du LIS3DH, son adresse I2C est 0011000, et les données selon l'axe horizontal sont stockées à l'adresse 0x28, sachant qu'en mode "normal" le data output est de 10 bits.
Je pensais donc appeler la fonction de la sorte :
Code C : Sélectionner tout - Visualiser dans une fenêtre à part I2C1_M_Read(0011000, 0x28, 10, mybuffer);
De ce que je comprends, les 10 bits en output seront stockés dans ma chaine buffer. Et je pourrai donc ajouter un printf("%d" ,mybuffer) pour lire les données ?
Je précise que je n'ai pas accès à la carte...
Merci
Code C : 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
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80 int I2C1_M_Read(BYTE DevAddr, BYTE SubAddr, int ByteCnt, char *buffer) { BYTE SlaveAddr; int retval; int i; if(IsI2C1BusDirty) //Ignore requests until Poll cmd is called to fix err. return I2C_Err_BusDirty; if(I2C1_M_Start() != I2C_OK) //Start {//Failed to open bus SetI2C1BusDirty; return I2C_Err_CommFail; } SlaveAddr = (DevAddr << 1) | 0; //Device Address + Write bit retval = I2C1_M_WriteByte((char)SlaveAddr); if(retval == I2C_Err_NAK) {//Bad Slave Address or I2C slave device stopped responding I2C1_M_Stop(); SetI2C1BusDirty; //Will reset slave device return I2C_Err_BadAddr; } else if(retval<0) { I2C1_M_Stop(); SetI2C1BusDirty; return I2C_Err_CommFail; } if( I2C1_M_WriteByte((char)SubAddr) != I2C_OK) //Sub Addr { I2C1_M_Stop(); SetI2C1BusDirty; return I2C_Err_CommFail; } if( I2C1_M_Restart() != I2C_OK) //Repeated start - switch to read mode { I2C1_M_Stop(); SetI2C1BusDirty; return I2C_Err_CommFail; } SlaveAddr = (DevAddr << 1) | 0x01; //Device Address + Read bit if( I2C1_M_WriteByte((char)SlaveAddr) != I2C_OK) //Slave Addr { I2C1_M_Stop(); SetI2C1BusDirty; return I2C_Err_CommFail; } for(i=0;i<ByteCnt;i++) //Data { if(i==(ByteCnt-1) ) { retval = I2C1_M_ReadByte(I2C_M_NACK); //NACK on last byte so slave knows this is it } else { retval = I2C1_M_ReadByte(I2C_M_ACK); } if(retval >= 0) { buffer[i] = retval; } else {//Error while reading byte. Close connection and set error flag. I2C1_M_Stop(); SetI2C1BusDirty; return I2C_Err_CommFail; } } if(I2C1_M_Stop() != I2C_OK) {//Failed to close bus SetI2C1BusDirty; return I2C_Err_CommFail; } return I2C_OK; //Success }
Partager