1 ;######################################################################
2 ; i2clib.inc - I2C LIBRARY - DECLARATIONS AND DOCUMENTATION
5 ;============================================================
9 ; i2cm_... on master or i2cmu_... for upcalls
10 ; i2cs_... on slave or i2csu_... for upcalls
12 ; i2c?_... are for use by the rest of the program and
13 ; are the entrypoints which enable I2C use.
14 ; i2c?u_... must be defined in the rest of the program
15 ; with the functionality and behaviour described.
16 ; i2cm_... may only be called on the master PIC.
17 ; i2cs_... may only be called on slave PICs.
19 ; At all times following i2c[ms]_init, the i2c hardware in the PIC is
20 ; completely reserved to the routines defined in i2clib.asm. Nothing
21 ; else is allowed to read or modify the i2c controller state.
22 ; Likewise, the memory locations (variables) defined there are for use
23 ; by those routines only and must not be touched by the main program.
25 ; Unless otherwise stated, all routines accept any value in, and may
26 ; trash, W and the flags. All other registers and locations not
27 ; specifically mentioned here will be preserved by the
28 ; i2c?_... routines (and are therefore reserved for the rest of the
29 ; program). In all cases, routines are called with CALL or RCALL or
30 ; the equivalent, and routines are allowed to have subroutines (ie, to
31 ; use the call/return address stack).
33 ; Slave numbers (PIC numbers) are the actual PIC number, not the i2c
34 ; address. So, they start at 1 for the first slave. (PIC #0 is the
35 ; master but the master doesn't have an i2c address and its PIC number
36 ; is never required by or supplied to i2clib.)
37 ; They must be between 1 and 63 inclusive.
39 ; i2c?_... routines except i2c?_interrupt will never _directly_ call
40 ; any i2c?u_... routine; when we say `causes' this means that the
41 ; relevant i2c?u_... routine will be called at some later point from
42 ; i2c?_interrupt. i2c?u_... routines are allowed to call appropriate
43 ; i2c?_... routines (except i2c?_interrupt) directly if the context
46 ; All routines except i2c?_init must be called only:
47 ; * During a low-priority interrupt;
48 ; * From the main loop with low-priority interrupts disabled; or
49 ; * From within an i2c?u_... routine (which are always called
50 ; from within i2c?_interrupt).
51 ; This is to avoid having one i2c_... routine running in an interrupt
52 ; which interrupted the middle of another i2c_... routine.
54 ; Some time between calling i2cs_init and waiting for the first event,
55 ; the main program should of course enable interrupts.
57 ;============================================================
58 ; COMMON ADMINISTRATIVE ROUTINES
63 ; Initialises the i2c system for use by a master PIC. Must be called
64 ; exactly once, which must be before any other i2c?_... function.
66 ; i2c controller any for use by i2clib
67 ; i2c interrupt config any enabled, low priority
68 ; global interrupt enable disabled unchanged
69 ; State Not-in-use Idle (as master)
74 ; Initialises the i2c system for use by a slave PIC. Must be called
75 ; exactly once, which must be before any other i2c?_... function.
76 ; W is the slave number.
78 ; i2c controller any for use by i2clib
79 ; i2c interrupt config any enabled, low priority
80 ; global interrupt enable disabled unchanged
81 ; State Not-in-use Idle (as slave)
88 ; Must be called by the main program's low priority interrupt handler.
89 ; The main program's interrupt handler is responsible for saving W and
90 ; the flags register and other interrupt-related administrivia. If
91 ; there is an i2c interrupt, this routine will service it, taking any
92 ; necessary action including calling appropriate i2c?u_... routines,
93 ; and clear the interrupt flag[*].
96 ; State any except Not-in-use may change
97 ; i2c interrupt state any cleared[*]
99 ; [*] The interrupt event on entry, if any, will be dealt with. If
100 ; interrupt processing takes a long time, another interrupt will occur
101 ; and this may result in the i2c interrupt flag being set on return
102 ; from i2c?_inerrupt.
105 ;======================================================================
113 ; [Idle]<-----------------------------.
114 ; write_start/ \read_start |
117 ; [Writing-Setup] [Reading-Busy]<---------. |
119 ; write_next_byte| |read_got_byte | |
120 ; must return NZ | | | |
122 ; ,-->[Writing] [Reading-Wait] | |
123 ; `-------' \ / `-------------' |
124 ; write_next_byte \ / read_another |
127 ; write_next_byte| | |
132 ; `----------------------------------'
134 ;--------------------
137 ; Called to notify that the previous conversation with the slave has
138 ; been finished as requested. The i2c system is now available and
139 ; i2cm_*_start can be called.
141 ; (Note: If this arrangment means that main program ends up needing to
142 ; keep track of whether the I2C is Idle or not, it would probably be
143 ; straightforward to enhance the interface to be enhanced to make that
144 ; unnecessary, since this information is already tracked by i2clib.)
147 ; State Stopping Idle
149 ;========================================
150 ; MASTER - WRITES (ie, transmission of data to the slave)
152 ;--------------------
153 extern i2cm_write_start
155 ; Requests that a slave be contacted for writing. When communication
156 ; has been established, i2cmu_write_next_byte will be called.
159 ; State Idle Writing-Setup
162 extern i2cmu_write_next_byte
164 ; Called to notify the main program that we are now ready to transmit
165 ; a byte to the slave that we're currently talking to. This may be
166 ; either because i2cm_write_start was previously called and
167 ; communication has been established, or because tranmission of the
168 ; previous byte is complete.
170 ; The main program must immediately supply the actual data byte. This
171 ; byte will then be transmitted to the slave, and then
172 ; i2cmu_write_next_byte will be called again.
174 ; Alternatively the main program may indicate that the tranmission
175 ; should finish by setting the Z flag on return. In this case the
176 ; slave will be told that this is the end of the message and the i2c
177 ; conversation will be finished. When the conversation is finished
178 ; and the bus and i2c controller are free again, i2cmu_done will be
181 ; When transmission should continue:
183 ; Beforehand At call On return After return
184 ; State Writing[-Setup] Writing Writing Writing
185 ; Status Z any 0 (NZ, not zero, not equal)
186 ; W any data for slave
188 ; When transmission should finish:
190 ; Beforehand At call On return After return
191 ; State Writing Writing Writing Stopping
192 ; Status Z any 1 (Z, zero, equal)
195 ;========================================
196 ; MASTER - READS (ie, reception of data from the slave)
198 ;--------------------
199 extern i2cm_read_start
201 ; Requests that a slave be contacted for reading. When communication
202 ; has been established and the first byte received,
203 ; i2cmu_read_got_byte will be called.
206 ; State Idle Reading-Busy
209 extern i2cmu_read_got_byte
211 ; Called to notify the main program that a byte has been recieved from
212 ; the slave PIC. The byte value is supplied. Communication with the
213 ; slave will be suspended (with the i2c bus blocked) until the main
214 ; program calls i2cm_read_another or i2cm_read_done. The main program
215 ; must call one of these two before doing anything else with the i2c.
218 ; State Reading Reading-Wait
221 extern i2cm_read_another
223 ; Requests that the communication with the slave continue and another
224 ; byte be read. When this is complete, i2cmu_read_got_byte will be
228 ; State Reading-Wait Reading-Busy
230 extern i2cm_read_done
232 ; Requests that reading from the slave be terminated. When the
233 ; conversation is finished and the bus and i2c controller are free
234 ; again, i2cmu_done will be called.
237 ; State Reading-Wait Stopping
240 ;======================================================================
249 ; [Idle]<-------------------------.
253 ; ,->[Receiving] [Transmitting]<-. |
254 ; `-----' | | `------' |
255 ; write_another | | read_another |
258 ; `--------------+->----------------'
260 ;========================================
261 ; SLAVE - WRITES (ie, reception of data from the master)
263 ;--------------------
264 extern i2csu_write_begin
266 ; Called to notify the main program that the master PIC has selected this
267 ; slave to talk to, for writing. Provides the first byte of data
268 ; we received from the master PIC.
270 ; Beforehand At call On return
271 ; State Idle Receiving Receiving
272 ; W data from master any
274 ;--------------------
275 extern i2csu_write_another
277 ; Called to notify the main program that the master PIC has continued
278 ; by transmitting another byte of data. Provides the byte we received.
280 ; Beforehand At call On return
281 ; State Receiving Receiving Receiving
282 ; W data from master any
284 ;--------------------
285 extern i2csu_write_done
287 ; Called to notify the main program that the master PIC has stopped
288 ; transmitting data (ie, finished the i2c conversation).
290 ; Beforehand At call On return
291 ; State Receiving Idle
293 ;========================================
294 ; SLAVE - READS (ie, transmission of data to the master)
296 ;--------------------
297 extern i2csu_read_begin
299 ; Called to notify the main program that the master PIC has selected
300 ; this slave to talk to, for reading, and to obtain the first byte of
301 ; data that we should transmit to the master.
303 ; Beforehand At call On return
304 ; State Idle Transmitting Transmitting
305 ; W any data for master
307 ;--------------------
308 extern i2csu_read_another
310 ; Called to notify the main program that the master PIC has continued
311 ; by asking for another byte of data. Must provide the byte.
313 ; Beforehand At call On return
314 ; State Transmitting Transmitting Transmitting
315 ; W any data for master
317 ;--------------------
318 extern i2csu_read_done
320 ; Called to notify the main program that the master PIC has stopped
321 ; asking for data (ie, finished receiving).
323 ; Beforehand At call On return
324 ; State Transmitting Idle
326 ;======================================================================
329 ; these are `extern'd only so that the morse machinery can display them