st_orig res 1
; st is a bitmask, bit set in visible states:
- ; master slave
-st_starting equ 7 ; Writing-Setup?,Reading-Busy?
-st_addressing equ 6 ; Writing-Setup?,Reading-Busy?
-st_writing equ 5 ; Writing-* [Idle-going-]Receiving
-st_subsequent equ 4 ; Writing? Receiving
-st_reading equ 3 ; Reading-* Transmit-*
-st_awaiting equ 2 ; Reading-Wait Transmit-Wait
-st_acking equ 1 ; Reading-Busy?,Stopping(from read)
+ ; master
+st_starting equ 7 ; Writing-Setup?, Reading-Busy?
+st_addressing equ 6 ; Writing-Setup?, Reading-Busy?
+st_writing equ 5 ; Writing-*, Stopping(after Reading-Wait:write_start)
+st_subsequent equ 4 ; Writing?
+st_reading equ 3 ; Reading-*
+st_awaiting equ 2 ; Reading-Wait
+st_acking equ 1 ; Reading-Busy?, Stopping(from read)
st_stopping equ 0 ; Stopping
; ...? means not always set in that state
bt_f_if1 st, st_addressing
bra m_event_done_addressing
- bt_f_if1 st, st_writing
- bra m_event_done_writing
-
bt_f_if1 st, st_acking
bra m_event_done_acking
+ bt_f_if1 st, st_writing
+ bra m_event_done_writing
+
bt_f_if1 st, st_reading
bra m_event_done_reading
;----------
m_start
; st checked for busyness correct
-; st_reading/writing set unchanged
+; st_reading/writing one set, one clear unchanged
; st_starting clear set
; W slave number any
; slave any slave_number
;----------
i2cm_write_start
; At call On return
-; State Idle Writing-Setup
+; State Idle/Reading-Wait Writing-Setup
; W slave number any
tst_f_ifnz st
- bra m_improper_write_start
+ bra m_write_start_busy
bs_f st, st_writing
bra m_start
bra m_stop
-;----------
-m_improper_write_start
- i2cpanic morse_SW
-
;----------
m_improper_write_finish
i2cpanic morse_SF
bra m_start
;----------
+m_write_start_busy
+ bs_f st, st_writing
m_read_start_busy
bt_f_if1 st, st_awaiting
- bra m_read_different
- i2cpanic morse_SR
+ bra m_address_different
+ i2cpanic morse_SB
;----------
-m_read_different
-; Main program would like to address another slave.
+m_address_different
+; Main program would like to address another slave for reading.
mov_wf slave_next
bra_z m_improper_slave
bra i2cm_read_done
; ok, we want to read another:
mov_wf slave
clr_f slave_next
- bs_f st, st_reading
+ bt_f_if0 st, st_writing ; because of i2cm_write_start ?
+ bs_f st, st_reading ; no, then we will want to read
bs_f SSPCON2, RSEN
bra m_start_or_restart
; MASTER
;
; States:
-; [Not-in-use]
-; |
-; |init
-; v
-; [Idle]<-----------------------------.
-; write_start/ \read_start |
-; / \ ,--------------. |
-; V V V | |
-; [Writing-Setup] [Reading-Busy]<---------. | |
-; | | | | |
-; write_next_byte| |read_got_byte | | |
-; must return NZ | | | | |
-; V V | | |
-; ,-->[Writing] [Reading-Wait] | | |
-; `-------' \ / | `-------------' | |
-; write_next_byte \ / | read_another | |
-; returns NZ | / `._________________,' |
-; | / read_start |
-; write_next_byte| |read_done |
-; returns Z | | |
-; V V |
-; [Stopping] |
-; | done |
-; `----------------------------------'
+; [Not-in-use]
+; |
+; |init
+; v
+; [Idle]<-------------------------<------.
+; / \ |
+; / _ \ _____________________<______ |
+; /,' \ `. |
+; write_start// \read_start | |
+; // \ ,------------------<---. | |
+; // \ | | | |
+; VV VV | | |
+; [Writing-Setup] [Reading-Busy]<---------. | | |
+; | | | | | |
+; write_next_byte| |read_got_byte | | | |
+; must return NZ | | | | | |
+; V V | | | |
+; ,-->[Writing] [Reading-Wait] | | | |
+; `-------' \ / || `.___________,' | | |
+; write_next_byte \ / || read_another | | |
+; returns NZ | / || | | |
+; | / |`.__________________,' | |
+; | | | read_start | |
+; write_next_byte| | `._____________________,' |
+; returns Z | | write_start |
+; | |read_done |
+; V V |
+; [Stopping] |
+; | done |
+; `-------------------------------------'
;--------------------
extern i2cmu_done
; has been established, i2cmu_write_next_byte will be called.
;
; At call On return
-; State Idle Writing-Setup
+; State Idle/Reading-Wait Writing-Setup
; W slave number any
extern i2cmu_write_next_byte
; i2cmu_read_got_byte will be called.
;
; At call On return
-; State Idle Reading-Busy
+; State Idle/Reading-Wait Reading-Busy
; W slave number any
extern i2cmu_read_got_byte
SS SSPSTAT,SSPCON1 ; s.,i., controller bad state
SK i2clib:slave ; m. couldn't address slave (no ack)
SN i2clib:slave ; improper slave number
-SW i2clib:st ; improper i2cm_write_start
+SB i2clib:st ; improper i2cm_{read,write}_start
SF i2clib:st ; improper i2cmu_write_next_byte Z
-SR i2clib:st ; improper i2cm_read_start
SA i2clib:st ; improper i2cm_read_another
SD i2clib:st ; impr. i2cm_read_done/i2cs_read_data