spi.inc
changeset 23 a6afc0eb347f
parent 18 79b25e81721f
child 24 8100038e3d58
equal deleted inserted replaced
22:fd72c63b8db8 23:a6afc0eb347f
    22 
    22 
    23     ; Drive SS high (off)
    23     ; Drive SS high (off)
    24         sbi         SPI_PORT, SPI_SS
    24         sbi         SPI_PORT, SPI_SS
    25 
    25 
    26     ; Set control mode
    26     ; Set control mode
    27         ; Enable interrupt
    27         ; XXX: Enable interrupt
    28         ; Enable SPI
    28         ; Enable SPI
    29         ; MSB first
    29         ; MSB first
    30         ; Master mode
    30         ; Master mode
    31         ; Polarity/phase: Mode 0 (sample on rising edge)
    31         ; Polarity/phase: Mode 0 (sample on rising edge)
    32         ; Clock rate 1/16
    32         ; Clock rate 1/16
    33         ldi         r16, (1 << SPIE) | (1 << SPE) | (0 << DORD) | (1 << MSTR) | (0 << CPOL) | (0 << CPHA) | (0b01 << SPR0)
    33         ldi         r16, (0 << SPIE) | (1 << SPE) | (0 << DORD) | (1 << MSTR) | (0 << CPOL) | (0 << CPHA) | (0b01 << SPR0)
    34         out         SPCR, r16
    34         out         SPCR, r16
    35     
    35     
    36     ; Flags
    36     ; Flags
    37         clr         r0
    37         clr         r0
    38         out         SPI_FLAGS, r0
    38         out         SPI_FLAGS, r0
    39     
    39     
    40     ; Done
    40     ; Done
    41         ret
    41         ret
    42 
    42 
    43 ;; Send byte
    43 ;; Send/recv one byte
    44 ;;  Input: r16
    44 ;;  Input: r16
    45 ;;  XXX: should not be busy...
    45 ;;  Output: r10
       
    46 ;;  Note: should not be busy...
    46 SPI_SendRecv:
    47 SPI_SendRecv:
    47     ; Flag
    48     ; Flag
    48         sbi         SPI_FLAGS, SPI_BUSY
    49         sbi         SPI_FLAGS, SPI_BUSY
    49 
    50 
    50     ; Enable slave (low)
    51     ; Enable slave (low)
    51         cbi         SPI_PORT, SPI_SS
    52         cbi         SPI_PORT, SPI_SS
    52     
    53     
    53     ; Write byte (starts SCK)
    54     ; Write byte (starts SCK)
    54         out         SPDR, r16
    55         out         SPDR, r16
    55     
    56     
    56     ; Wait for interrupt
    57     ; Wait for byte to be sent
       
    58 spi_sr_wait:
       
    59         in          r1, SPSR
       
    60         sbrs        r1, SPIF
       
    61         rjmp        spi_sr_wait
       
    62 
       
    63     ; Read
       
    64         in         r10, SPDR
       
    65     
       
    66     ; Drive SS high (end of packet)
       
    67         sbi         SPI_PORT, SPI_SS
       
    68 
    57     ; Done
    69     ; Done
    58         ret
    70         ret
    59 
    71 
    60 ;; Wait for byte to be sent
    72 ;; Send buffer bytes
    61 SPI_Wait:
    73 ;;  Input: post-buffer byte in X, buffer length in r16
    62         sbic        SPI_FLAGS, SPI_BUSY     ; Test for busy flag
    74 ;;  Output: r10
    63         rjmp        SPI_Wait                ; loop
    75 ;;  Note: should not be busy...
    64         
    76 SPI_SendBuf:
       
    77     ; Flag
       
    78         sbi         SPI_FLAGS, SPI_BUSY
       
    79 
       
    80     ; Enable slave (low)
       
    81         cbi         SPI_PORT, SPI_SS
       
    82 
       
    83     ; Write byte from X (starts SCK)
       
    84 spi_srb_next:
       
    85         ld          r1, -X
       
    86         out         SPDR, r1
       
    87 
       
    88     ; Wait for byte to be sent
       
    89 spi_srb_wait:        
       
    90         in          r1, SPSR
       
    91         sbrs        r1, SPIF
       
    92         rjmp        spi_srb_wait
       
    93 
       
    94     ; Read
       
    95         in          r10, SPDR
       
    96  
       
    97     ; Done?
       
    98         dec         r16
       
    99         brne        spi_srb_next
       
   100     
       
   101     ; Drive SS high (end of packet)
       
   102         sbi         SPI_PORT, SPI_SS
       
   103 
    65     ; Done
   104     ; Done
    66         ret
   105         ret
    67 
   106 
    68 ;; Service SPI interrupt
   107 ;; Service SPI interrupt
    69 SPI_Interrupt:
   108 SPI_Interrupt:
    70     ; Store SREG
   109     ; XXX: disabled
    71         in          r16, SREG
       
    72 
       
    73     ; Drive SS high (off)
       
    74         sbi         SPI_PORT, SPI_SS
       
    75 
       
    76     ; Read
       
    77         in         r10, SPDR
       
    78 
       
    79     ; Flag
       
    80         cbi         SPI_FLAGS, SPI_BUSY
       
    81 
       
    82     ; Done
       
    83         out         SREG, r16
       
    84         reti
   110         reti
    85 
   111 
    86 
   112