Navigation

Mitglieder Online

· Gäste Online: 1

· Mitglieder Online: 0

· Anzahl Mitglieder: 107
· Neuestes Mitglied: Klimparfed

Neueste Artikel

Login

Benutzername

Passwort



Noch kein Mitglied?
Hier klicken um Dich zu registrieren.

Passwort vergessen?
Um ein neues Passwort anzufordern klicke hier.

Latest Downloads

Forum Themen

Neueste Themen
· Multi-Master IIC Int...
· HCS08 im DIP Gehäuse
· Rotary Encoder
· Serial Software Buffer
· Embedded World 3-5.3...
Heisseste Themen
Keine Themen erstellt

Thema ansehen

 Thema drucken
Multi-Master IIC Interface
Christian
Servus ego!
Ich hab ein Problem mit dem IIC-Interface des 68HC908JL16.

Ich kann zwar Daten senden aber beim Lesen hängt die Sache.
Siehst Du den Fehler?
Das wäre der Source Code:

Read:
bset 3,MIMCR ;Receive
bset 4,MIMCR ;Start
mov #$40,MMADR ;Device-address
inc MMADR ;set Read-bit
brclr 0,MMSR,* ;MMDRR full
bclr 4,MIMCR ;Stop
mov MMDRR,I2C_Data ;Data
rts

write:
mov I2C_adr,MMADR ;Device-address
mov I2C_data,MMDTR ;Data
bclr 3,MIMCR ;Transmit
bset 4,MIMCR ;Start
brclr 1,MMSR,* ;MMDTR emty-flag
bclr 4,MIMCR ;Stop
rts

Danke
Christian
 
