test24C256.S43--liyilulihua简介:430单片机驱动EEPROM 关键字:msp430,24c256
;IIC器件的测试程序
;使用器件为24C01
;硬件连接为SCL=P1.4,SDA=P1.5
#include "msp430x14x.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 020h
SCL equ 010h
Code equ 0A2h
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
;******************************************************************************
RSEG CSTACK ; System stack
DS 0
;-----------------------------------------------------------------------------
RSEG CODE ; Program code;
Reset mov.w #300h,SP
llll
mov.b #0x00,&P2SEL
mov.b #0xff,&P2DIR
mov.b #BIT3,&P2OUT
;P2SEL = 0x00; // p2选择 I/O功能
;P2DIR = 0xff; //置p2口为输出
;P2OUT ^= BIT3;
jmp llll
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,&P1OUT ; 启动总线
bis.b #SDA,&P1OUT
bis.b #SCL,&P1OUT
CALL #I2CDLY
;-------------------------------------------------------------------------------
I2C_TX mov.b #08,BITI2C ; 向总线发送一个字节的数据
I2C_Send rla.b RXTXI2C
jc I2C_Send1
I2C_Send0 bis.b #SDA,&P1OUT
jmp I2C_Sx
I2C_Send1 bic.b #SDA,&P1OUT
I2C_Sx bic.b #SCL,&P1OUT
nop
CALL #I2CDLY
nop
bis.b #SCL,&P1OUT
dec.b BITI2C
jnz I2C_Send
bic.b #SDA,&P1OUT
;-------------------------------------------------------------------------------
I2C_Ackn bic.b #SCL,&P1OUT ; 应答信号
nop
CALL #I2CDLY
nop
bis.b #SCL,&P1OUT
ret
;-------------------------------------------------------------------------------
I2C_Read mov.b #08,BITI2C ;从总线读一个字节数据
I2C_RX bic.b #SCL,&P1OUT
bit.b #SDA,&P1IN
rlc.b R_I2C
bis.b #SCL,&P1OUT
dec.b BITI2C
CALL #I2CDLY
jnz I2C_RX
jmp I2C_Ackn
;-------------------------------------------------------------------------------
I2C_Stop bis.b #SDA,&P1OUT ;停止总线
bic.b #SCL,&P1OUT
bic.b #SDA,&P1OUT
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
;----------------------------------
COMMON INTVEC ; Interrupt vectors
ORG RESET_VECTOR
DW Reset
;----------------------------------------------------
END
责任编辑:xyx |
最新文章更多
推荐文章更多
热点文章更多 |

