From: ian Date: Tue, 20 Dec 2005 18:51:44 +0000 (+0000) Subject: allow i2cm_write_start in Reading-Wait; initial cut X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ijackson/git?a=commitdiff_plain;h=2de36763edee3cc7ce43319eae439de3762db20b;p=trains.git allow i2cm_write_start in Reading-Wait; initial cut --- diff --git a/detpic/i2clib.asm b/detpic/i2clib.asm index c711bad..edda8e8 100644 --- a/detpic/i2clib.asm +++ b/detpic/i2clib.asm @@ -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 diff --git a/detpic/i2clib.inc b/detpic/i2clib.inc index f05f2e6..479ab03 100644 --- a/detpic/i2clib.inc +++ b/detpic/i2clib.inc @@ -123,30 +123,36 @@ ; 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 @@ -173,7 +179,7 @@ ; 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 @@ -220,7 +226,7 @@ ; 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 diff --git a/detpic/morse.messages b/detpic/morse.messages index c4926f0..7166fd0 100644 --- a/detpic/morse.messages +++ b/detpic/morse.messages @@ -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