-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathI2C_Routines.mbas
67 lines (56 loc) · 1.95 KB
/
I2C_Routines.mbas
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
module I2C_Routines
sub procedure i2c_init1()
sub procedure i2c_check_idle1()
sub function i2c_ack_check1 as byte
sub procedure i2c_start1()
sub procedure i2c_repeated_start1()
sub procedure i2c_stop1()
sub procedure i2c_write1(dim data_ as byte)
sub function i2c_read1(dim ack as byte) as byte
implements
sub procedure i2c_init1()
SSP1CON1 = 0
TRISC.3 = 1 'SCL. input
TRISC.4 = 1 'SDA. input
SSP1STAT.SMP = 1 'Désactivé le controle de vitesse
SSP1STAT.CKE = 0 'désactivé le Msbus
SSP1ADD = 39 'periode = ((ADD+1)*4)/Fosc donc vitesse= 1/periode= 100 khz
SSP1CON1 = %00001000 'Choix de mode master avec la formule
SSP1CON1.SSPEN = 1 'Activé le port serie
end sub
sub procedure i2c_check_idle1()
while (SSP1STAT.R_W) or (SSP1CON2.SEN)or (SSP1CON2.RSEN)or (SSP1CON2.PEN)or (SSP1CON2.RCEN)or (SSP1CON2.ACKEN) <>0 'vérification de l'état de bus
wend
end sub
sub function i2c_ack_check1 as byte
i2c_check_idle1()
result = SSP1CON2.ACKSTAT 'check if slave has sent an ACK.
end sub
sub procedure i2c_start1() 'Génerer un start
i2c_check_idle1()
SSP1CON2.SEN = 1
end sub
sub procedure i2c_repeated_start1() 'Restart pour la lecture
i2c_check_idle1()
SSP1CON2.RSEN = 1
end sub
sub procedure i2c_stop1() 'Génerer un stop
i2c_check_idle1()
SSP1CON2.PEN = 1
end sub
sub procedure i2c_write1(dim data_ as byte) 'Stocké la data dans le buffer temporairement pour l'envoi
i2c_check_idle1()
SSP1BUF = data_
end sub
sub function i2c_read1(dim ack as byte) as byte
i2c_check_idle1()
SSP1CON2.RCEN = 1 'enable receive
while SSP1STAT.BF <> 1 'byte received?.
wend
result = SSP1BUF 'reception de la data
SSP1CON2.RCEN = 0 'disable receive
SSP1CON2.ACKDT = ack '0:ACK, 1:NOT ACK.
i2c_check_idle1()
SSP1CON2.ACKEN = 1 'send ACK.
end sub
end.