📄 test24c256.s43
字号:
;IIC器件的测试程序
;使用器件为24C01
;硬件连接为P4.2,P4.7
#include "msp430x13x.h"
RXTXI2C equ 202h
DataConv equ 203h
ADDRI2C1 equ 204h
ADDRI2C0 EQU 205H
DATAI2C equ 206h
BITI2C equ 207h
ScndBlck equ 208h
STARPAGEI2C EQU 220H
Pagecount EQU 20AH
#define BitCnt R5
SDA equ 004h
SCL equ 080h
Code equ 0A0h
Bitime_5 equ 0064
Bitime equ 0128
Delta equ 150
RXD set 004h
TXD set 002h
LF equ 0ah
CR equ 0dh
R_I2C EQU 210H
ORG 0F000h ;
RESET mov.w #300h,SP
MAIN MOV.B r7, ADDRI2C0 ;要写入的器件内部地址
MOV.B r6, ADDRI2C1
MOV.B r8, DATAI2C ;要写入的具体数据
CALL #Write_I2C ;
MOV #01FFFH,R15
DLY0 DEC R15
JNZ DLY0 ;延时,等待写周期的结束
MOV.B r7,ADDRI2C0
MOV.B r6, ADDRI2C1
CALL #Read_I2C ;读出刚写入的数据
mov.b R_I2C,r9
JMP MAIN
I2CDLY NOP ;延时
NOP
NOP
NOP
NOP
NOP
RET
Wrpage_I2C mov.b #Code,RXTXI2C ; 页写
add.b #0,RXTXI2C ;
call #I2C_Start
mov.b ADDRI2C1,RXTXI2C
call #I2C_TX
mov.b ADDRI2C0,RXTXI2C
call #I2C_TX
mov.b #64,Pagecount
mov.b #0,r15
Wrpage mov.b STARPAGEI2C(R15),RXTXI2C
call #I2C_TX
INC R15
DEC.B Pagecount
jnz Wrpage
call #I2C_Stop
ret
Read_I2C mov.b #Code,RXTXI2C ; 在具体的IIC器件中读某一个地址的数据
add.b #0,RXTXI2C ;
call #I2C_Start
mov.b ADDRI2C1,RXTXI2C
call #I2C_TX
mov.b ADDRI2C0,RXTXI2C
call #I2C_TX
mov.b #Code,RXTXI2C
add.b #1,RXTXI2C
bis.b #01h,RXTXI2C
call #I2C_Start
call #I2C_Read
call #I2C_Stop
ret
;-------------------------------------------------------------------------------
I2C_Start bic.b #SCL+SDA,&P4DIR ; 启动总线
bis.b #SDA,&P4DIR
bis.b #SCL,&P4DIR
CALL #I2CDLY
;-------------------------------------------------------------------------------
I2C_TX mov.b #08,BITI2C ; 向总线发送一个字节的数据
I2C_Send rla.b RXTXI2C
jc I2C_Send1
I2C_Send0 bis.b #SDA,&P4DIR
jmp I2C_Sx
I2C_Send1 bic.b #SDA,&P4DIR
I2C_Sx bic.b #SCL,&P4DIR
nop
CALL #I2CDLY
nop
bis.b #SCL,&P4DIR
dec.b BITI2C
jnz I2C_Send
bic.b #SDA,&P4DIR
;-------------------------------------------------------------------------------
I2C_Ackn bic.b #SCL,&P4DIR ; 应答信号
nop
CALL #I2CDLY
nop
bis.b #SCL,&P4DIR
ret
;-------------------------------------------------------------------------------
I2C_Read mov.b #08,BITI2C ;从总线读一个字节数据
I2C_RX bic.b #SCL,&P4DIR
bit.b #SDA,&P4IN
rlc.b R_I2C
bis.b #SCL,&P4DIR
dec.b BITI2C
CALL #I2CDLY
jnz I2C_RX
jmp I2C_Ackn
;-------------------------------------------------------------------------------
I2C_Stop bis.b #SDA,&P4DIR ;停止总线
bic.b #SCL,&P4DIR
bic.b #SDA,&P4DIR
I2C_End ret
;-------------------------------------------------------------------------------
Write_I2C mov.b #Code,RXTXI2C ; 向某一个IIC器件的某一地址写入具体的数据
add.b #0,RXTXI2C
call #I2C_Start
mov.b ADDRI2C1,RXTXI2C ; 高地址
call #I2C_TX
mov.b ADDRI2C0,RXTXI2C ; 低地址
call #I2C_TX
mov.b DATAI2C,RXTXI2C ; 数据
call #I2C_TX
call #I2C_Stop
ret
ORG 0FFFEh
DW RESET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -