chiark / gitweb /
i2clib inc
[trains.git] / detpic / i2clib.asm
1 ;######################################################################
2 ; i2clib.inc - I2C LIBRARY - IMPLEMENTATION
3 ;
4 ; See i2clib.asm for documentation of the interface to this file.
5
6  include /usr/share/gputils/header/p18f458.inc
7  radix dec
8  include ../iwjpictest/insn-aliases.inc
9
10 ;============================================================
11 ; COMMON ADMINISTRATIVE ROUTINES
12
13                 udata_acs
14 t               res     1
15
16                 code
17
18 ;--------------------
19 i2cs_init
20 ;       W               slave number            undefined
21                 rcall   slave2addr2
22                 mov_wf  SSPADD
23                 mov_lw  0x16 ; !SSPEN, CKP(release), I2C 7-bit slave
24                 mov_wf  SSPCON1
25                 mov_lw  0x81 ; GCEN, SEN
26                 mov_wf  SSPCON2
27                 mov_lw  0x8 ; SMP(noslew), !CKE, !BF(empty)
28                 mov_wf  SSPSTAT
29                 bs_f    TRISB, 0
30                 bs_f    TRISB, 1
31                 bc_f    IPR1, SSPIP
32                 bs_f    SSPCON1, SSPEN
33                 bs_f    PIE1, SSPIE
34                 return
35
36 ;--------------------
37 i2cs_interrupt
38                 bt_f_if0 PIR1, SSPIF
39                 return
40 ; We have an interrupt.  What are the possibilities ?
41                 mov_ff  SSPSTAT, t
42
43 chkval macro mask, value, label
44                 mov_fw  t
45                 and_lw  mask
46                 xor_lw  value
47                 bra_z   label
48                 endm
49                         ; bits we want to check
50                         ;  80  60  20    04    02  01
51                         ;  SMP CKE D_A   R_W   UA  BF
52                         ;  set clr data? read? clr full?
53
54                 chkval  0xe3, 0x81, got_addr
55                 chkval  0xe7, 0xa1, got_data_write
56                 chkval  0xe7, 0xa4, sent_data_read
57
58                 
59
60                 mov_fw  SSPSTAT
61                 and_lw  0xe7 ; all except P and S
62
63                 xor_lw  0x80
64                         ; bits which might sensibly be set
65
66 chkval_last equ 0
67 chkval macro value, label
68                 xor_lw  value ^ chkval_last
69                 bra_z   label
70 chkval_last equ value
71                 endm
72                 chkval  0x80 ;     addr  dunno 
73
74                 mov_lw  0x8
75
76
77                 bt_f_if0 DATA_ADDRESS, SSPSTAT
78                 bra     data
79
80 slave2addr
81 ; computes slave address in form suitable for use in i2c controller
82 ; actual i2c slave address is (slave number) + 0b0001000
83 ;       W               slave number            i2c address * 2
84                 add_lw  0b0001000
85                 rlc_w
86                 return
87
88
89
90
91  include i2clib.inc
92  end