|
我从这里看到的
说明:BBUFF 为收发字节缓冲器; ICOUNT 为接收发送使用的计数器
SDA EQU 080H ; 定义P6.7 为 SDA
SDA EQU 040H ; 定义P6.6 为 SCL
BIC.B #SCL+SDA,&P6OUT ; 将SCL和SDA输出状态初始化为0
;-------------------------------------------------------------------------------
Read_I2C ;读取AT2402中指定地址单元数据的程序(实现图4的时序)
;-------------------------------------------------------------------------------
MOV.B # 0A0H,BBUFF ; 将器件地址及控制代码放入收发缓冲器(设为写状态)
CALL #I2C_Start ; 调用子程序完成启动、BBUFF发送、回应信号处理
MOV.B #10H,BBUFF ; 将指定单元地址放入收发缓冲器(指定地址为10H)
CALL #I2C_TX ; 调用子程序完成BBUFF发送、回应信号处理
; 至此,AT2402准备好向MSP430提供指定单元数据
MOV.B # 0A1h,BBUFF ; 将器件地址控制代码放入收发缓冲器(设为读状态)
CALL #I2C_Start ; 调用子程序完成启动、BBUFF发送、回应信号处理
CALL #I2C_Read ; 调用子程序完成数据读取、回应信号处理
CALL #I2C_Stop ; 调用子程序完成停止I2C总线命令时序
RET ; 返回
;-------------------------------------------------------------------------------
I2C_Start ; 产生I2C总线启动时序子程序
BIC.B #SCL+SDA,&P6DIR ; SCL,SDA设为输入,由上拉电阻发送'1'
BIS.B #SDA,&P6DIR ; SDA设为输出, SDA = 0
BIS.B #SCL,&P6DIR ; SCL设为输出, SCL = 0
;-------------------------------------------------------------------------------
I2C_TX ; 发送一个字节子程序
MOV.B #08,ICOUNT ; 计数器初始化为8
I2C_Send RLA.B BBUFF ; 待发送的数据位移入进位位
JC Send1 ; 该位为1,跳转发送1
Send0 BIS.B #SDA,&P6DIR ; 该位为0,设SDA输出,SDA=0
JMP Send_Bit ; 完成发送时序
Send1 BIC.B #SDA,&P6DIR ; SDA设为输入,SDA = 1 (上拉产生)
Send_Bit BIC.B #SCL,&P6DIR ; SCL设为输入,SCL = 1 (上拉产生)
NOP ; 延时
BIS.B #SCL,&P6DIR ; SCL设为输出,SCL = 0
NOP ; 延时
DEC.B ICOUNT ; 计数器减一
JNZ I2C_Send ; 判断是否发送完毕,没有则继续发送下一位
BIC.B #SDA,&P6DIR ; 发送完毕,将SDA设为空闲状态,SDA = 1 (上拉产生)
;-------------------------------------------------------------------------------
I2C_Ackn ; 从属器件发送的回应信号处理子程序
BIC.B #SCL,&P6DIR ; 设为输入,SCL = 1 (上拉产生)
Ack_wait BIT.B #SDA,&P6IN ; 检测是否有反馈信号
JNZ Ack_wait ; 没有则继续检测
BIS.B #SCL,&P6DIR ; 接收到回应信号,SCL设为输出,SCL = 0
RET ; 返回
;-------------------------------------------------------------------------------
I2C_Read ; 读取一个字节子程序
MOV.B #08,ICOUNT ; 初始化计数器为8
I2C_RX BIC.B #SCL,&P6DIR ; 设为输入,SCL = 1 (上拉产生)
BIT.B #SDA,&P6IN ; 检测接收位状态,结果保存在进位位中
RLC.B BBUFF ; 将接收到的位保存在收发缓冲器中
BIS.B #SCL,&P6DIR ; 设为输出,SCL = 0
DEC.B ICOUNT ; 计数器减一
JNZ I2C_RX ; 判断所有位读取完毕,没有则继续
JMP I2C_Ackn ; 读取完毕,跳转去处理回应信号
;-------------------------------------------------------------------------------
I2C_Stop ; 产生I2C停止时序子程序
BIS.B #SDA,&P6DIR ; 设为输出,SDA = 0
BIC.B #SCL,&P6DIR ; 设为输入,SCL = 1 (上拉产生)
BIC.B #SDA,&P6DIR ; 设为输入,SDA = 1 (上拉产生)
I2C_End RET |
|