PIC24 I2C kommunikációja

Dokumentáció: Itt!  

 

 

;++++++++++ Terszteltem és jó +++++++++++++++++++++

;*1 *Bekapapcsolom a modult,      
     nop
   bset I2C1CONL,#I2CEN ; Bekapapcsolom   
     nop
        
;*2 * Várok míg át nem áll a SEM bit, vagyis a az I2C moduk bekapcsolásáig: 
  btss I2C1CONL, #I2CEN  ; 
  bra $-2   ; ha bakapcsoi az I2C modul, akkor továbbmegy
    
;*3 *Beállítom a START bitet a START jel kiadására
    bset I2C1CONL,#SEN ; Start-ot engedélyezi         
    
adatbemasolas:
 ;*4 *metültöm az elküldendő adatot, ami most a szolga címe és az R/!W bit 
    mov #0b10010001, W0 ; P24 Adatokat kérek a szolgától R/!W  Adatküldés=0, adatkérés=1
    mov W0, I2C1TRN    ;P24
    
;*5 Figyelem, hogy betárolódott-e a 8 bites adat, és ha igen, csak akkor lép  tovább a program,   
    btss I2C1STAT, #TBF ;  Ha van a I2C1TRN-ben adat, akkot TBF=1
    bra adatbemasolas   ; vár az adatok kimenésére, a tároló kiürülésére        
    
;*6 Várok a START jel kiadásának megtörtöntére   
    btss I2C1STAT, #S   ; átugor, ha megvolt a START jel 
    bra $-2 ; vár a START jelre      
       
;*7 Figyelem, hogy kimentek-e az adatok, és ha igen, akkor továbblép a program,   
    btsc I2C1STAT, #TBF ;Ha van a I2C1TRN-ben adat, akkot TBF=1, ha kimegy, akkor TBF=0
    bra $-2 ; vár az adatok kimenésére, a tároló (buffewr) kiürülésére      
  
;*8 Várok a kommunikáció megtörténtére    
    btsc I2C1STAT, #TRSTAT ; 1-ről 0-ra vált, ha kimegy a 8 bit és megjön az ACK jel
    bra $-2 ; Vár az adatok kimenésére és az ACK jel megérkezésére    
   
; * Engedélyezem az adatfogadást    
    bset I2C1CONL,#RCEN    
    btss I2C1CONL, #RCEN ; Ha bekapcsol az adatfogadást engedélyező bit, akkor továbblép       
    bra $-4 ; Addig engedélyezem, míg meg nem történik az engedélyezés   
    
    bclr I2C1CONL, #ACKDT ; ACKDT=0 -> ACK,   ACKDT=1 -> NACK 
    btsc I2C1CONL, #ACKDT ; ACK legyen majd jésőbb, ne NACK(Előre beállítjuk)       
    bra $-4 ; Ha beálla bit, akkor továbblép           
    
; * Várom a szolgától érkező adatot, ha megérkezik, akkor továbblép    
    btss I2C1STAT, #RBF ; Ha megérkezik, akkor RBF=1 lesz és továbblép
    bra $-2
    
; * A megérkezett adat kiolvasása, ha kiolvasva, akkor továbblép    
    mov I2C1RCV ,W5
    btsc I2C1STAT, #RBF ; Ha kiolvasva, akkor RBF=0 és továbblép
    bra $-4    
     
; A mesternek nyugtázásként egy NACK-al vissza kell jelezni a szolgának     
    bset I2C1CONL, #ACKEN ; jelzi a M a szolgának, hogy újabb adatot vár
    btss I2C1CONL, #ACKEN ; Ha engedélyezve a mesternek a nyzgtázás, akkor továbblép       
    bra $-4 ; Addig engedélyezem, míg meg nem történik az engedélyezés
    
; * Engedélyezem üjból az adatfogadást    
    bset I2C1CONL, #RCEN   
    btss I2C1CONL, #RCEN ; Ha bekapcsol az adatfogadást engedélyező bit, akkor továbblép       
    bra $-4 ; Addig engedélyezem, míg meg nem történik az engedélyezés    
    
    
; * Várom a szolgától érkező adatot, ha megérkezik, akkor továbblép    
    btss I2C1STAT, #RBF ; Ha megérkezik, akkor RBF=1 lesz és továbblép
    bra $-2
    
