Gente gostaria de uma ajuda se possível for. Estou tentando efetuar a gravação e leitura em uma memoria I2C (24C04), e estou batendo muito a cabeça, ja tentei de diversas formas, sem exito, por fim tentei fazer um código o mais detalhado possível, simplesmente sequencial (sem pulos, ou com a menor quantidade de pulos possíveis) para que eu pudesse acompanhar, e não obtive exito. Gostaria por favor que alguém me desse uma luz. Estou usando um cristal de 24,576MHz (característica que eu não posso alterar) e um uC compatível com as instruções da família 8051. Faço uma observação que esse código não é minha aplicação final e sim apenas um teste.
I2C_SDA EQU P1.6
I2C_SCL EQU P1.7
ORG 0000h
;--------------------------------------------------------------------------------------------------------------------------------------------
INICO:
MOV 2Fh, #10100000b ;ENDEREÇO DO CI
MOV 2Eh, #00000000b ;ENDEREÇO DE MEMORIA A SER GRAVADA
MOV 2Dh, #10101010b ;DADO
ACALL I2C_ESCRITA
ACALL I2C_LEITURA
LOOPING:
MOV P2, A
SJMP LOOPING
;--------------------------------------------------------------------------------------------------------------------------------------------
I2C_ESCRITA:
I2C_STARTCONDITION:
SETB I2C_SDA
SETB I2C_SCL
I2C_START:
NOP
CLR I2C_SDA
NOP
NOP
CLR I2C_SCL
I2C_ADDRESS:
MOV A, 2Fh
MOV R6, #08h
I2C_ADDRESS2:
RLC A
MOV I2C_SDA, C
SETB I2C_SCL
NOP
NOP
NOP
NOP
CLR I2C_SCL
DJNZ R6, I2C_ADDRESS2
CLR I2C_SDA
I2C_ACK:
NOP
SETB I2C_SCL
NOP
NOP
NOP
NOP
CLR I2C_SCL
I2C_ENDMEN:
MOV R6, #08h
MOV A, 2Eh
I2C_ENDMEN2:
RLC A
MOV I2C_SDA, C
SETB I2C_SCL
NOP
NOP
NOP
NOP
CLR I2C_SCL
DJNZ R6, I2C_ENDMEN2
I2C_ACK2:
CLR I2C_SDA
NOP
SETB I2C_SCL
NOP
NOP
NOP
NOP
CLR I2C_SCL
I2C_DATA:
MOV R6, #08h
MOV A, 2Dh
I2C_DATA2:
RLC A
MOV I2C_SDA, C
SETB I2C_SCL
NOP
NOP
NOP
NOP
CLR I2C_SCL
DJNZ R6, I2C_DATA2
I2C_ACK3:
CLR I2C_SDA
NOP
SETB I2C_SCL
NOP
NOP
NOP
NOP
CLR I2C_SCL
I2C_STOP:
NOP
NOP
NOP
NOP
SETB I2C_SCL
NOP
SETB I2C_SDA
NOP
NOP
I2C_WCT:
MOV R6, #0FFh
MOV R7, #15h
I2C_WCT2:
DJNZ R6, I2C_WCT2
MOV R6, #0FFh
DJNZ R7, I2C_WCT2
RET
;--------------------------------------------------------------------------------------------------------------------------------------------
I2C_LEITURA:
I2C_STARTCONDITION2:
SETB I2C_SDA
SETB I2C_SCL
I2C_START2:
NOP
CLR I2C_SDA
NOP
NOP
CLR I2C_SCL
I2C_ADDRESS3:
MOV A, 2Fh
MOV R6, #08h
I2C_ADDRESS4:
RLC A
MOV I2C_SDA, C
SETB I2C_SCL
NOP
NOP
NOP
NOP
CLR I2C_SCL
DJNZ R6, I2C_ADDRESS4
CLR I2C_SDA
I2C_ACK4:
NOP
SETB I2C_SCL
NOP
NOP
NOP
NOP
CLR I2C_SCL
I2C_ENDMEN3:
MOV R6, #08h
MOV A, 2Eh
I2C_ENDMEN4:
RLC A
MOV I2C_SDA, C
SETB I2C_SCL
NOP
NOP
NOP
NOP
CLR I2C_SCL
DJNZ R6, I2C_ENDMEN4
I2C_ACK5:
CLR I2C_SDA
NOP
SETB I2C_SCL
NOP
NOP
NOP
NOP
CLR I2C_SCL
I2C_RSTART:
NOP
SETB I2C_SDA
NOP
NOP
SETB I2C_SCL
NOP
NOP
CLR I2C_SDA
NOP
CLR I2C_SCL
I2C_ADDRESS5:
MOV A, #0A1h
MOV R6, #08h
I2C_ADDRESS6:
RLC A
MOV I2C_SDA, C
SETB I2C_SCL
NOP
NOP
NOP
NOP
CLR I2C_SCL
DJNZ R6, I2C_ADDRESS6
CLR I2C_SDA
I2C_ACK6:
NOP
SETB I2C_SCL
NOP
NOP
NOP
NOP
CLR I2C_SCL
I2C_READ:
MOV R6, #08h
NOP
I2C_READ2:
NOP
NOP
SETB I2C_SCL
NOP
NOP
MOV C, I2C_SDA
RLC A
CLR I2C_SCL
DJNZ R6, I2C_READ2
I2C_NOACK:
SETB I2C_SDA
NOP
SETB I2C_SCL
NOP
NOP
NOP
NOP
CLR I2C_SCL
I2C_STOP2:
CLR I2C_SDA
NOP
NOP
NOP
SETB I2C_SCL
NOP
NOP
SETB I2C_SDA
NOP
I2C_WCT3:
MOV R6, #0FFh
MOV R7, #15h
I2C_WCT4:
DJNZ R6, I2C_WCT4
MOV R6, #0FFh
DJNZ R7, I2C_WCT4
RET
;--------------------------------------------------------------------------------------------------------------------------------------------
END