Christian
Ich hab vor einiger Zeit den IIC-Bus mittels Software emuliert. Damit läuft der IIC-Bus auf dem GP32 und
auch am JL16 (beim JL16 muss man ggf. andere Port's verwenden)

Das ist der Code:

**I2C-Rutine**
write:
jsr I2C_Start
lda i2c_adr ;Adresse aus Ram lesen
jsr I2C_Write
lda I2C_data ;Ram laden (kommt von Label lcd_write)
jsr I2C_Write
jsr I2C_NoAck
jsr I2C_Stop
rts

read:
jsr I2C_Start
lda i2c_adr ;Adresse aus Ram lesen
inca ;Lesebit setzen
jsr I2C_Write
jsr I2C_Read
jsr I2C_NoAck
sta i2c_Data ;in Ram speichern
rts

I2C_Start:
bset SDA,PCDIR ;SDA als Ausgang
bset SDA,PORTC ;SDA ;die I2C-Startbedingung wird hergestellt
bset SCL,PORTC ;SCL ;=======================================
bclr SDA,PORTC ;=======================================
bclr SCL,PORTC ;=======================================
rts

I2C_Write:
ldx #8
Nextbit:
rola ;die Bit's einzeln durch's Carry
bcc Lobit ;wenn Carry "0" zu Lobit-
bset SDA,PORTC ;sonst "1" an SDA ausgeben
bra Clock
Lobit:
bclr SDA,PORTC ;"0" an SDA ausgeben
Clock:
bset SCL,PORTC ; Taktleitung setzen
bclr SCL,PORTC ; ----"------ löschen (Bit wird übernommen)
decx ; X-Reg. um eins dec
bne Nextbit
bset SCL,PORTC ;letztes Bit Übertragung Ende
bclr SCL,PORTC
rts

I2C_Read:
bclr SDA,PCDIR ;SDA als Eingang
clra ; "A" löschen
ldx PORTC ;PortC Bit-0 ins X-Reg. laden
rorx ;Bit-0 von "X" ins Carry
rola ;Carry nach "A" Bit-0
bset SCL,PORTC ;nächstes Bit lesen
bclr SCL,PORTC ;==================
ldx PORTC ;PortC Bit-0 ins X-Reg. laden
rorx ;Bit-0 von "X" ins Carry
rola ;Carry nach "A" Bit-1
bset SCL,PORTC ;nächstes Bit lesen
bclr SCL,PORTC ;==================
ldx PORTC
rorx
rola
bset SCL,PORTC
bclr SCL,PORTC
ldx PORTC
rorx
rola
bset SCL,PORTC
bclr SCL,PORTC
ldx PORTC
rorx
rola
bset SCL,PORTC
bclr SCL,PORTC
ldx PORTC
rorx
rola
bset SCL,PORTC
bclr SCL,PORTC
ldx PORTC
rorx
rola
bset SCL,PORTC
bclr SCL,PORTC
ldx PORTC
rorx
rola
bset SCL,PORTC
bclr SCL,PORTC
bset SDA,PCDIR
rts
I2C_Ack:
bclr SDA,PORTC
bset SCL,PORTC
bclr SCL,PORTC
rts
I2C_NoAck:
bset SDA,PORTC
bset SCL,PORTC
bclr SCL,PORTC
rts
I2C_Stop:
bclr SDA,PORTC
bset SCL,PORTC
bset SDA,PORTC
rts


Christian
Bearbeitet von Christian am 30-09-2010 22:00
 
ego
Hallo Christian,

ich habe mit dem MMIIC noch nichts gemacht, aber ich weiß nicht ob das korrekt ist.

Read:
bset 3,MIMCR ;Receive
bset 4,MIMCR ;Start
mov #$40,MMADR ;Device-address
inc MMADR ;set Read-bit
brclr 0,MMSR,* ;MMDRR full
bclr 4,MIMCR ;Stop
mov MMDRR,I2C_Data ;Data
rts

Du schreibst die Slave Adresse in das Adresseregister, dann sollte laut Datenblatt die Übertragung schon starten.
Dann kommt ein inc MMADR, damit würdest Du Bit0 im MMADR setzen. Bit0 ist aber das Expanded Adresse Bit.
Bit0 ist nur dann das RW Bit wenn der HC08 Slave ist.

Eckhard
 
Christian
Endlich habe ich die Zeit gefunden, um die Lösung zu enddecken:


LOOP:
mov #$40,I2C_adr ;load the device-adress for read
jsr read
lda i2c_data ;load akku with RAM
coma ;built complement "just for fun"
sta i2c_data ;store akku to RAM
mov #$42,I2C_adr ;load the device-adress write
jsr write
jmp loop


write:
mov i2c_adr,MMADR ;RAM to MMADR
mov i2c_data,MMDTR ;RAM to MMDTR
bclr MMTXAK,MMCR ;enable ACK from master
bclr MMRW,MIMCR ;transmit-mode
bset MMAST,MIMCR ;start
brclr MMTXBE,MMSR,* ;wait till MMDTR is emty
mov #$FF,MMDTR ;dummydata for ACK from slave
brset MMRXAK,MMSR,* ;wait till ACK from slave
bclr MMAST,MIMCR ;stop
brset MMBB,MMSR,* ;wait till busyflag is clear
rts

Read:
mov i2c_adr,MMADR ;RAM to MMADR
bset MMRW,MIMCR ;receiv-mode
bclr MMTXAK,MMCR ;enable ACK from master
bset MMAST,MIMCR ;start
mov #$FF,MMDTR ;dummydata for ACK from slave
brset MMRXAK,MMSR,* ;wait til ACK from slave
brclr MMRXBF,MMSR,* ;wait till MMDRR is full
mov MMDRR,i2c_data ;MMDRR to RAM
bset MMTXAK,MMCR ;no ACK from master
bclr MMAST,MIMCR ;stop
brset MMBB,MMSR,* ;wait till busyflag is clear
rts



Chris
Bearbeitet von Christian am 14-11-2010 19:12
 
Springe ins Forum:
Seitenaufbau: 0.06 Sekunden
728,903 eindeutige Besuche