; * A megérkezett adat kiolvasása, ha kiolvasva, akkor továbblép    
    mov I2C1RCV ,W6
    btsc I2C1STAT, #RBF ; Ha kiolvasva, akkor RBF=0 és továbblép
    bra $-4    
    
  
    bset I2C1CONL, #ACKDT ; ACKDT=0 -> ACK,   ACKDT=1 -> NACK 
    btss I2C1CONL, #ACKDT ; Ha bekapcsol az adatfogadást engedélyező bit, akkor továbblép       
    bra $-4 ; Addig engedélyezem, míg meg nem történik az engedélyezés        
    
    
    
    
; A mesternek nyugtázásként egy NACK-al vissza kell jelezni a szolgának     
    bset I2C1CONL, #ACKEN ; jelzi a M a szolgának, hogy újabb adatot vár
    btss I2C1CONL, #ACKEN ; Ha engedélyezve a mesternek a nyzgtázás, akkor továbblép       
    bra $-4 ; Addig engedélyezem, míg meg nem történik az engedélyezés
    
; Megvárja a NACK megtörténtét, majd továbblép    
    btsc I2C1CONL, #ACKEN ; Ha a NACK megvolt, akkor 0 és továbblép
    bra $-2       
    
       
; A mester STOP jellel jelzi a szolgának, hogy vége a kommunikációnak, így a STOP jel engedélyezése: 
    bset I2C1CONL, #PEN 
    btss I2C1CONL, #PEN  ; Vár a STOP engedélyezés bit beállására    
    bra $-2 ; 
    
;*  Vár a STOP jel lefutására, megtörténte után továbblép    
    btsc I2C1CONL, #PEN  ; Vár a STOP kimenetelére, mikor a PEN bit 0-ra vált    
    bra $-2 ;     
    
; * Várok a SZOP jel kiadásának megtörtöntének érzékeléséra   
    btss I2C1STAT, #P   ; átugor, ha megvolt a START jel 
    bra $-2 ; vár a START jelre        
     
    
    
    
    
    
    
    
    
    nop    
      bra $ ;     
    nop
    
;*5 *Beállítom a STOP bitet a START jel kiadására
    bset I2C1CONL,#PEN ; STOP-ot engedélyezi    
     btss I2C1CONL,#PEN   
      bra $-4 ;
  
; * Várok a START jel kiadásának megtörtöntére   
    btss I2C1STAT, #P   ; átugor, ha megvolt a START jel 
    bra $-2 ; vár a START jelre        
    
    
 nop
    
      bra $ ;
        
    
    
    reset
    nop      
    
    

 

;++++++++++++++  eddig  ++++++++++++++++++++++++++++++++++++++++++++++

 

   ;++++++  Még nem teszteltem ++++++++++++++++++++++++++ 
    
lm75A_hosszuhofok: ; Hőfokbekérés POINTER megadásával     
;*1 *Bekapapcsolom a modult,      
     nop
   bset I2C1CONL,#I2CEN ; Bekapapcsolom   
     nop
        
;*2 * Várok míg át nem áll a SEM bit, vagyis a az I2C moduk bekapcsolásáig: 
  btss I2C1CONL, #I2CEN  ; 
  bra $-2   ; ha bakapcsoi az I2C modul, akkor továbbmegy
    
;*3 *Beállítom a START bitet a START jel kiadására
    bset I2C1CONL,#SEN ; Start-ot engedélyezi         
    
i2c1_adatbemazgatas_1:
 ;*4 *Betöltöm az elküldendő adatot, ami most a szolga címe és az R/!W bit 
    mov #0b10010000, W0 ; Cím + R/!W adatokat küldök a szolgán R/!W  Adatküldés=0, adatkérés=1
    mov W0, I2C1TRN    ;P24
       
;*5 Figyelem, hogy betárolódott-e a 8 bites adat, és ha igen, csak akkor lép  tovább a program,   
    btss I2C1STAT, #TBF ;  Ha van a I2C1TRN-ben adat, akkot TBF=1
    bra i2c1_adatbemazgatas_1   ; vár az adatok kimenésére, a tároló kiürülésére        
    
;*6 Várok a START jel kiadásának megtörtöntére   
    btss I2C1STAT, #S   ; átugor, ha megvolt a START jel 
    bra $-2 ; vár a START jelre      
       
;*7 Figyelem, hogy kimentek-e az adatok, és ha igen, akkor továbblép a program,   
    btsc I2C1STAT, #TBF ;Ha van a I2C1TRN-ben adat, akkot TBF=1, ha kimegy, akkor TBF=0
    bra $-2 ; vár az adatok kimenésére, a tároló (buffewr) kiürülésére      
  
;*8 Várok a kommunikáció megtörténtére    
    btsc I2C1STAT, #TRSTAT ; 1-ről 0-ra vált, ha kimegy a 8 bit és megjön az ACK jel
    bra $-2 ; Vár az adatok kimenésére és az ACK jel megérkezésére      
 
i2c1_adatbemazgatas_2:
 ;*4 *metültöm az elküldendő adatot, ami most a szolga címe és az R/!W bit 
    mov #0b00000000, W0 ; Pointer (most hőfok) adatot küldök a szolgának
    mov W0, I2C1TRN    ;P24    
    
;*5 Figyelem, hogy betárolódott-e a 8 bites adat, és ha igen, csak akkor lép  tovább a program:   
    btss I2C1STAT, #TBF ;  Ha van a I2C1TRN-ben adat, akkot TBF=1
    bra i2c1_adatbemazgatas_2   ; vár az adatok kimenésére, a tároló kiürülésére   
    
;*7 Figyelem, hogy kimentek-e a cím+R adatok, és ha igen, akkor továbblép a program:   
    btsc I2C1STAT, #TBF ;Ha van a I2C1TRN-ben adat, akkot TBF=1, ha kimegy, akkor TBF=0
    bra $-2 ; vár az adatok kimenésére, a tároló (buffewr) kiürülésére        
  
;*8 Várok a kommunikáció megtörténtére    
    btsc I2C1STAT, #TRSTAT ; 1-ről 0-ra vált, ha kimegy a 8 bit és megjön az ACK jel
    bra $-2 ; Vár az adatok kimenésére és az ACK jel megérkezésére       
    
;* Törlöm a START jelző bitet mert kell a RESTART jelzésére:
    bclr I2C1STAT, #S ;
    
;* Vár a START (RESTART) jelzőbit törlésére   
    btsc I2C1STAT, #S   ; átugor, ha törlődött START (RESTZART) jel 
    bra $-4 ; vár a START jel törlésére       
    
i2c1_adatbemazgatas_3:    
;* Betöltöm az elküldendő adatot, ami most a szolga címe és az R/!W bit 
    mov #0b10010001, W0 ; Cím + R/!W adatokat küldök a szolgán R/!W  Adatküldés=0, adatkérés=1
    mov W0, I2C1TRN    ;    
    
;* Figyelem, hogy betárolódott-e a 8 bites adat, és ha igen, csak akkor lép  tovább a program,   
    btss I2C1STAT, #TBF ;  Ha van a I2C1TRN-ben adat, akkot TBF=1
    bra i2c1_adatbemazgatas_3   ; vár az adatok kimenésére, a tároló kiürülésére          
    
;* RESTART jelet köldök a folytatás jelzésére ami a pointer által jelzett adatok bekérését kezdeményezi      
    bset I2C1CONL,#RSEN ; Bekapapcsolom      
        
;* Várok míg át nem áll a RSEN bit, vagyis a RESTART enedélyezése: 
    btss I2C1CONL, #RSEN  ; 
    bra $-4   ; ha bakapcsoi az I2C modul, akkor továbbmegy    
 
 ;* Várok a RESTART jel kiadásának megtörtöntére   
    btss I2C1STAT, #S   ; átugor, ha megvolt a RESTART jel 
    bra $-2 ; vár a RESTART jel kiadásának megtörténtére       
    
;*7 Figyelem, hogy kimentek-e az adatok, és ha igen, akkor továbblép a program,   
    btsc I2C1STAT, #TBF ;Ha van a I2C1TRN-ben adat, akkot TBF=1, ha kimegy, akkor TBF=0
    bra $-2 ; vár az adatok kimenésére, a tároló (buffewr) kiürülésére         
              
; * Engedélyezem az adatfogadást ami at 1, fogadott byte lesz:    
    bset I2C1CONL,#RCEN    
    btss I2C1CONL, #RCEN ; Ha bekapcsol az adatfogadást engedélyező bit, akkor továbblép       
    bra $-4 ; Addig engedélyezem, míg meg nem történik az engedélyezés   
    
