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

📄 i2cflash.asm

📁 cypress cy3721做的外部无线结点。感知温度后将温度值反给中心结点。
💻 ASM
📖 第 1 页 / 共 2 页
字号:
   push A 


   // Setup parameters for call
   // LSB to structure is already in X
IF (SYSTEM_LARGE_MEMORY_MODEL)
   mov  A,reg[STK_PP]
ELSE
   mov  A,0x00     // Save MSB
ENDIF


   lcall bFlashWriteBlock
;IF (EzI2Cs_LARGE_FLASH)
;   add   SP,-8     // Fixup the stack
;ELSE
;   add   SP,-7     // Fixup the stack
;ENDIF
   add   SP,-FLASH_WRITE_STRUCT_SIZE 
  //  Translate user block to system block address
   //  Call flash write routine.
   //  Set status byte RAM_Buffer[64]
   //  Release I2C bus (ACK/NAK)
   jmp  .ACK_CMD                                                     ; Command executed without errors.

   ;=================================================================
   ;   Reset             
   ;=================================================================
.CK_Reset_CMD:
   cmp  [EzI2Cs_bFLASH_CMD],I2C_FLASH_RESET_CMD                      ; Check for Reset command.
   jnz  .CK_EnterFlashMode_CMD

   cmp  [EzI2Cs_bFLASH_Param],I2C_FLASH_RESET_KEY1
   jnz  .NAK_CMD                                                     ; Key doesn't match, bail  

   cmp  [EzI2Cs_bROM_RWoffset],I2C_FLASH_RESET_KEY0
   jnz  .NAK_CMD                                                     ; Data Pointer "Key2" doesn't match, bail  

   // Release I2C bus (ACK/NAK)
   SetEzI2Cs_SCR ( EzI2Cs_SCR_ACK )                                  ; ACK Command
   ljmp  0x0000              ; Reset


.CK_NORMAL_MODE:

   ;=================================================================
   ;   Enter Flash Mode
   ;=================================================================
.CK_EnterFlashMode_CMD:
   cmp  [EzI2Cs_bFLASH_CMD],I2C_ENTER_FLASH_MODE_CMD                 ; Check for RESET command
   jnz  .CK_ShowBlock_CMD
   cmp  [EzI2Cs_bFLASH_Param],I2C_ENTER_FLASH_MODE_KEY1
   jnz  .NAK_CMD                                                     ; Key doesn't match, bail  
   cmp  [EzI2Cs_bROM_RWoffset],I2C_ENTER_FLASH_MODE_KEY0
   jnz  .NAK_CMD                                                     ; Data Pointer "Key2" doesn't match, bail  
   // Clear all interrupts except I2C interrupt
    mov  reg[INT_MSK0],0x00
    mov  reg[INT_MSK1],0x00


   // Create 65 byte buffer is free space
   // Move stack in clear area

   mov  A,< EzI2Cs_varPage                                           ; Get LSB of variable
   and  A,0xC0                                                       ; Mask off all but 2 MSb
.REGION0:                                                       ; I2C UM memory between 0x00 - 0x3F
   cmp  A,0x00
   jnz  .REGION1
   mov  [EzI2Cs_pRAM_Buf_Addr_LSB],0xA0                              ; Place RAM Buffer 0xA0
   mov  A,0x58                                                       ; Place Stack at   0x58
   jmp  .SET_STACK

.REGION1:                                                       ; I2C UM memory between 0x40 - 0x7F
   cmp  A,0x40
   jnz  .REGION2
   mov  [EzI2Cs_pRAM_Buf_Addr_LSB],0xB0                              ; Place RAM Buffer 0xB0
   mov  A,0x00                                                       ; Place Stack at   0x00
   jmp  .SET_STACK

.REGION2:                                                       ; I2C UM memory between 0x80 - 0xBF
   cmp  A,0x80
   jnz  .REGION3
   mov  [EzI2Cs_pRAM_Buf_Addr_LSB],0x00                              ; Place RAM Buffer 0x00
   mov  A,0x50                                                       ; Place Stack at   0x50
   jmp  .SET_STACK

.REGION3:                                                       ; I2C UM memory between 0xC0 - 0xFF
   mov  [EzI2Cs_pRAM_Buf_Addr_LSB],0x00                              ; Place RAM Buffer 0x00
   mov  A,0x80                                                       ; Place Stack at   0x80

.SET_STACK:
   swap A,SP

.SET_BUF_SIZE:   
   mov  [EzI2Cs_bRAM_Buf_Size],0x41                                  ; Set buffer to 65 bytes
   mov  [EzI2Cs_bRAM_Buf_WSize],0x40                                 ; Set R/W area to 64 bytes
   mov  [EzI2Cs_bROM_Buf_Size],0x40                                  ; Make sure ROM window is 64 bytes
 
 
IF (SYSTEM_LARGE_MEMORY_MODEL)
   REG_RESTORE CUR_PP           ; Restore Current Page Pointer
   REG_RESTORE IDX_PP           ; Restore Index Page Pointer
ENDIF
  
   // preload the stack so that an rti will take program
   // execution to the Flash main routine.
