chiark / gitweb /
Send HELLO as a result of all slaves being online. Do not crash if slave is slow...
[trains.git] / detpic / i2clib.asm
index c711bad3747a76374d63ba4e4d9c4d839906cbcd..09d995dbe56fcf6b69827b98ec76c71701b68525 100644 (file)
@@ -3,15 +3,14 @@
 ;
 ; 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
@@ -58,8 +57,8 @@ clock equ 0
 
                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
@@ -68,26 +67,19 @@ st          res     1
 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
@@ -154,12 +146,12 @@ i2cm_interrupt_definite
                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
 
@@ -172,19 +164,26 @@ m_event_bad
 ;----------
 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
@@ -202,7 +201,7 @@ 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
@@ -225,13 +224,15 @@ m_event_done_stopping
                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
@@ -239,10 +240,10 @@ m_improper_slave
 ;----------
 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
@@ -273,10 +274,6 @@ m_event_write_mustfinish
 
                bra     m_stop
 
-;----------
-m_improper_write_start
-               i2cpanic morse_SW
-
 ;----------
 m_improper_write_finish
                i2cpanic morse_SF
@@ -296,17 +293,20 @@ i2cm_read_start
                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
@@ -370,7 +370,8 @@ m_event_done_acking
 ; 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
 
@@ -410,8 +411,8 @@ init_enable
                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
@@ -432,16 +433,16 @@ init_enable
 ;----------
 ; 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
@@ -502,7 +503,7 @@ s_event_bad
 
 ;======================================================================
 
include panic.fin
- include i2clib.inc
 include program+externs.fin
 include i2clib.inc
 
- end
 end