; * ACK-ot adjon a mester nyugtázásként mert még vár egy adatbyte-ot:    
    bclr I2C1CONL, #ACKDT ; ACKDT=0 -> ACK,   ACKDT=1 -> NACK 
    btsc I2C1CONL, #ACKDT ; ACK legyen majd jésőbb, ne NACK(Előre beállítjuk)       
    bra $-4 ; Ha beálla bit, akkor továbblép           
    
; * Várom a szolgától érkező adatot, ha megérkezik, akkor továbblép    
    btss I2C1STAT, #RBF ; Ha megérkezik, akkor RBF=1 lesz és továbblép
    bra $-2
    
; * Ha megérkezett az 1. adat, akkor kiolvassa, ha kiolvasva, akkor továbblép    
    mov I2C1RCV ,W5
    btsc I2C1STAT, #RBF ; Ha kiolvasva, akkor RBF=0 és továbblép
    bra $-4    
         
; * Engedélyezem üjból az adatfogadást    
    bset I2C1CONL, #RCEN   
    btss I2C1CONL, #RCEN ; Ha bekapcsol az adatfogadást engedélyező bit, akkor továbblép       
    bra $-4 ; Addig engedélyezem, míg meg nem történik az engedélyezés        

; *Köldök egy nyugtázó ACK jelet a szolgának, hogy küldhesse a következő adatbyte-ot
    bset I2C1CONL, #ACKEN ; jelzi a M a szolgának, hogy újabb adatot vár
    btss I2C1CONL, #ACKEN ; Ha engedélyezve a mesternek a nyzgtázás, akkor továbblép       
    bra $-4 ; Addig engedélyezem, míg meg nem történik az engedélyezés    
    
; * Várom a szolgától érkező adatot, ha megérkezik, akkor továbblép    
    btss I2C1STAT, #RBF ; Ha megérkezik, akkor RBF=1 lesz és továbblép
    bra $-2
    
; * A megérkezett a 2. adat kiolvasása, ha kiolvasva, akkor továbblép    
    mov I2C1RCV ,W6
    btsc I2C1STAT, #RBF ; Ha kiolvasva a 2. adat, akkor RBF=0 és továbblép
    bra $-4    

; * NACK-ot adjon a mester nyugtázásként mert még vár egy adatbyte-ot:      
    bset I2C1CONL, #ACKDT ; ACKDT=0 -> ACK,   ACKDT=1 -> NACK 
    btss I2C1CONL, #ACKDT ; Ha bekapcsol a NACK-ot választó bit (nem ACK), akkor továbblép       
    bra $-4 ; Addig engedélyezem, míg meg nem történik az engedélyezés     
        
; A mesternek nyugtázásként egy NACK-al vissza kell jelezni az adatfogást a szolgának     
    bset I2C1CONL, #ACKEN ; jelzi a M a szolgának, hogy nem kér tübb adatot
    btss I2C1CONL, #ACKEN ; Ha engedélyezve a mesternek a nyugtázás, akkor továbblép       
    bra $-4 ; Addig engedélyezem, míg meg nem történik az engedélyezés
    
; Megvárja a NACK megtörténtét, majd továbblép    
    btsc I2C1CONL, #ACKEN ; Ha a NACK megvolt, akkor 0 és továbblép
    bra $-2       
       
; A mester STOP jellel jelzi a szolgának, hogy vége a kommunikációnak, így a STOP-ot engedélyezi: 
    bset I2C1CONL, #PEN 
    btss I2C1CONL, #PEN  ; Vár a STOP engedélyezés bit beállására    
    bra $-4 ; 
    
;*  Vár a STOP jel lefutására, megtörténte után továbblép    
    btsc I2C1CONL, #PEN  ; Vár a STOP kimenetelére, mikor a PEN bit 0-ra vált    
    bra $-2 ;     
    
; * Várok a STOP jel kiadásának megtörtöntének érzékeléséra   
    btss I2C1STAT, #P   ; átugor, ha megvolt a STOP jel 
    bra $-2 ; vár a STOP érzékelésének megtörténtére        
 
;* Kikapapcsolom a modult:   
;   bclr I2C1CONL,#I2CEN ; Bekapapcsolom   
    
;* Várok míg át nem áll a SEM bit, vagyis a az I2C moduk kikapcsolásáig: 
;  btss I2C1CONL, #I2CEN  ; 
;  bra $-4   ; ha kikapcsoi az I2C modul, akkor továbbmegy    
    
    
    nop    
      bra $ ;     
    nop
 
   goto lm75A_hosszuhofok_
   nop
    
    reset
    nop