//   RAM_CHANGE_PAGE_MODE( FLAG_PGMODE_11b )  // 00
   mov  A,>EzI2Cs_FLASH_Main                                         ; Push PCH
   push A
   mov  A,<EzI2Cs_FLASH_Main                                         ; Push PCL
   push A
   mov  A,0xC1                                                       ; Push Flags, with Interrupts enabled
   push A

   // Clear stack (force return to FLASH_MAIN)
   // Release I2C bus (ACK/NAK)
   or [EzI2Cs_bState],FLASH_MODE_FLAG                                ; Set FLASH mode bit
   SetEzI2Cs_SCR ( EzI2Cs_SCR_ACK )                                  ; Release I2C bus (ACK/NAK)
   
   reti    // Return to Flash Main, NOT where we came from!!!


   ;=================================================================
   ;   Show Block
   ;=================================================================
.CK_ShowBlock_CMD:
   cmp  [EzI2Cs_bFLASH_CMD],I2C_FLASH_SHOW_BLOCK_CMD
   jnz  .NAK_CMD
   // Check for block range 0 to n  (Max n-1)
   mov  A,(EzI2Cs_BlocksUsed - 1)                                    ; Load block count -1
   sub  A,[EzI2Cs_bFLASH_Param]
   jc   .NAK_CMD                                                     ; Block index out of range

   mov  [EzI2Cs_pROM_Buf_Addr_MSB],>EzI2Cs_FirstBlock                ; Put MSB of start block ID
                                                                     ; in MSB of Buffer address.
   mov  A,<EzI2Cs_FirstBlock                                         ; Get LSB of first block
   add  A,[EzI2Cs_bFLASH_Param]                                      ; Add the block offset (parameter)
   mov  [EzI2Cs_pROM_Buf_Addr_LSB],A                                 ; Load the LSB of the ROM pointer
   adc  [EzI2Cs_pROM_Buf_Addr_MSB],0x00                              ; Update MSB of buffer address (add with carry)

   
   asl  [EzI2Cs_pROM_Buf_Addr_LSB]                                   ; Convert from blocks to address (mult by 64)
   rlc  [EzI2Cs_pROM_Buf_Addr_MSB]                                   ; Shift left 6 times.

   asl  [EzI2Cs_pROM_Buf_Addr_LSB]
   rlc  [EzI2Cs_pROM_Buf_Addr_MSB]

   asl  [EzI2Cs_pROM_Buf_Addr_LSB]
   rlc  [EzI2Cs_pROM_Buf_Addr_MSB]

   asl  [EzI2Cs_pROM_Buf_Addr_LSB]
   rlc  [EzI2Cs_pROM_Buf_Addr_MSB]

   asl  [EzI2Cs_pROM_Buf_Addr_LSB]
   rlc  [EzI2Cs_pROM_Buf_Addr_MSB]

   asl  [EzI2Cs_pROM_Buf_Addr_LSB]
   rlc  [EzI2Cs_pROM_Buf_Addr_MSB]

   mov  [EzI2Cs_bROM_Buf_Size],0x40                                  ; Make sure ROM window is 64 bytes
   jmp  .ACK_CMD                                                     ; Command executed without errors.



.NAK_CMD:
   mov  A,0x00   // Command good
   jmp  EzI2Cs_Execute_CMD_End

.ACK_CMD:
   mov  A,0x01   // Command good

 EzI2Cs_Execute_CMD_End:
   ret



;-----------------------------------------------------------------------------
;  FUNCTION NAME: EzI2Cs_Flash_Main
;
;  DESCRIPTION:
;     Execute flash command
;
;-----------------------------------------------------------------------------
;
;  ARGUMENTS: none
;
;  RETURNS: none
;
;  SIDE EFFECTS: REGISTERS ARE VOLATILE: THE A AND X REGISTERS MAY BE MODIFIED!
;
;  THEORY of OPERATION or PROCEDURE:
;

 EzI2Cs_FLASH_Main:

// Use only page zero
// Calculate where Flash RAM array can exist
// Create 64 byte array plus 1 status byte  ( 65 bytes )
// Set I2C RAM pointer to above array
// Move 

TO_CNTR_MSB:  equ  0
TO_CNTR_ISB:  equ  1
TO_CNTR_LSB:  equ  2

   
   mov  X,SP      // Clear the time-out counter
   add  SP,3      // Add three byte for a variable


   // Time-Out counter will

.INIT_TO_CNTR:   // Init Timeout counter to 0x00000000
                 // Reset if timer gets to  0x01000000
   mov  [X+TO_CNTR_MSB], 0xE8
   mov  [X+TO_CNTR_ISB], 0x00
   mov  [X+TO_CNTR_LSB], 0x00  
   

.Flash_Loop:  
   nop
   nop                                                       ; Do nothing loop
IF (I2C_FLASH_AUTO_TIMEOUT)
   push   X
   lcall  EzI2Cs_GetActivity
   pop    X
   cmp    A,0x00
   jz     .IncTimer
   jmp    .INIT_TO_CNTR

.IncTimer:

   mov    A,0
   inc    [X+TO_CNTR_LSB]
   adc    [X+TO_CNTR_ISB],A
   adc    [X+TO_CNTR_MSB],A

   jnc   .Flash_Loop

   M8C_Reset                                                     ; Jump back to Reset Vector

ELSE
   jnc   .Flash_Loop
ENDIF

ELSE
   mov  A,0x00          ; Invalid command
   ret                  ; If Flash not used, just return
ENDIF

ELSE  ; Flash interface not enabled
   ret
ENDIF
; end of file EzI2CsINT.asm

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -