- 打卡等级:常住居民II
- 打卡总天数:93
- 最近打卡:2025-05-01 20:59:58
高级会员
- 积分
- 775
|
3.3v,上拉4.7k,端口设置为准双向,开漏都试过,通过硬件i2c没问题,读取和写入都可以的,模拟死活不行
8H系列 做主,读取一个温度采样模块,就一个从设备
开机sda和scl都是高,但是我仿真单步也没法设置低,置低后测量电压还是高
用了汇编来模拟i2c,下面也是例程上的汇编程序
现在用硬件的start命令可以进入,但是模拟的start没办法进入
读取程序如下:
LCALL I2C_Start_sim
MOV A,#90H
LCALL I2C_WriteAbyte
LCALL I2C_Check_ACK
MOV A,#00H
LCALL I2C_WriteAbyte
LCALL I2C_Check_ACK
LCALL I2C_Start
MOV A,#91H
LCALL I2C_WriteAbyte
LCALL I2C_Check_ACK
LCALL I2C_ReadAbyte
MOV R1,A
LCALL S_ACK
LCALL I2C_ReadAbyte
MOV R2,A
LCALL S_ACK
LCALL I2C_ReadAbyte
MOV R3,A
LCALL S_ACK
LCALL I2C_Stop_sim
下面是子程序
I2C_Start_sim:
SETB SDA
SETB SCL
JNB SCL,$
LCALL I2C_Delay
CLR SDA
LCALL I2C_Delay
CLR SCL
LCALL I2C_Delay
RET
I2C_Stop_sim:
CLR SDA
LCALL I2C_Delay
SETB SCL
JNB SCL,$
LCALL I2C_Delay
SETB SDA
LCALL I2C_Delay
RET
S_ACK:
CLR SDA
LCALL I2C_Delay
SETB SCL
LCALL I2C_Delay
CLR SCL
LCALL I2C_Delay
RET
S_NoACK:
SETB SDA
LCALL I2C_Delay
SETB SCL
LCALL I2C_Delay
CLR SCL
LCALL I2C_Delay
RET
I2C_Check_ACK:
SETB SDA
LCALL I2C_Delay
SETB SCL
LCALL I2C_Delay
MOV C, SDA
CLR SCL
LCALL I2C_Delay
RET
I2C_WriteAbyte:
MOV R7, #08H
TXNEXT:
RLC A
MOV SDA, C
SETB SCL
LCALL I2C_Delay
CLR SCL
LCALL I2C_Delay
DJNZ R7, TXNEXT
RET
I2C_ReadAbyte:
MOV R7, #08H
RXNEXT:
SETB SCL
LCALL I2C_Delay
MOV C, SDA
RLC A
CLR SCL
LCALL I2C_Delay
DJNZ R7, RXNEXT
RET
WriteNbyte:
LCALL I2C_Start
MOV A, #00H
LCALL I2C_WriteAbyte
LCALL I2C_Check_ACK
JC Write_Exit
CLR A
LCALL I2C_WriteAbyte ;addr
LCALL I2C_Check_ACK
JC Write_Exit
MOV R0,A
Write_Loop:
MOV A,@R0
LCALL I2C_WriteAbyte
LCALL I2C_Check_ACK
JC Write_Exit
INC R0
DJNZ R6, Write_Loop
Write_Exit:
LCALL I2C_Stop_sim
RET
|
|