📄 big.psm
字号:
;
;
; ////////////////////////////////
; // //
; // Values used in San Jose //
; // debug session //
; // //
; ////////////////////////////////
;
;
; encoder_NTSC: LOAD s0A,s11 ; device address
;
; LOAD s0B,00 ; sub address
; LOAD s0C,10 ; write data value
; CALL I2C_wr_rd ; write and then verify with read
;
; LOAD s0B,01 ; sub address
; LOAD s0C,3F ; write data value
; CALL I2C_wr_rd ; write and then verify with read
;
; LOAD s0B,02 ; sub address
; LOAD s0C,68 ; write data value
; CALL I2C_wr_rd ; write and then verify with read
;
; LOAD s0B,04 ; sub address
; LOAD s0C,40 ; write data value
; CALL I2C_wr_rd ; write and then verify with read
;
; LOAD s0B,05 ; sub address
; LOAD s0C,09 ; write data value
; CALL I2C_wr_rd ; write and then verify with read
;
; LOAD s0B,06 ; sub address
; LOAD s0C,01 ; write data value
; CALL I2C_wr_rd ; write and then verify with read
;
; LOAD s0B,07 ; sub address
; LOAD s0C,40 ; write data value
; CALL I2C_wr_rd ; write and then verify with read
;
; LOAD s0B,08 ; sub address
; LOAD s0C,04 ; write data value
; CALL I2C_wr_rd ; write and then verify with read
;
; LOAD s0B,23 ; sub address
; LOAD s0C,44 ; write data value
; CALL I2C_wr_rd ; write and then verify with read
;
; LOAD s0B,24 ; sub address
; LOAD s0C,20 ; write data value
; CALL I2C_wr_rd ; write and then verify with read
;
; LOAD s0B,35 ; sub address
; LOAD s0C,70 ; write data value
; CALL I2C_wr_rd ; write and then verify with read
;
; RETURN
;
; ///////////////////////////////////////////////////
; // //
; // The next routines comprise the I2C "Kernal" //
; // //
; ///////////////////////////////////////////////////
;-----------------------------------------------------------------------
;
; I2C Start
;
I2C_start: LOAD s01,01
OUTPUT s01,SCL_pid ; Release SCL (pulled high)
CALL dly_5us ; wait 5 usec
LOAD s01,00
OUTPUT s01,SDA_pid ; Assert SDA low
CALL dly_5us ; wait 5 usec
RETURN
;-----------------------------------------------------------------------
;
; write 8 bit value to I2C bus, enter routine with s0E = write data value
;
I2C_write: LOAD s02,08 ; load bit count
CALL report_to_chipscope
I2C_write_loop: LOAD s01,00 ;
OUTPUT s01,SCL_pid ; Assert SCL low
CALL dly_5us ; wait 5 usec
RL s0E ; s0hift bits
OUTPUT s0E,SDA_pid ; Assert SDA high or low
CALL dly_5us ; wait 5 usec
LOAD s01,01
OUTPUT s01,SCL_pid ; Release SCL (pulled high)
CALL dly_5us ; wait 5 usec
SUB s02,01 ; bit count - 1
JUMP Z,I2C_slave_ack ; done ? if s0o, leave
JUMP I2C_write_loop ; branch, send next bit
I2C_slave_ack: LOAD s01,00 ;
OUTPUT s01,SCL_pid ; Assert SCL low
CALL dly_5us ; wait 5 usec
LOAD s01,01
OUTPUT s01,SDA_pid ; Release SDA (pulled high)
CALL dly_5us ; wait 5 usec
INPUT s00,SDA_pid ; Read SDA
AND s00,01 ; mask upper bits off
ADD s00,00 ; set or reset Zero Flag
JUMP Z,I2C_write_done ; return if acknowledge
LOAD s0F,AA ; load s0F with error code
I2C_write_done: LOAD s01,01
OUTPUT s01,SCL_pid ; Release SCL (pulled high)
CALL dly_5us ; wait 5 usec
LOAD s01,00
OUTPUT s01,SCL_pid ; Assert SCL low
RETURN
;-----------------------------------------------------------------------
;
; read 8 bit value from I2C bus and ignore
;
I2C_read_ignore: LOAD s02,08 ; load bit count
LOAD s03,00 ;
LOAD s0E,00 ;
I2C_read_loop: LOAD s01,00 ;
OUTPUT s01,SCL_pid ; Assert SCL low
CALL dly_5us ; wait 5 usec
INPUT s03,SDA_pid ; Read SDA
OR s0E, s03 ; merge new data into s0E
LOAD s01,01
OUTPUT s01,SCL_pid ; Release SCL (pulled high)
CALL dly_5us ; wait 5 usec
SUB s02,01 ; bit count - 1
JUMP Z,I2C_master_ack ; done ? if s0o, leave
RL s0E ; s0hift bits
JUMP I2C_read_loop ; branch to routine start
I2C_master_ack: CALL report_to_chipscope
LOAD s01,00 ;
OUTPUT s01,SCL_pid ; Assert SCL low
CALL dly_5us ; wait 5 usec
LOAD s01,01 ; execute a "non-acknowledge"
OUTPUT s01,SDA_pid ; Release SDA (pulled high)
CALL dly_5us ; wait 5 usec
OUTPUT s01,SCL_pid ; Release SCL (pulled high)
CALL dly_5us ; wait 5 usec
LOAD s01,00
OUTPUT s01,SCL_pid ; Assert SCL low
RETURN
;-----------------------------------------------------------------------
;
; I2C Stop
;
I2C_stop: LOAD s01,00
OUTPUT s01,SCL_pid ; Assert SCL low
CALL dly_5us ; wait 5 usec
OUTPUT s01,SDA_pid ; Assert SDA low
CALL dly_5us ; wait 5 usec
LOAD s01,01
OUTPUT s01,SCL_pid ; Release SCL (pulled high)
CALL dly_5us ; wait 5 usec
OUTPUT s01,SDA_pid ; Assert SDA high
CALL dly_5us ; wait 5 usec
RETURN
; ////////////////////////////////
; // //
; // Routine used to write and //
; // then read an I2C location //
; // //
; ////////////////////////////////
;-----------------------------------------------------------------------
;
; chipscope s0hows address, sub address, and data value for both write
; and read
;
I2C_wr_rd: CALL I2C_start
LOAD s0E,s0A ; device address
AND s0E,FE ; set to write
CALL I2C_write
LOAD s0E,s0B ; device sub address
CALL I2C_write
LOAD s0E,s0C ; write value
CALL I2C_write
CALL I2C_stop
CALL I2C_start
LOAD s0E,s0A ; device address
AND s0E,FE ; set to write
CALL I2C_write
LOAD s0E,s0B ; device sub address
CALL I2C_write
CALL I2C_start ; repeated start
LOAD s0E,s0A ; device address
OR s0E,01 ; set to read
CALL I2C_write
CALL I2C_read_ignore ; check one value
CALL I2C_stop
RETURN
; /////////////////////////
; // //
; // Chipscope Routines //
; // //
; /////////////////////////
report_to_chipscope : OUTPUT s0E,debug_rg ; report data
RETURN
chipscope_on : LOAD s09,01 ; trigger = 1
OUTPUT s09,debug_trig
RETURN
chipscope_off : LOAD s09,00 ; trigger = 1
OUTPUT s09,debug_trig
RETURN
; ////////////////////////////
; // //
; // Miscellaneous Routines //
; // //
; ////////////////////////////
;-----------------------------------------------------------------------
;
; 5us s0oftware delay based on 27 MHz clock
;
dly_5us: CALL chipscope_off
LOAD s00,22 ; hex 22 = decimal 34
dly_148ns: SUB s00,01
JUMP NZ,dly_148ns
CALL chipscope_on
RETURN ; 34 X 148ns = usec
;-----------------------------------------------------------------------
;
; 1ms software delay based on 27 MHz clock
;
dly_100ms: CALL chipscope_off
LOAD s02,64 ; 64 hex, decimal 100
dly_1ms: LOAD s01,64 ; 64 hex, decimal 100
dly_10us: LOAD s00,44 ; 44 hex, decimal 68
dly_150ns: SUB s00,01
JUMP NZ,dly_150ns
SUB s01,01
JUMP NZ,dly_10us
SUB s02,01
JUMP NZ,dly_1ms
CALL chipscope_on
RETURN ; 148ns X 68 X 100 X 100 = 100msec
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -