chiark / gitweb /
allow i2cm_write_start in Reading-Wait; initial cut
authorian <ian>
Tue, 20 Dec 2005 18:51:44 +0000 (18:51 +0000)
committerian <ian>
Tue, 20 Dec 2005 18:51:44 +0000 (18:51 +0000)
detpic/i2clib.asm
detpic/i2clib.inc
detpic/morse.messages

index c711bad3747a76374d63ba4e4d9c4d839906cbcd..edda8e840400c2afebc7f6166c57a1ba3b8098c1 100644 (file)
@@ -68,14 +68,14 @@ 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
 
@@ -154,12 +154,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,7 +172,7 @@ 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
@@ -239,10 +239,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 +273,6 @@ m_event_write_mustfinish
 
                bra     m_stop
 
-;----------
-m_improper_write_start
-               i2cpanic morse_SW
-
 ;----------
 m_improper_write_finish
                i2cpanic morse_SF
@@ -296,14 +292,16 @@ 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
                bra     i2cm_read_done
@@ -370,7 +368,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
 
index f05f2e62dfb23659bd1a4351f920a76f132c4869..479ab03037c770f37a06a05742330afa1cef86d7 100644 (file)
 ; 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
index c4926f0f933c55beac6ce46955f1ad6387a060fd..7166fd017de343f733666b625c474107fb14ab3a 100644 (file)
@@ -47,9 +47,8 @@ SM    i2clib:st,:sspstat,:sspcon1,:sspcon2 ; m.,i., ctrlr bad state
 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