⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sdspi.lst

📁 Tried to make CAN logger on AT91sam7X-ek, but have no idea how to implement FATFs... -( I m just a
💻 LST
📖 第 1 页 / 共 5 页
字号:
    110              AT91S_SPI *pSpiHw = pSdSpi->pSpiHw;
   \   00000004   003090E5           LDR      R3,[R0, #+0]
    111          
    112              // Enable the SPI clock
    113              AT91C_BASE_PMC->PMC_PCER = (1 << pSdSpi->spiId);
   \   00000008   01C0A0E3           MOV      R12,#+1
   \   0000000C   D4E0D0E1           LDRSB    LR,[R0, #+4]
   \   00000010   1CCEA0E1           LSL      R12,R12,LR
   \   00000014   EFE0E0E3           MVN      LR,#+239
   \   00000018   C0EFCEE3           BIC      LR,LR,#0x300
   \   0000001C   00C08EE5           STR      R12,[LR, #+0]
    114          
    115              //TRACE_DEBUG("CSR[%d]=0x%8X\n\r", cs, csr);
    116              pSpiHw->SPI_CSR[cs] = csr;
   \   00000020   01C183E0           ADD      R12,R3,R1, LSL #+2
   \   00000024   30208CE5           STR      R2,[R12, #+48]
    117          
    118          //jcb to put in sendcommand
    119              // Write to the MR register
    120              spiMr = pSpiHw->SPI_MR;
   \   00000028   042093E5           LDR      R2,[R3, #+4]
    121              spiMr |= AT91C_SPI_PCS;
    122              spiMr &= ~((1 << cs) << 16);
    123              pSpiHw->SPI_MR = spiMr;
   \   0000002C   F02A82E3           ORR      R2,R2,#0xF0000
   \   00000030   01C0A0E3           MOV      R12,#+1
   \   00000034   1C11A0E1           LSL      R1,R12,R1
   \   00000038   0118E0E1           MVN      R1,R1, LSL #+16
   \   0000003C   021001E0           AND      R1,R1,R2
   \   00000040   041083E5           STR      R1,[R3, #+4]
    124          
    125              // Disable the SPI clock
    126              AT91C_BASE_PMC->PMC_PCDR = (1 << pSdSpi->spiId);
   \   00000044   D400D0E1           LDRSB    R0,[R0, #+4]
   \   00000048   1C00A0E1           LSL      R0,R12,R0
   \   0000004C   04108EE3           ORR      R1,LR,#0x4
   \   00000050   000081E5           STR      R0,[R1, #+0]
    127          }
   \   00000054   0140BDE8           POP      {R0,LR}
   \   00000058   1EFF2FE1           BX       LR               ;; return
    128          
    129          //------------------------------------------------------------------------------
    130          /// Use PDC for SPI data transfer.
    131          /// Return 0 if no error, otherwise return error status.
    132          /// \param pSdSpi  Pointer to a SdSpi instance.
    133          /// \param pData  Data pointer.
    134          /// \param size  Data transfer byte count.
    135          //------------------------------------------------------------------------------

   \                                 In section .text, align 4, keep-with-next
    136          unsigned char SDSPI_PDC(SdSpi *pSdSpi, unsigned char *pData, unsigned int size)
    137          {
    138              AT91PS_SPI pSpiHw = pSdSpi->pSpiHw;
   \                     SDSPI_PDC:
   \   00000000   003090E5           LDR      R3,[R0, #+0]
    139              unsigned int spiIer;
    140          
    141              if (pSdSpi->semaphore == 0) {
   \   00000004   0CC0D0E5           LDRB     R12,[R0, #+12]
   \   00000008   00005CE3           CMP      R12,#+0
    142                  TRACE_DEBUG("No semaphore\n\r");
    143                  return SDSPI_ERROR_LOCK;
   \   0000000C   0100A003           MOVEQ    R0,#+1
   \   00000010   1400000A           BEQ      ??SDSPI_PDC_0
    144              }
    145              pSdSpi->semaphore--;
   \   00000014   0CC0D0E5           LDRB     R12,[R0, #+12]
   \   00000018   01C04CE2           SUB      R12,R12,#+1
   \   0000001C   0CC0C0E5           STRB     R12,[R0, #+12]
    146          
    147              // Enable the SPI clock
    148              AT91C_BASE_PMC->PMC_PCER = (1 << pSdSpi->spiId);
   \   00000020   01C0A0E3           MOV      R12,#+1
   \   00000024   D400D0E1           LDRSB    R0,[R0, #+4]
   \   00000028   1C00A0E1           LSL      R0,R12,R0
   \   0000002C   EFC0E0E3           MVN      R12,#+239
   \   00000030   C0CFCCE3           BIC      R12,R12,#0x300
   \   00000034   00008CE5           STR      R0,[R12, #+0]
    149          
    150              // Disable transmitter and receiver
    151              pSpiHw->SPI_PTCR = AT91C_PDC_RXTDIS | AT91C_PDC_TXTDIS;
   \   00000038   0200A0E3           MOV      R0,#+2
   \   0000003C   800F80E3           ORR      R0,R0,#0x200
   \   00000040   200183E5           STR      R0,[R3, #+288]
    152          
    153              // Receive Pointer Register
    154              pSpiHw->SPI_RPR = (int)pData;
   \   00000044   001183E5           STR      R1,[R3, #+256]
    155              // Receive Counter Register
    156              pSpiHw->SPI_RCR = size;
   \   00000048   042183E5           STR      R2,[R3, #+260]
    157              // Transmit Pointer Register
    158              pSpiHw->SPI_TPR = (int) pData;
   \   0000004C   081183E5           STR      R1,[R3, #+264]
    159              // Transmit Counter Register
    160              pSpiHw->SPI_TCR = size;
   \   00000050   0C2183E5           STR      R2,[R3, #+268]
    161          
    162              spiIer = AT91C_SPI_RXBUFF;
    163          
    164              // Enable transmitter and receiver
    165              pSpiHw->SPI_PTCR = AT91C_PDC_RXTEN | AT91C_PDC_TXTEN;
   \   00000054   A000A0E1           MOV      R0,R0, LSR #+1
   \   00000058   200183E5           STR      R0,[R3, #+288]
    166          
    167              // Interrupt enable shall be done after PDC TXTEN and RXTEN
    168              pSpiHw->SPI_IER = spiIer;
   \   0000005C   4000A0E3           MOV      R0,#+64
   \   00000060   140083E5           STR      R0,[R3, #+20]
    169          
    170              return 0;
   \   00000064   0000A0E3           MOV      R0,#+0
   \                     ??SDSPI_PDC_0:
   \   00000068   1EFF2FE1           BX       LR               ;; return
    171          }
    172          
    173          //! Should be moved to a new file
    174          //------------------------------------------------------------------------------
    175          /// Read data on SPI data bus; 
    176          /// Returns 1 if read fails, returns 0 if no error.
    177          /// \param pSdSpi  Pointer to a SD SPI driver instance.
    178          /// \param pData  Data pointer.
    179          /// \param size Data size.
    180          //------------------------------------------------------------------------------

   \                                 In section .text, align 4, keep-with-next
    181          unsigned char SDSPI_Read(SdSpi *pSdSpi, unsigned char *pData, unsigned int size)
    182          {
   \                     SDSPI_Read:
   \   00000000   70402DE9           PUSH     {R4-R6,LR}
   \   00000004   0050A0E1           MOV      R5,R0
   \   00000008   0160A0E1           MOV      R6,R1
   \   0000000C   0240A0E1           MOV      R4,R2
    183              unsigned char error;
    184          
    185              // MOSI should hold high during read, or there will be wrong data in received data.
    186              memset(pData, 0xff, size);
   \   00000010   FF10A0E3           MOV      R1,#+255
   \   00000014   0600A0E1           MOV      R0,R6
   \   00000018   ........           BL       memset
    187          
    188              error = SDSPI_PDC(pSdSpi, pData, size);
   \   0000001C   0420A0E1           MOV      R2,R4
   \   00000020   0610A0E1           MOV      R1,R6
   \   00000024   0500A0E1           MOV      R0,R5
   \   00000028   ........           BL       SDSPI_PDC
   \   0000002C   0040A0E1           MOV      R4,R0
    189          
    190              while(SDSPI_IsBusy(pSdSpi) == 1);
   \                     ??SDSPI_Read_0:
   \   00000030   0500A0E1           MOV      R0,R5
   \   00000034   ........           BL       SDSPI_IsBusy
   \   00000038   010050E3           CMP      R0,#+1
   \   0000003C   FBFFFF0A           BEQ      ??SDSPI_Read_0
    191          
    192              if( error == 0 ) {
   \   00000040   000054E3           CMP      R4,#+0
    193                  return 0;
   \   00000044   0000A003           MOVEQ    R0,#+0
    194              }
    195              else {
    196                  TRACE_DEBUG("PB SDSPI_Read\n\r");
    197                  return 1;
   \   00000048   0100A013           MOVNE    R0,#+1
   \   0000004C   7040BDE8           POP      {R4-R6,LR}
   \   00000050   1EFF2FE1           BX       LR               ;; return
    198              }
    199          }
    200          
    201          //------------------------------------------------------------------------------
    202          /// Write data on SPI data bus; 
    203          /// Returns 1 if write fails, returns 0 if no error.
    204          /// \param pSdSpi  Pointer to a SD SPI driver instance.
    205          /// \param pData  Data pointer.
    206          /// \param size Data size.
    207          //------------------------------------------------------------------------------

   \                                 In section .text, align 4, keep-with-next
    208          unsigned char SDSPI_Write(SdSpi *pSdSpi, unsigned char *pData, unsigned int size)
    209          {
   \                     SDSPI_Write:
   \   00000000   38402DE9           PUSH     {R3-R5,LR}
   \   00000004   0040A0E1           MOV      R4,R0
    210              unsigned char error;
    211          
    212              error = SDSPI_PDC(pSdSpi, pData, size);
   \   00000008   ........           BL       SDSPI_PDC
   \   0000000C   0050A0E1           MOV      R5,R0
    213          
    214              while(SDSPI_IsBusy(pSdSpi) == 1);
   \                     ??SDSPI_Write_0:
   \   00000010   0400A0E1           MOV      R0,R4
   \   00000014   ........           BL       SDSPI_IsBusy
   \   00000018   010050E3           CMP      R0,#+1
   \   0000001C   FBFFFF0A           BEQ      ??SDSPI_Write_0
    215          
    216              if( error == 0 ) {
   \   00000020   000055E3           CMP      R5,#+0
    217                  return 0;
   \   00000024   0000A003           MOVEQ    R0,#+0
    218              }
    219              else {
    220                  TRACE_DEBUG("PB SDSPI_Write\n\r");
    221                  return 1;
   \   00000028   0100A013           MOVNE    R0,#+1
   \   0000002C   3240BDE8           POP      {R1,R4,R5,LR}
   \   00000030   1EFF2FE1           BX       LR               ;; return
    222              }
    223          }
    224          
    225          //------------------------------------------------------------------------------
    226          //------------------------------------------------------------------------------

   \                                 In section .text, align 4, keep-with-next
    227          unsigned char SDSPI_WaitDataBusy(SdSpi *pSdSpi)
    228          {
   \                     SDSPI_WaitDataBusy:
   \   00000000   00502DE9           PUSH     {R12,LR}
    229              unsigned char busyData;
    230          
    231              SDSPI_Read(pSdSpi, &busyData, 1);
   \   00000004   0120A0E3           MOV      R2,#+1
   \   00000008   0D10A0E1           MOV      R1,SP
   \   0000000C   ........           BL       SDSPI_Read
    232          
    233              if (busyData != 0xff) {
   \   00000010   0000DDE5           LDRB     R0,[SP, #+0]
   \   00000014   FF0050E3           CMP      R0,#+255
    234                  return 1;
   \   00000018   0100A013           MOVNE    R0,#+1
    235              }
    236              else {
    237                  return 0;
   \   0000001C   0000A003           MOVEQ    R0,#+0
   \   00000020   0240BDE8           POP      {R1,LR}
   \   00000024   1EFF2FE1           BX       LR               ;; return

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -