⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 big.psm

📁 用FPGA做主控制器
💻 PSM
📖 第 1 页 / 共 4 页
字号:
;
;
;      ////////////////////////////////
;     //                            //
;    // 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 + -