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

📄 sdhal.lst

📁 针对at91sam7a3为主芯片开发板开发的spi口应用程序
💻 LST
📖 第 1 页 / 共 3 页
字号:
     68          	
     69          	SPI_SCK_GPIO();	
     70          	SPI_SCK_OUT();
     71          	SPI_SCK_CLR();								// SCK  引脚置低   set SCK to zero
     72          	
     73          	SPI_MISO_GPIO();
     74          	SPI_MISO_OUT();
     75          	SPI_MISO_CLR();								// MISO 引脚置低   set MISO to zero
     76          	
     77          	SPI_MOSI_GPIO();		
     78          	SPI_MOSI_OUT();
     79          	SPI_MOSI_CLR();								// MOSI 引脚置低   set MOSI to zero
     80          	
     81          	SPI_CS_GPIO();								
     82             	SPI_CS_OUT();								
     83          	SPI_CS_CLR();								// CS 引脚置低	   set CS to zero
     84          		
     85          	for(i = 0; i < 0x9000; i++);				// 关闭电源延时    delay after turn off power of sd card
     86          	SD_POWER_ON();								// 打开 SD 卡电源  turn on power of sd card
     87          }
     88          */
     89          /*******************************************************************************************************************
     90          ** 函数名称: void SD_HardWareInit()				Name:	  void SD_HardWareInit()
     91          ** 功能描述: 初始化访问SD卡的硬件条件			Function: initialize the hardware condiction that access sd card
     92          ** 输   入: 无									Input:	  NULL
     93          ** 输   出: 无									Output:	  NULL
     94          ********************************************************************************************************************/

   \                                 In segment CODE, align 4, keep-with-next
     95          void SD_HardWareInit(void)
     96          {
   \                     SD_HardWareInit:
   \   00000000   00B5               PUSH        {LR}
     97          	//SD_Power() 对卡先下电,再上电  控制卡的第4脚 ,在7A3_Ek板上,此脚恒定为高,不能下电
     98                  // AT91F_PIO_ClearOutput(AT91C_BASE_PIOA ,XXXXXX) ;   无此脚
     99          	/* SPI_INIT();  初始化SPI接口      initialize SPI interface */	
    100          	/*AT91F_PIO_CfgPeriph(AT91C_BASE_PIOA,AT91C_PA16_SPI0_MOSI|AT91C_PA15_SPI0_MISO \
    101                                                   | AT91C_PA17_SPI0_SPCK |AT91C_PA14_SPI0_NPCS3 ,0) ;
    102                  AT91F_PMC_EnablePeriphClock(AT91C_BASE_PMC,1<<AT91C_ID_SPI0) ;
    103                  AT91F_PIO_OutputEnable(AT91C_BASE_PIOA,AT91C_PA16_SPI0_MOSI|AT91C_PA17_SPI0_SPCK|AT91C_PA14_SPI0_NPCS3) ;
    104                  AT91F_PIO_CfgOutput   (AT91C_BASE_PIOA,AT91C_PA16_SPI0_MOSI|AT91C_PA17_SPI0_SPCK|AT91C_PA14_SPI0_NPCS3) ;
    105                 */
    106                  AT91F_SPI0_CfgPIO()  ;
   \   00000002   ........           _BLF        AT91F_SPI0_CfgPIO,AT91F_SPI0_CfgPIO??rT
    107                  AT91F_SPI0_CfgPMC()  ;
   \   00000006   ........           _BLF        AT91F_SPI0_CfgPMC,AT91F_SPI0_CfgPMC??rT
    108                  AT91F_PIO_OutputEnable(AT91C_BASE_PIOA,AT91C_PA16_SPI0_MOSI|AT91C_PA17_SPI0_SPCK|AT91C_PA14_SPI0_NPCS3) ;
   \   0000000A   D021               MOV         R1,#+0xD0
   \   0000000C   8902               LSL         R1,R1,#+0xA        ;; #+0x34000
   \   0000000E   ....               LDR         R0,??DataTable11   ;; 0xfffff400
   \   00000010   ........           _BLF        AT91F_PIO_OutputEnable,AT91F_PIO_OutputEnable??rT
    109                  AT91F_PIO_CfgOutput   (AT91C_BASE_PIOA,AT91C_PA16_SPI0_MOSI|AT91C_PA17_SPI0_SPCK|AT91C_PA14_SPI0_NPCS3) ;
   \   00000014   D021               MOV         R1,#+0xD0
   \   00000016   8902               LSL         R1,R1,#+0xA        ;; #+0x34000
   \   00000018   ....               LDR         R0,??DataTable11   ;; 0xfffff400
   \   0000001A   ........           _BLF        AT91F_PIO_CfgOutput,AT91F_PIO_CfgOutput??rT
    110          
    111          	//SD_INSERT_GPIO();
    112          	//SD_INSERT_IN();								/* 检测卡完全插入口为输入口   the port checking card is input */
    113          	
    114          	//SD_WP_GPIO();								
    115          	//SD_WP_IN();									/* 写保护检测口为输入口  	  the port written protect is input */	
    116          		
    117             	/*         SPI_CS_SET();	 CS置高	   */
    118                  AT91F_PIO_SetOutput(AT91C_BASE_PIOA,AT91C_PA14_SPI0_NPCS3) ;
   \   0000001E   8021               MOV         R1,#+0x80
   \   00000020   C901               LSL         R1,R1,#+0x7        ;; #+0x4000
   \   00000022   ....               LDR         R0,??DataTable11   ;; 0xfffff400
   \   00000024   ........           _BLF        AT91F_PIO_SetOutput,AT91F_PIO_SetOutput??rT
    119          
    120                  /* 设置SPI频率小于等于400kHZ  set frequency of SPI below 400kHZ */
    121           	SPI_Clk400k();								
   \   00000028   ........           BL          SPI_Clk400k
    122                  /* 设置SPI接口模式,MSTR = 1,CPOL = 1,CPHA = 0,LSBF=0 */
    123           	AT91C_BASE_SPI0->SPI_CR |=(AT91C_SPI_SWRST |AT91C_SPI_SPIEN) ;
   \   0000002C   0348               LDR         R0,??SD_HardWareInit_0  ;; 0xfffe0000
   \   0000002E   0349               LDR         R1,??SD_HardWareInit_0  ;; 0xfffe0000
   \   00000030   0968               LDR         R1,[R1, #+0]
   \   00000032   8122               MOV         R2,#+0x81
   \   00000034   0A43               ORR         R2,R1
   \   00000036   0260               STR         R2,[R0, #+0]
    124          }												/* configure SPI interface */
   \   00000038   01BC               POP         {R0}
   \   0000003A   0047               BX          R0                 ;; return
   \                     ??SD_HardWareInit_0:
   \   0000003C   0000FEFF           DC32        0xfffe0000
    125          
    126          
    127          /*******************************************************************************************************************
    128          ** 函数名称: void SPI_Clk400k()					Name:	  void SPI_Clk400k()
    129          ** 功能描述: 设置SPI的时钟小于400kHZ			Function: set the clock of SPI less than 400kHZ
    130          ** 输   入: 无									Input:	  NULL
    131          ** 输   出: 无									Output:	  NULL
    132          ********************************************************************************************************************/

   \                                 In segment CODE, align 4, keep-with-next
    133          void SPI_Clk400k(void)
    134          {
    135             // 若DIV32 为0:SPCK Baudrate =MCK/ (2 *SCBR ) now Fosc=48 mhz
    136          	AT91C_BASE_SPI0->SPI_CSR[3] = 60;    	/* 设置SPI时钟分频值为60   */
   \                     SPI_Clk400k:
   \   00000000   ....               LDR         R0,??DataTable4    ;; 0xfffe003c
   \   00000002   3C21               MOV         R1,#+0x3C
   \   00000004   0160               STR         R1,[R0, #+0]
    137          }
   \   00000006   7047               BX          LR                 ;; return
    138          
    139          
    140          /*******************************************************************************************************************
    141          ** 函数名称: void SPI_ClkToMax()				Name:	  void SPI_ClkToMax()
    142          ** 功能描述: 设置SPI的clock到最大值				Function: set the clock of SPI to maximum
    143          ** 输   入: 无									Input:	  NULL
    144          ** 输   出: 无									Output:	  NULL
    145          ********************************************************************************************************************/

   \                                 In segment CODE, align 4, keep-with-next
    146          void SPI_ClkToMax(void)
    147          {     /* 将SPI时钟设置为高(最高可以到20mhz),设置分频值=48/(2*Baud )*/
    148          	AT91C_BASE_SPI0->SPI_CSR[3] = 4;								
   \                     SPI_ClkToMax:
   \   00000000   ....               LDR         R0,??DataTable4    ;; 0xfffe003c
   \   00000002   0421               MOV         R1,#+0x4
   \   00000004   0160               STR         R1,[R0, #+0]
    149          }
   \   00000006   7047               BX          LR                 ;; return
    150          /*******************************************************************************************************************
    151          ** 函数名称: void SPI_SendByte()				
    152          ** 功能描述: 通过SPI接口发送一个字节	
    153          ********************************************************************************************************************/

   \                                 In segment CODE, align 4, keep-with-next
    154          void SPI_SendByte(INT8U byte)
    155          {
    156          	INT8U temp;
    157          
    158          	AT91C_BASE_SPI0->SPI_TDR = byte;			/* 发送数据放入SPI数据寄存器 */
   \                     SPI_SendByte:
   \   00000000   054A               LDR         R2,??SPI_SendByte_0  ;; 0xfffe000c
   \   00000002   0006               LSL         R0,R0,#+0x18       ;; ZeroExt     R0,R0,#+0x18,#+0x18
   \   00000004   000E               LSR         R0,R0,#+0x18
   \   00000006   1060               STR         R0,[R2, #+0]
    159          
    160          	while((AT91C_BASE_SPI0->SPI_SR & AT91C_SPI_ENDTX)==0);	/* 等待ENDTX置位,即等待数据发送完毕 */
   \                     ??SPI_SendByte_1:
   \   00000008   ....               LDR         R2,??DataTable7    ;; 0xfffe0010
   \   0000000A   1268               LDR         R2,[R2, #+0]
   \   0000000C   9206               LSL         R2,R2,#+0x1A
   \   0000000E   FBD5               BPL         ??SPI_SendByte_1
    161          								
    162           	temp =AT91C_BASE_SPI0->SPI_RDR;
   \   00000010   ....               LDR         R2,??DataTable8    ;; 0xfffe0008
   \   00000012   1268               LDR         R2,[R2, #+0]
   \   00000014   111C               MOV         R1,R2
    163                  temp=temp ;
    164          }
   \   00000016   7047               BX          LR                 ;; return
   \                     ??SPI_SendByte_0:
   \   00000018   0C00FEFF           DC32        0xfffe000c
    165          
    166          
    167          /*******************************************************************************************************************
    168          ** 函数名称: INT8U SPI_RecByte()				Name:	  INT8U SPI_RecByte()
    169          ** 功能描述: 从SPI接口接收一个字节				Function: receive a byte from SPI interface
    170          ** 输   入: 无									Input:	  NULL
    171          ** 输   出: 收到的字节							Output:	  the byte that be received
    172          ********************************************************************************************************************/

   \                                 In segment CODE, align 4, keep-with-next
    173          INT8U SPI_RecByte(void)
    174          {
    175           	while((AT91C_BASE_SPI0->SPI_SR & AT91C_SPI_ENDRX)==0);			/* 等待SPIF置位,即等待收到数据 */
   \                     SPI_RecByte:
   \                     ??SPI_RecByte_0:
   \   00000000   ....               LDR         R0,??DataTable7    ;; 0xfffe0010
   \   00000002   0068               LDR         R0,[R0, #+0]
   \   00000004   C006               LSL         R0,R0,#+0x1B
   \   00000006   FBD5               BPL         ??SPI_RecByte_0
    176          	return(AT91C_BASE_SPI0->SPI_RDR); 							/* 读取收到的字节 read the byte received */
   \   00000008   ....               LDR         R0,??DataTable8    ;; 0xfffe0008
   \   0000000A   0068               LDR         R0,[R0, #+0]

⌨️ 快捷键说明

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