;
; See i2clib.asm for documentation of the interface to this file.
- include /usr/share/gputils/header/p18f458.inc
- radix dec
- include ../iwjpictest/insn-aliases.inc
+ include /usr/share/gputils/header/p18f458.inc
+ radix dec
+ include ../iwjpictest/insn-aliases.inc
-clock equ 0
- include ../iwjpictest/clockvaries.inc
- include panic.inc
- include morse+auto.inc
- include i2clib.incm
+ include ../iwjpictest/clockvaries.inc
+ include panic.inc
+ include morse+auto.inc
+ include i2clib.incm
;======================================================================
; NOTATION
udata_acs
-sspstat res 1
-sspcon1 res 1
+sspstat res 1 ; master only
+sspcon1 res 1 ; master only
sspcon2 res 1 ; master only
slave res 1 ; master only
slave_next res 1 ; master only
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
code
-;----------
-i2cpanic macro morse_addr
-; Like panic but turns off the I2C controller
- bc_f SSPCON1, SSPEN
- panic morse_addr
- endm
-
;----------
slave2addr
; computes slave address in form suitable for use in i2c controller
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
; expects to return directly to main program (caller)
mov_wf slave
- bra_z m_improper_slave
bs_f SSPCON2, SEN
m_start_or_restart
and_lw ~31
bra_nz m_improper_slave
bs_f st, st_starting
+ tst_f_ifnz slave
return
+ ; oops:
+;...
+
+m_improper_slave
+; slave slave number
+ i2cpanic morse_SN
+
;----------
m_event_done_starting
;----------
m_event_done_addressing
bt_f_if1 sspcon2, ACKSTAT
- bra m_bad_address_ack
+ bra m_no_address_ack
; OK, we got ack.
bc_f st, st_addressing
goto i2cmu_done
;----------
-m_bad_address_ack
- i2cpanic morse_SK
+m_no_address_ack
+ bt_f_if0 st, st_reading
+ bra m_bad_no_address_ack_write
+ clr_f st
+ rcall m_stop
+ goto i2cmu_slave_no_ack
-;----------
-m_improper_slave
-; slave slave number
- i2cpanic morse_SN
+m_bad_no_address_ack_write
+ panic morse_SW
;========================================
; MASTER - WRITING
;----------
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
+ tst_f_ifnz slave_next
bra i2cm_read_done
+ panic morse_SO
;----------
m_event_done_addressing_read
; 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
set_f sspcon1
set_f sspcon2
set_f st_orig
- bs_f TRISB, 0
- bs_f TRISB, 1
+ bs_f TRISC, 3
+ bs_f TRISC, 4
bs_f SSPCON1, SSPEN
bs_f PIE1, SSPIE
return
;----------
; Macros: chkvals_start and chkval
-chkvals_start macro what
- mov_fw what
+chkvals_start macro chvals_what
+ mov_fw chvals_what
endm
-chkval macro lastval, value, label
- xor_lw value ^ lastval
- bra_z label
+chkval macro chkval_lastval, chkval_value, chkval_label
+ xor_lw chkval_value ^ chkval_lastval
+ bra_z chkval_label
endm
-near_i2csu_section code
+near_i2csu code
;----------
s_write_slurpbyte macro
;======================================================================
- include panic.fin
- include i2clib.inc
+ include program+externs.fin
+ include i2clib.inc
- end
+ end