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

📄 mmc.lst

📁 ARM单片机控制SD卡的读写
💻 LST
📖 第 1 页 / 共 3 页
字号:
__text_start:
__start:
    0044 EFCF      LDI	R28,0xFF
    0045 E0D4      LDI	R29,4
    0046 BFCD      OUT	0x3D,R28
    0047 BFDE      OUT	0x3E,R29
    0048 51C0      SUBI	R28,0x10
    0049 40D0      SBCI	R29,0
    004A EA0A      LDI	R16,0xAA
    004B 8308      STD	Y+0,R16
    004C 2400      CLR	R0
    004D E0E0      LDI	R30,0
    004E E0F1      LDI	R31,1
    004F E013      LDI	R17,3
    0050 30E0      CPI	R30,0
    0051 07F1      CPC	R31,R17
    0052 F011      BEQ	0x0055
    0053 9201      ST	R0,Z+
    0054 CFFB      RJMP	0x0050
    0055 8300      STD	Z+0,R16
    0056 E8E8      LDI	R30,0x88
    0057 E0F0      LDI	R31,0
    0058 E0A0      LDI	R26,0
    0059 E0B1      LDI	R27,1
    005A E010      LDI	R17,0
    005B 38E8      CPI	R30,0x88
    005C 07F1      CPC	R31,R17
    005D F021      BEQ	0x0062
    005E 95C8      LPM
    005F 9631      ADIW	R30,1
    0060 920D      ST	R0,X+
    0061 CFF9      RJMP	0x005B
    0062 D001      RCALL	_main
_exit:
    0063 CFFF      RJMP	_exit
FILE: E:\SOUCER~1\M162MMC\main.c
(0001) /******************************************
(0002) * 程序名称: MMC(SD)卡读写程序
(0003) * 程序功能: 主函数
(0004) * 目标硬件: AVR MCU "ATMEGA162" 16.0000MHz
(0005) * 创建日期: 2007-12
(0006) * 原创作者: XuGuoHong 
(0007) *           kk20y@yahoo.com.cn
(0008) * 修改记录: 无
(0009) ******************************************/
(0010) 
(0011) /* INCLUDE参数  */
(0012) #include <iom162v.h>
(0013) 
(0014) /* 全局变量 */
(0015) unsigned char sector[512];
(0016) 
(0017) /*******************************
(0018) *          主 函 数
(0019) *******************************/
(0020) void main(void)
(0021) {
(0022) 	unsigned int i;
(0023)     SPL = 0XFF;    				/* 堆栈初始化 */
_main:
  i                    --> R20
    0064 EF8F      LDI	R24,0xFF
    0065 BF8D      OUT	0x3D,R24
(0024)     SPH = 0X04;
    0066 E084      LDI	R24,4
    0067 BF8E      OUT	0x3E,R24
(0025)     uart1_init();
    0068 D160      RCALL	_uart1_init
(0026)     spi_init();
    0069 D178      RCALL	_spi_init
(0027) 	DelayMs(100);
    006A E604      LDI	R16,0x64
    006B E010      LDI	R17,0
    006C D026      RCALL	_DelayMs
(0028) 	MMCInit();
    006D D06A      RCALL	_MMCInit
(0029)     //asm("sei");             /* 系统总中断开 */
(0030) 
(0031) 	
(0032) 	// 测试1:将数据写入第255个扇区
(0033) 	for(i=0; i<512; i++)
    006E 2744      CLR	R20
    006F 2755      CLR	R21
    0070 C006      RJMP	0x0077
(0034) 	   sector[i]=0X88;
    0071 940E02A5  CALL	0x2A5
    0073 E888      LDI	R24,0x88
    0074 8380      STD	Z+0,R24
    0075 5F4F      SUBI	R20,0xFF
    0076 4F5F      SBCI	R21,0xFF
    0077 3040      CPI	R20,0
    0078 E0E2      LDI	R30,2
    0079 075E      CPC	R21,R30
    007A F3B0      BCS	0x0071
(0035) 	MMCWrBlock1(255);
    007B EF0F      LDI	R16,0xFF
    007C E010      LDI	R17,0
    007D D0F1      RCALL	_MMCWrBlock1
(0036) 	
(0037) 	// 测试2:将第1个扇区的数据读出
(0038) 	MMCRdBolck1(0);
    007E 2700      CLR	R16
    007F 2711      CLR	R17
    0080 D0A1      RCALL	_MMCRdBolck1
(0039)     for(i=0; i<512; i++)
    0081 2744      CLR	R20
    0082 2755      CLR	R21
    0083 C007      RJMP	0x008B
(0040) 	    uart1_send(sector[i]);
    0084 940E02A5  CALL	0x2A5
    0086 8100      LDD	R16,Z+0
    0087 2711      CLR	R17
    0088 D14A      RCALL	_uart1_send
    0089 5F4F      SUBI	R20,0xFF
    008A 4F5F      SBCI	R21,0xFF
    008B 3040      CPI	R20,0
    008C E0E2      LDI	R30,2
    008D 075E      CPC	R21,R30
    008E F3A8      BCS	0x0084
    008F C001      RJMP	0x0091
(0041) 		
(0042) 	while(1)
(0043) 	{
(0044) 	   asm("nop");
    0090 0000      NOP
    0091 CFFE      RJMP	0x0090
    0092 9508      RET
_DelayMs:
  count                --> R20
  temp                 --> R22
  time                 --> R16
    0093 D172      RCALL	push_gset2
(0045) 	}
(0046) }
(0047) 
(0048) /******************************************
(0049) * 名称:  DelayMs
(0050) * 描述:  软件延时函数,单位ms
(0051) ******************************************/
(0052) void DelayMs(unsigned int time)
(0053) {
(0054)     unsigned int temp;
(0055) 	unsigned int count;
(0056) 	count = 2663;
    0094 E647      LDI	R20,0x67
    0095 E05A      LDI	R21,0xA
    0096 C009      RJMP	0x00A0
(0057) 	while(count--)
(0058) 	{
(0059) 	   for (temp=0; temp<time; temp++);
    0097 2766      CLR	R22
    0098 2777      CLR	R23
    0099 C002      RJMP	0x009C
    009A 5F6F      SUBI	R22,0xFF
    009B 4F7F      SBCI	R23,0xFF
    009C 1760      CP	R22,R16
    009D 0771      CPC	R23,R17
    009E F3D8      BCS	0x009A
(0060) 	   {
(0061)            asm("nop");	
    009F 0000      NOP
    00A0 011A      MOVW	R2,R20
    00A1 5041      SUBI	R20,1
    00A2 4050      SBCI	R21,0
    00A3 2022      TST	R2
    00A4 F791      BNE	0x0097
    00A5 2033      TST	R3
    00A6 F781      BNE	0x0097
    00A7 D154      RCALL	pop_gset2
    00A8 9508      RET
FILE: E:\SOUCER~1\M162MMC\mmc.c
(0001) /******************************************
(0002) * 程序名称: MMC(SD)卡读写程序
(0003) * 程序功能: MMC(SD)卡接口操作
(0004) * 目标硬件: AVR MCU "ATMEGA162" 16.0000MHz
(0005) * 创建日期: 2007-12
(0006) * 原创作者: XuGuoHong 
(0007) *           kk20y@yahoo.com.cn
(0008) * 修改记录: 无
(0009) ******************************************/
(0010) 
(0011) /* INCLUDE参数  */
(0012) #include <iom162v.h>
(0013) 
(0014) /* 全局变量 */
(0015) extern unsigned char sector[512];
(0016) 
(0017) /************************************
(0018) *         MMC卡片选-1选中/0不选中
(0019) ************************************/
(0020) void MMCCS(unsigned char cs)
(0021) {
(0022)    if(cs==0)
_MMCCS:
  cs                   --> R16
    00A9 2300      TST	R16
    00AA F411      BNE	0x00AD
(0023)        PORTB|=(1<<PB4);           /* SS=1 */
    00AB 9AC4      SBI	0x18,4
    00AC C001      RJMP	0x00AE
(0024)    else
(0025)        PORTB&=~(1<<PB4);          /* SS=0 */
    00AD 98C4      CBI	0x18,4
    00AE 9508      RET
_MMCWrCmd:
  k                    --> R20
  i                    --> R22
  temp                 --> R10
  cmd                  --> R12
    00AF D152      RCALL	push_gset4
    00B0 0168      MOVW	R12,R16
(0026) }
(0027) 
(0028) /*******************************
(0029) *        MMC命令发送
(0030) *******************************/
(0031) unsigned char MMCWrCmd(unsigned char *cmd)
(0032) {
(0033)     unsigned char i=0,k=0;
    00B1 2766      CLR	R22
    00B2 2744      CLR	R20
(0034) 	unsigned char temp=0XFF;
    00B3 EF8F      LDI	R24,0xFF
    00B4 2EA8      MOV	R10,R24
(0035)     MMCCS(0);		   			/* 片选无效 */
    00B5 2700      CLR	R16
    00B6 DFF2      RCALL	_MMCCS
(0036) 	spi_send(0XFF);				/* 发送8个时钟 */
    00B7 EF0F      LDI	R16,0xFF
    00B8 E010      LDI	R17,0
    00B9 D135      RCALL	_spi_send
(0037) 	MMCCS(1);		   			/* 片选有效 */
    00BA E001      LDI	R16,1
    00BB DFED      RCALL	_MMCCS
(0038) 	asm("nop");
    00BC 0000      NOP
(0039) 	for(i=0; i<6; i++)
    00BD C006      RJMP	0x00C4
(0040) 	{
(0041) 	    spi_send(*(cmd++));		/* 发送命令 */   
    00BE 01F6      MOVW	R30,R12
    00BF 9101      LD	R16,Z+
    00C0 016F      MOVW	R12,R30
    00C1 2711      CLR	R17
    00C2 D12C      RCALL	_spi_send
    00C3 9563      INC	R22
    00C4 3066      CPI	R22,6
    00C5 F3C0      BCS	0x00BE
    00C6 C00B      RJMP	0x00D2
(0042) 	}
(0043) 	while(temp==0XFF)
(0044) 	{
(0045) 	    temp = spi_send(0XFF);  /* 等待回复 */
    00C7 EF0F      LDI	R16,0xFF
    00C8 E010      LDI	R17,0
    00C9 D125      RCALL	_spi_send
    00CA 2EA0      MOV	R10,R16
(0046) 		if(k++>200)             /* 超时返回 */
    00CB 2E24      MOV	R2,R20
    00CC 2433      CLR	R3
    00CD 5F4F      SUBI	R20,0xFF
    00CE EC88      LDI	R24,0xC8
    00CF 1582      CP	R24,R2
    00D0 F408      BCC	0x00D2
(0047) 		{
(0048) 		    return temp;
    00D1 C004      RJMP	0x00D6
    00D2 2D8A      MOV	R24,R10
    00D3 3F8F      CPI	R24,0xFF
    00D4 F391      BEQ	0x00C7
(0049) 		}
(0050) 	}
(0051)     return temp;
    00D5 2F08      MOV	R16,R24
    00D6 D127      RCALL	pop_gset4
    00D7 9508      RET
_MMCInit:
  temp                 --> R22
  timeout              --> R20
  cmd                  --> Y+0
  i                    --> R20
    00D8 D12D      RCALL	push_gset2
    00D9 9726      SBIW	R28,6
(0052) }
(0053) 
(0054) 
(0055) /*******************************
(0056) *        MMC初始化
(0057) *******************************/
(0058) unsigned char MMCInit(void)
(0059) {
(0060)     unsigned int timeout;
(0061) 	unsigned char i=0,temp=0;
    00DA 2744      CLR	R20
    00DB 2766      CLR	R22
(0062)     unsigned char cmd[]={0x40,0x00,0x00,0x00,0x00,0x95};  
    00DC E780      LDI	R24,0x70
    00DD 940E027C  CALL	<created procedures>
    00DF D183      RCALL	asgncblk
(0063) 	DelayMs(500);
    00E0 EF04      LDI	R16,0xF4
    00E1 E011      LDI	R17,1
    00E2 DFB0      RCALL	_DelayMs
(0064) 	/* 发送一定数量的时钟脉冲 */
(0065)     for(i=0;i<0x10;i++) 
    00E3 C004      RJMP	0x00E8
(0066)     {
(0067)         spi_send(0XFF);
    00E4 EF0F      LDI	R16,0xFF
    00E5 E010      LDI	R17,0
    00E6 D108      RCALL	_spi_send
    00E7 9543      INC	R20
    00E8 3140      CPI	R20,0x10
    00E9 F3D0      BCS	0x00E4
(0068)     }
(0069) 	/* 发送CMD0 */
(0070) 	if(MMCWrCmd(cmd)!=0X01)
    00EA 018E      MOVW	R16,R28
    00EB DFC3      RCALL	_MMCWrCmd
    00EC 3001      CPI	R16,1
    00ED F011      BEQ	0x00F0
(0071) 	   return 0;
    00EE 2700      CLR	R16
    00EF C015      RJMP	0x0105
(0072) 	/* 发送CMD1 */
(0073) 	cmd[0]=0X41;
    00F0 E481      LDI	R24,0x41
    00F1 8388      STD	Y+0,R24
(0074) 	cmd[5]=0XFF;
    00F2 EF8F      LDI	R24,0xFF
    00F3 838D      STD	Y+5,R24

⌨️ 快捷键说明

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