From: ian Date: Tue, 20 Dec 2005 14:10:29 +0000 (+0000) Subject: major overhaul of i2c slave to not watch for end of transactions X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ijackson/git?a=commitdiff_plain;h=b26dfdc914e82e0081592138d18fc565e8d730a4;p=trains.git major overhaul of i2c slave to not watch for end of transactions --- diff --git a/detpic/Makefile b/detpic/Makefile index 6a05a0a..db272fb 100644 --- a/detpic/Makefile +++ b/detpic/Makefile @@ -9,21 +9,25 @@ OBJS_program= vectors.o panic.o routines-led.o i2clib.o \ XCODEN_program= morse XCODE1_program= blank2 ours+pindata -INCLUDES= common.inc \ +INCLUDES= \ + ../iwjpictest/clockvaries.inc \ + common.inc \ + detect.inc \ final.inc \ i2clib.inc \ + i2clib.incm \ + master.inc \ misc.fin \ + nmra-stream.fin \ panic.fin \ panic.inc \ - routines-led.fin \ - ../iwjpictest/clockvaries.inc \ - vectors.fin \ - program+clocks.inc \ pindata.inc \ - detect.inc \ points.fin \ + program+clocks.inc \ program.fin \ - reverse.fin + reverse.fin \ + routines-led.fin \ + vectors.fin \ VARSFILES= variables diff --git a/detpic/common.inc b/detpic/common.inc index 9e2dc31..5deed75 100644 --- a/detpic/common.inc +++ b/detpic/common.inc @@ -15,6 +15,7 @@ clock equ -1 include variables+vars.inc include pindata.inc include program+clocks.inc + include i2clib.incm ;---------------------------------------------------------------------- ; Common conventions for function register notation: diff --git a/detpic/detect.asm b/detpic/detect.asm index f3ed1ca..9b28b16 100644 --- a/detpic/detect.asm +++ b/detpic/detect.asm @@ -153,6 +153,21 @@ slave_add_short_message intrh_unmask return +;---------- +backgroundloop_again macro backgroundloop_whatever + local branchposition + inc_f_ifnz unattendedl + bra backgroundloop_whatever + mov_lw branchposition - backgroundloop_whatever +branchposition + add_wff unattendedh + bra_nc backgroundloop_whatever + inc_f_ifz unattendedu + call led_red + bra backgroundloop_whatever + endm + +near_i2csu_section code ;---------- i2csu_read_begin ; called from High ISR, see i2clib.inc @@ -168,27 +183,13 @@ i2csu_read_another bt_f_if1 picno,picno_panicd bra i2csu_read_another_panicd mov_fw POSTINC2 - call i2cs_read_data + i2cs_read_data_macro mov_fw outmsg_end cmp_fw_ifle FSR2L return ; oops panic morse_DR -;---------- -backgroundloop_again macro backgroundloop_whatever - local branchposition - inc_f_ifnz unattendedl - bra backgroundloop_whatever - mov_lw branchposition - backgroundloop_whatever -branchposition - add_wff unattendedh - bra_nc backgroundloop_whatever - inc_f_ifz unattendedu - call led_red - bra backgroundloop_whatever - endm - ;====================================================================== ; main detection bit-twiddling @@ -277,7 +278,7 @@ i2csu_read_begin_detectors and_lw 0x4f ; W zz 05 zz zz 10 13 16 08 ior_wfw buf0 ; W MM 05 B2 B1 10 13 16 08 - call i2cs_read_data + i2cs_read_data_macro rcall new_i2c_outmsg diff --git a/detpic/i2clib.asm b/detpic/i2clib.asm index f8091de..c711bad 100644 --- a/detpic/i2clib.asm +++ b/detpic/i2clib.asm @@ -11,6 +11,7 @@ clock equ 0 include ../iwjpictest/clockvaries.inc include panic.inc include morse+auto.inc + include i2clib.incm ;====================================================================== ; NOTATION @@ -416,19 +417,20 @@ init_enable return ;======================================== -; SLAVE - INTERRUPT HANDLING - +; SLAVE +; ; In general, we figure out our state and then see what kind of events ; we were expecting. Bits we want to check: -; 80 60 20 10 08 04 02 01 +; 80 40 20 10 08 04 02 01 ; SMP CKE D_A P S R_W UA BF ; set clr data? stop start read? clr full? ; (we don't usually mention SMP, CKE and UA below) - +; ; Labels of the form s_event_* are branches of the interrupt ; handler and are supposed to finish with return. -; Some macros: +;---------- +; Macros: chkvals_start and chkval chkvals_start macro what mov_fw what @@ -439,144 +441,64 @@ chkval macro lastval, value, label bra_z label endm -chkvals_addrrecv macro lastval - chkval lastval, 0x8c, s_event_idle_addrrecvread ; A,!P, S,R,!BF - chkval 0x8c, 0x89, s_event_idle_addrrecvwrite ; A,!P, S,W,BF - endm -chkvals_addrrecv_lastval equ 0x89 +near_i2csu_section code ;---------- -i2cs_interrupt ; 4cy interrupt latency + 3cy until branch to here - bt_f_if0 PIR1, SSPIF - bra s_event_bad_intr - ; We have an interrupt: - -; Firstly, clear the interrupt flag so that if something else happens -; while we faff, the interrupt will be regenerated: - bc_f PIR1, SSPIF - - mov_ff st, st_orig - - mov_lw (1<[Receiving] [Transmit-Wait]<-. | -; `-----' | | | | -; write_another | |read_data | | -; | V | | -; | [Transmit-Busy] | | -; | | `------' | -; | | read_another | -; | | | -; | |read_done | -; write_done| \ | -; `---------+->---------------------' +; | +; V +; [Idle] +; | +; |<----------------------------. +; + | +; / \ | +; / \ | +; write_begin/ \read_begin | +; / \ | +; V V | +; ,->[Receiving] [Transmit-Wait]<-. | +; `-----' | | | | +; write_data | |read_data | | +; | V | | +; | [Transmit-Busy] | | +; | | `------' | +; | | read_another | +; | \ | +; `----------+->---------------------' ;======================================== ; SLAVE - WRITES (ie, reception of data from the master) @@ -286,32 +290,22 @@ extern i2csu_write_begin ; ; Called to notify the main program that the master PIC has selected this -; slave to talk to, for writing. Provides the first byte of data -; we received from the master PIC. +; slave to talk to, for writing. There is no data at this stage; when +; data is received, i2csu_write_data will be called. ; ; Beforehand At call On return ; State Idle Receiving Receiving -; W data from master any ;-------------------- - extern i2csu_write_another + extern i2csu_write_data ; -; Called to notify the main program that the master PIC has continued -; by transmitting another byte of data. Provides the byte we received. +; Called to notify the main program that the master PIC has +; transmitted a byte of data. Provides the byte we received. ; ; Beforehand At call On return ; State Receiving Receiving Receiving ; W data from master any -;-------------------- - extern i2csu_write_done -; -; Called to notify the main program that the master PIC has stopped -; transmitting data (ie, finished the i2c conversation). -; -; Beforehand At call On return -; State Receiving Idle - ;======================================== ; SLAVE - READS (ie, transmission of data to the master) @@ -319,14 +313,13 @@ extern i2csu_read_begin ; ; Called to notify the main program that the master PIC has selected -; this slave to talk to, for reading. The main program should call +; this slave to talk to, for reading. The main program should invoke ; i2cs_read_data with first byte of data that we should transmit to ; the master. ; ; Beforehand At call ; State Idle Transmit-Wait - ;-------------------- extern i2cs_read_data ; Transmits the byte of data to the master @@ -334,22 +327,16 @@ ; Beforehand At call On return ; State Transmit-Wait Transmit-Busy Transmit-Busy ; W byte for master any +; +; There is also a macro i2cs_read_data_macro +; in i2clib.incm, which does the same thing. ;-------------------- extern i2csu_read_another ; ; Called to notify the main program that the master PIC has continued ; by asking for another byte of data. The main program should once -; more call i2cs_read_data. +; more invoke i2cs_read_data. ; ; Beforehand At call ; State Transmit-Busy Transmit-Wait - -;-------------------- - extern i2csu_read_done -; -; Called to notify the main program that the master PIC has stopped -; asking for data (ie, finished receiving). -; -; Beforehand At call On return -; State Transmit-Busy Idle diff --git a/detpic/i2clib.incm b/detpic/i2clib.incm new file mode 100644 index 0000000..344e217 --- /dev/null +++ b/detpic/i2clib.incm @@ -0,0 +1,9 @@ +;====================================================================== +; MACROS FOR I2CLIB USERS +; see i2clib.inc + +;-------------------- +i2cs_read_data_macro macro + mov_wf SSPBUF + bs_f SSPCON1, CKP + endm diff --git a/detpic/morse.messages b/detpic/morse.messages index 34c15e4..9a23460 100644 --- a/detpic/morse.messages +++ b/detpic/morse.messages @@ -48,7 +48,7 @@ UE # Messages for i2clib, S* SM i2clib:st,:sspstat,:sspcon1,:sspcon2 ; m.,i., ctrlr bad state -SS i2clib:st,SSPSTAT,SSPCON1,:st_orig ; s.,i., controller 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 diff --git a/detpic/slave.asm b/detpic/slave.asm index 76345f4..1614b2c 100644 --- a/detpic/slave.asm +++ b/detpic/slave.asm @@ -31,7 +31,10 @@ slave ;---------- i2csu_write_begin -i2csu_write_another + return + +;---------- +i2csu_write_data call led_green bt_f_if1 picno,picno_panicd @@ -52,11 +55,6 @@ i2csu_write_if_special bra i2csu_write_if_bad goto panic_crashread_commanded -;---------- -i2csu_read_done -i2csu_write_done - return ; fixme make it not call these any more - ;---------- slave_interrupt_low enter_interrupt_low