?? wreeprom.s
字號:
;******************************************************************************
; 文件名:WREEPROM.S
; 功能:使用硬件I2C對CSI24WC02進行讀寫操作。若操作失敗,則進行報警。
; 使用查詢方式操作I2C。
; 說明:將跳線器JP9、J4_LED4短接。
;******************************************************************************
INCLUDE LPC2294.INC
EXPORT MAIN
I2C_BASE EQU 0xE001C000
LEDCON EQU (1<<25) ; LED4控制,用于報警顯示
CSI24WC02 EQU 0xA0 ; 定義CSI24WC02從地址
RDBUF EQU 0x40002F00 ; 數據接收緩沖區
AREA WREEPROMC,CODE,READONLY
CODE32
MAIN LDR SP,=0x40003000 ; 設置堆棧指針SP
LDR R0,=PINSEL0 ; 設置I2C控制口有效
MOV R1,#0x50
STR R1,[R0]
LDR R0,=IO0DIR ; 設置LED4控制口為輸出
MOV R1,#LEDCON
STR R1,[R0]
BL SYSCLK_INI ; 設置系統時鐘
LDR R0,=I2C_BASE
MOV R1,#14
STR R1,[R0,#0x10] ; I2SCLH=14
STR R1,[R0,#0x14] ; I2SCLL=14
; 寫EEPROM
MOV R2,#CSI24WC02 ; 器件從地址
MOV R3,#0x00 ; 存儲地址
LDR R4,=WRDATA ; 所要寫的數據地址指針
MOV R5,#5 ; 設置寫入EEPROM的數據個數
BL IWRNBYTE ; 調用IWRNBYTE
BL DELAYS ; 延時,等待寫周期結束
; 讀出并校驗
MOV R2,#CSI24WC02 ; 器件從地址
MOV R3,#0x00 ; 存儲地址
LDR R4,=RDBUF ; 保存數據的緩沖區地址指針
MOV R5,#5 ; 讀出數據個數
BL IRDNBYTE ; 調用IRDNBYTE
LDR R0,[R4] ; 取出數據
CMP R0,#0x58
BLNE EEPROM_ERR ; 寫出錯,報警
LDR R0,=IO0CLR
MOV R1,#LEDCON
STR R1,[R0] ; LED4控制I/O復位,即LED4點亮
B .
;******************************************************************************
; 名稱:SYSCLK_INI
; 功能:設置系統時鐘。(M值為4,P值為2)
; 入口參數:無
; 出口參數:無
; 占用資源:R0、R1
;******************************************************************************
SYSCLK_INI
LDR R0,=VPBDIV
MOV R1,#0x00
STR R1,[R0] ; VPBDIV=0x00
LDR R0,=PLLCFG
MOV R1,#0x23
STR R1,[R0] ; PLLCFG=0x23,設置M值為4,P值為2
LDR R0,=PLLCON
MOV R1,#0x01
STR R1,[R0] ; PLLCON=0x01
LDR R0,=PLLFEED
MOV R1,#0xAA
STR R1,[R0] ; PLLFEED=0xAA
MOV R1,#0x55
STR R1,[R0] ; PLLFEED=0x55
WAIT_OK LDR R0,=PLLSTAT
LDR R1,[R0]
ANDS R1,R1,#0x0400
BEQ WAIT_OK ; 等待PLL鎖定
LDR R0,=PLLCON
MOV R1,#0x03
STR R1,[R0]
LDR R0,=PLLFEED
MOV R1,#0xAA
STR R1,[R0]
MOV R1,#0x55
STR R1,[R0]
MOV PC,LR
;******************************************************************************
; 名稱:EEPROM_ERR
; 功能:出錯報警。本程序一直閃動LED報警。
; 入口參數:無
; 出口參數:無
; 占用資源:R0、R1、R7
;******************************************************************************
EEPROM_ERR
EEPROMER_L1 MOV R1,#LEDCON ; 設置GPIO控制參數
LEDSET LDR R0,=IO0SET
STR R1,[R0] ; LED4控制I/O置位,即LED4熄滅
BL DELAYS
LEDCLR LDR R0,=IO0CLR
STR R1,[R0] ; LED4控制I/O復位,即LED4點亮
BL DELAYS
B EEPROMER_L1
;******************************************************************************
; 名稱:DELAYS
; 功能:軟件延時
; 入口參數:無
; 出口參數:無
; 占用資源:R7
;******************************************************************************
DELAYS
MOV R7,#0x000FF000 ; 延時參數
DELAYS_L1 SUBS R7,R7,#1 ; R7 = R7-1
BNE DELAYS_L1 ; 判斷R7-1結果是否為0,若不為0則跳轉
MOV PC,LR ; 返回
ALIGN ; 數據字對齊
LTORG ; 聲明文字池
WRDATA DCD 0x58, 0x59, 0x60, 0x61, 0x62, 0x00
;******************************************************************************
; 名稱:START_I2C
; 功能:起動總線
; 入口參數:無
; 出口參數:無
; 占用資源:R0、R1
;******************************************************************************
START_I2C
LDR R0,=I2C_BASE
MOV R1,#0x2C
STR R1,[R0,#0x18] ; 清除所有標志位(I2CONCLR=0x2C)
MOV R1,#0x40
STR R1,[R0] ; 設置為主機(I2CONSET=0x40)
MOV R1,#0x60
STR R1,[R0] ; 起動總線,AA=0
START_I2CL1 LDR R1,[R0] ; 等待SI為1
ANDS R1,R1,#0x08
BEQ START_I2CL1
MOV PC,LR ; 返回
;******************************************************************************
; 名稱:SENDBYTE
; 功能:發送一字節數據
; 入口參數:R2 要發送的數據,低8位有效
; 出口參數:無
; 占用資源:R0、R1、R2
;******************************************************************************
SENDBYTE
LDR R0,=I2C_BASE
STR R2,[R0,#0x08] ; 發送數據,I2DAT=data
MOV R1,#0x28
STR R1,[R0,#0x18] ; 清除標志位STA,SI(I2CONCLR=0x28)
SENDBYTE_L1 LDR R1,[R0] ; 等待SI為1
ANDS R1,R1,#0x08
BEQ SENDBYTE_L1
MOV PC,LR
;******************************************************************************
; 名稱:RCVBYTE_NA
; 功能;接上I2C總線上一字節數據,并發送非應答位
; 入口參數:無
; 出口參數:R2 讀出的數據
; 占用資源;R0、R1、R2
;******************************************************************************
RCVBYTE_NA
LDR R0,=I2C_BASE
MOV R1,#0x0C
STR R1,[R0,#0x18] ; 清零AA,即發送非應答位. 同時清除SI,允許接收數據(I2CONCLR=0x0C)
RCVBYTE_NAL1
LDR R1,[R0] ; 等待SI為1
ANDS R1,R1,#0x08
BEQ RCVBYTE_NAL1
LDR R2,[R0,#0x08] ; 讀取接收到的數據
MOV PC,LR
;******************************************************************************
; 名稱:RCVBYTE_A
; 功能;接上I2C總線上一字節數據,并發送應答位
; 入口參數:無
; 出口參數:R2 讀出的數據
; 占用資源;R0、R1、R2
;******************************************************************************
RCVBYTE_A
LDR R0,=I2C_BASE
; 置位AA,即發送應答位. 同時清除SI,允許接收數據(I2CONCLR=0x08)
MOV R1,#0x04
STR R1,[R0]
MOV R1,#0x08
STR R1,[R0,#0x18]
RCVBYTE_AL1 LDR R1,[R0] ; 等待SI為1
ANDS R1,R1,#0x08
BEQ RCVBYTE_AL1
LDR R2,[R0,#0x08] ; 讀取接收到的數據
MOV PC,LR
;******************************************************************************
; 名稱:STOP_I2C
; 功能:結束總線
; 入口參數:無
; 出口參數:無
; 占用資源:R0、R1
;******************************************************************************
STOP_I2C
LDR R0,=I2C_BASE
MOV R1,#0x2C
STR R1,[R0,#0x18] ; 清除標志位STA,SI。(I2CONCLR=0x2C)
MOV R1,#0x50
STR R1,[R0] ; 發送結束總線信號
MOV PC,LR
;******************************************************************************
; 名稱:IWRBYTE
; 功能:向指定從機,發送一字節數據。(無子地址)
; 入口參數:R2 從要地址
; R3 所要發送的數據
; 出口參數:無
; 占用資源:R0、R1、R2、R3
;******************************************************************************
IWRBYTE
STMFD SP!,{R0-R7,LR}
BL START_I2C ; 起動總線
BL SENDBYTE ; 發送從機地址
MOV R2,R3
BL SENDBYTE ; 發送數據
BL STOP_I2C ; 結束總線
LDMFD SP!,{R0-R7,PC} ; 返回操作
;******************************************************************************
; 名稱:IWRNBYTE
; 功能:向指定從機,發送多字節數據。
; 入口參數:R2 從要地址
; R3 子地址
; R4 要發送的數據的地址指針
; R5 要發送的數據個數
; 出口參數:無
; 占用資源:R0、R1、R2、R3、R4、R5
;******************************************************************************
IWRNBYTE
STMFD SP!,{R0-R7,LR}
CMP R5,#0 ; 參數過濾,若發送個數為0,則直接退出
BEQ IWRNBYTE_END
BL START_I2C ; 起動總線
BL SENDBYTE ; 發送從機地址
MOV R2,R3
BL SENDBYTE ; 發送子地址
IWRNBYTE_L1 LDR R2,[R4],#4 ; 讀取要發送的數據,且R4 = R4 + 4
BL SENDBYTE ; 發送數據
SUBS R5,R5,#1
BNE IWRNBYTE_L1
BL STOP_I2C ; 結束總線
IWRNBYTE_END
LDMFD SP!,{R0-R7,PC} ; 返回操作
;******************************************************************************
; 名稱:IRDBYTE
; 功能:向指定從機讀取一字節數據。(無子地址)
; 入口參數:R2 從要地址
; 出口參數:R2 讀出的數據
; 占用資源:R0、R1、R2
; 說明:本程序會對從機地址進行自動加1處理
;******************************************************************************
IRDBYTE
STMFD SP!,{R0,R1,R3-R7,LR}
ADD R2,R2,#1 ; 設置為讀操作
BL START_I2C ; 起動總線
BL SENDBYTE ; 發送從機地址
BL RCVBYTE_NA ; 接收1字節數據,并發送非應答位
BL STOP_I2C ; 結束總線
LDMFD SP!,{R0,R1,R3-R7,PC} ; 返回操作
;******************************************************************************
; 名稱:IRDNBYTE
; 功能:向指定從機讀取多字節數據。
; 入口參數:R2 從要地址
; R3 子地址
; R4 要接收的數據的地址指針
; R5 要發送的數據個數
; 出口參數:無
; 占用資源:R0、R1、R2、R3、R4、R5、R6
; 說明:本程序會對從機地址進行自動加1處理
;******************************************************************************
IRDNBYTE
STMFD SP!,{R0-R7,LR}
CMP R5,#0 ; 入口參數過濾,若操作數據個數為0,直接退出
BEQ IRDNBYTE_END
BL START_I2C ; 起動總線
BL SENDBYTE ; 發送從機地址
MOV R6,R2 ; 暫存從機地址
MOV R2,R3
BL SENDBYTE ; 發送子地址
MOV R2,R6
BL START_I2C ; 重新啟動總線
ADD R2,R2,#1
BL SENDBYTE ; 發送從機地址
IRDNBYTE_L2 CMP R5,#1
BLNE RCVBYTE_A
BLEQ RCVBYTE_NA
STR R2,[R4],#4 ; 保存讀出的數據
SUBS R5,R5,#1
BNE IRDNBYTE_L2 ; 判斷是否讀完畢
BL STOP_I2C ; 結束總線
IRDNBYTE_END
LDMFD SP!,{R0-R7,PC}
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -