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

📄 sd.lss

📁 FATFS(10.4).rar
💻 LSS
📖 第 1 页 / 共 5 页
字号:
}
     324:	df 91       	pop	r29
     326:	cf 91       	pop	r28
     328:	1f 91       	pop	r17
     32a:	0f 91       	pop	r16
     32c:	ff 90       	pop	r15
     32e:	08 95       	ret

00000330 <send_buf>:
void send_buf(UINT8 *Buffer)     //将缓冲区的数据通过串口发送到电脑
{
     330:	20 e0       	ldi	r18, 0x00	; 0
     332:	30 e0       	ldi	r19, 0x00	; 0
  uint16_t k=0;
  for(k=0;k<512;k++)
  {
    USART_Send_Char(Buffer[k]);
     334:	fc 01       	movw	r30, r24
     336:	e2 0f       	add	r30, r18
     338:	f3 1f       	adc	r31, r19
     33a:	e0 81       	ld	r30, Z
	//UBRRL = (((F_CPU/BAUD)/16)-1)%256;	
	UCSRB |= (1<<RXEN)|(1<<TXEN)|(1<<RXCIE); //使能发送,接收,接收完成中断	
}
void USART_Send_Char(unsigned char data)
{	
	while( !(UCSRA & (1<<UDRE)));	//等待发送缓冲器为空	
     33c:	5d 9b       	sbis	0x0b, 5	; 11
     33e:	fe cf       	rjmp	.-4      	; 0x33c <send_buf+0xc>
	UDR = data;	//将数据放入缓冲区,发送数据
     340:	ec b9       	out	0x0c, r30	; 12
  USART_Send_Str("\r\n");
}
void send_buf(UINT8 *Buffer)     //将缓冲区的数据通过串口发送到电脑
{
  uint16_t k=0;
  for(k=0;k<512;k++)
     342:	2f 5f       	subi	r18, 0xFF	; 255
     344:	3f 4f       	sbci	r19, 0xFF	; 255
     346:	42 e0       	ldi	r20, 0x02	; 2
     348:	20 30       	cpi	r18, 0x00	; 0
     34a:	34 07       	cpc	r19, r20
     34c:	99 f7       	brne	.-26     	; 0x334 <send_buf+0x4>
  {
    USART_Send_Char(Buffer[k]);
  }
}
     34e:	08 95       	ret

00000350 <SPI_Low>:


/*******************************  SPI模式设置  ***********************************/

void SPI_Low(void)		
{//SPI低速模式
     350:	1d b8       	out	0x0d, r1	; 13
	SPCR = 0;
	SPCR = (1 << SPE) | (1 << MSTR) | (1 << SPR0) | (1 << SPR1);
     352:	83 e5       	ldi	r24, 0x53	; 83
     354:	8d b9       	out	0x0d, r24	; 13
	//使能SPI,主机方式,MSB在前,模式0,128分频
}
     356:	08 95       	ret

00000358 <SPI_High>:

void SPI_High(void)
{//SPI高速模式
     358:	1d b8       	out	0x0d, r1	; 13
	SPCR = 0;
	SPCR = (1 << SPE) | (1 << MSTR);
     35a:	80 e5       	ldi	r24, 0x50	; 80
     35c:	8d b9       	out	0x0d, r24	; 13
	SPSR |= (1 << SPI2X);
     35e:	70 9a       	sbi	0x0e, 0	; 14
	//使能SPI,主机方式,MSB在前,模式0,4分频,2倍频
}
     360:	08 95       	ret

00000362 <SPI_Init>:

void SPI_Init(void)
{//SPI初始化
     362:	80 e5       	ldi	r24, 0x50	; 80
     364:	88 bb       	out	0x18, r24	; 24
	SPI_PORT = (1 << SPI_SS) | (1 << SPI_MISO);		//将SS置位输出拉高,MISO输入带上拉
	SPI_DDR = (1 << SPI_SS) | (1 << SPI_MOSI) | (1 << SPI_SCK);
     366:	80 eb       	ldi	r24, 0xB0	; 176
     368:	87 bb       	out	0x17, r24	; 23
	//将SS SCK MOSI置为输出	
}
     36a:	08 95       	ret

0000036c <SPI_RW>:

uint8_t SPI_RW(uint8_t dat)
{//SPI读写1Byte(欲想读之必先与之)
     36c:	8f b9       	out	0x0f, r24	; 15
	SPDR = dat;
	while(!(SPSR & (1 << SPIF)))
     36e:	77 9b       	sbis	0x0e, 7	; 14
     370:	fe cf       	rjmp	.-4      	; 0x36e <SPI_RW+0x2>
		;
	return (SPDR);
     372:	8f b1       	in	r24, 0x0f	; 15
}
     374:	08 95       	ret

00000376 <SD_Write_Cmd>:
 - 参数说明:SD卡的命令是6个字节,pcmd是指向命令字节序列的指针
 - 返回说明:命令写入后,SD卡的回应值,调用不成功,将返回0xff
 **********************************************************************************/

uint8_t SD_Write_Cmd(uint8_t *pcmd) //向SD卡写命令,pcmd是命令字节序列的首地址
{
     376:	fc 01       	movw	r30, r24
	uint8_t i,temp,retry;

	SET_SD_CS;					//关片选
     378:	d8 9a       	sbi	0x1b, 0	; 27
	//将SS SCK MOSI置为输出	
}

uint8_t SPI_RW(uint8_t dat)
{//SPI读写1Byte(欲想读之必先与之)
	SPDR = dat;
     37a:	8f ef       	ldi	r24, 0xFF	; 255
     37c:	8f b9       	out	0x0f, r24	; 15
	while(!(SPSR & (1 << SPIF)))
     37e:	77 9b       	sbis	0x0e, 7	; 14
     380:	fe cf       	rjmp	.-4      	; 0x37e <SD_Write_Cmd+0x8>
		;
	return (SPDR);
     382:	8f b1       	in	r24, 0x0f	; 15
{
	uint8_t i,temp,retry;

	SET_SD_CS;					//关片选
 	SPI_RW(0XFF); 				//提高兼容性,如果没有这里,有些SD卡可能不支持   
	CLR_SD_CS;					//开片选(后面的读写扇区可以省去开片选)
     384:	d8 98       	cbi	0x1b, 0	; 27
	asm("nop");
     386:	00 00       	nop
     388:	90 e0       	ldi	r25, 0x00	; 0
	
	for(i=0;i<6;i++)
	{
		SPI_RW(*pcmd);
     38a:	80 81       	ld	r24, Z
	//将SS SCK MOSI置为输出	
}

uint8_t SPI_RW(uint8_t dat)
{//SPI读写1Byte(欲想读之必先与之)
	SPDR = dat;
     38c:	8f b9       	out	0x0f, r24	; 15
	while(!(SPSR & (1 << SPIF)))
     38e:	77 9b       	sbis	0x0e, 7	; 14
     390:	fe cf       	rjmp	.-4      	; 0x38e <SD_Write_Cmd+0x18>
		;
	return (SPDR);
     392:	8f b1       	in	r24, 0x0f	; 15
	SET_SD_CS;					//关片选
 	SPI_RW(0XFF); 				//提高兼容性,如果没有这里,有些SD卡可能不支持   
	CLR_SD_CS;					//开片选(后面的读写扇区可以省去开片选)
	asm("nop");
	
	for(i=0;i<6;i++)
     394:	9f 5f       	subi	r25, 0xFF	; 255
     396:	96 30       	cpi	r25, 0x06	; 6
     398:	11 f0       	breq	.+4      	; 0x39e <SD_Write_Cmd+0x28>
	{
		SPI_RW(*pcmd);
		pcmd++;
     39a:	31 96       	adiw	r30, 0x01	; 1
     39c:	f6 cf       	rjmp	.-20     	; 0x38a <SD_Write_Cmd+0x14>
	//将SS SCK MOSI置为输出	
}

uint8_t SPI_RW(uint8_t dat)
{//SPI读写1Byte(欲想读之必先与之)
	SPDR = dat;
     39e:	8f ef       	ldi	r24, 0xFF	; 255
     3a0:	8f b9       	out	0x0f, r24	; 15
	while(!(SPSR & (1 << SPIF)))
     3a2:	77 9b       	sbis	0x0e, 7	; 14
     3a4:	fe cf       	rjmp	.-4      	; 0x3a2 <SD_Write_Cmd+0x2c>
		;
	return (SPDR);
     3a6:	8f b1       	in	r24, 0x0f	; 15
     3a8:	90 e0       	ldi	r25, 0x00	; 0
	//将SS SCK MOSI置为输出	
}

uint8_t SPI_RW(uint8_t dat)
{//SPI读写1Byte(欲想读之必先与之)
	SPDR = dat;
     3aa:	2f ef       	ldi	r18, 0xFF	; 255
     3ac:	2f b9       	out	0x0f, r18	; 15
	while(!(SPSR & (1 << SPIF)))
     3ae:	77 9b       	sbis	0x0e, 7	; 14
     3b0:	fe cf       	rjmp	.-4      	; 0x3ae <SD_Write_Cmd+0x38>
		;
	return (SPDR);
     3b2:	8f b1       	in	r24, 0x0f	; 15
	retry = 0;
	do							//不断地读
	{
		temp = SPI_RW(0XFF);
		retry++;		
	}while((temp == 0XFF) && (retry < 254));
     3b4:	8f 3f       	cpi	r24, 0xFF	; 255
     3b6:	19 f4       	brne	.+6      	; 0x3be <SD_Write_Cmd+0x48>

	retry = 0;
	do							//不断地读
	{
		temp = SPI_RW(0XFF);
		retry++;		
     3b8:	9f 5f       	subi	r25, 0xFF	; 255
	}while((temp == 0XFF) && (retry < 254));
     3ba:	9e 3f       	cpi	r25, 0xFE	; 254
     3bc:	b9 f7       	brne	.-18     	; 0x3ac <SD_Write_Cmd+0x36>
	
	return (temp);
}
     3be:	08 95       	ret

000003c0 <SD_Reset>:
 - 参数说明:无
 - 返回说明:调用成功,返回0x00,否则返回INIT_CMD0_ERROR (sd.h中有定义)
 **********************************************************************************/

uint8_t SD_Reset()//SD卡复位,进入SPI模式,使用CMD0(0号命令)
{
     3c0:	ef 92       	push	r14
     3c2:	ff 92       	push	r15
     3c4:	0f 93       	push	r16
     3c6:	1f 93       	push	r17
     3c8:	df 93       	push	r29
     3ca:	cf 93       	push	r28
     3cc:	00 d0       	rcall	.+0      	; 0x3ce <SD_Reset+0xe>
     3ce:	00 d0       	rcall	.+0      	; 0x3d0 <SD_Reset+0x10>
     3d0:	00 d0       	rcall	.+0      	; 0x3d2 <SD_Reset+0x12>
     3d2:	cd b7       	in	r28, 0x3d	; 61
     3d4:	de b7       	in	r29, 0x3e	; 62
	uint8_t retry,temp,i;
	uint8_t pcmd[] = {0x40,0x00,0x00,0x00,0x00,0x95}; 	
     3d6:	de 01       	movw	r26, r28
     3d8:	11 96       	adiw	r26, 0x01	; 1
     3da:	e0 ed       	ldi	r30, 0xD0	; 208
     3dc:	f0 e0       	ldi	r31, 0x00	; 0
     3de:	86 e0       	ldi	r24, 0x06	; 6
     3e0:	01 90       	ld	r0, Z+
     3e2:	0d 92       	st	X+, r0
     3e4:	81 50       	subi	r24, 0x01	; 1
     3e6:	e1 f7       	brne	.-8      	; 0x3e0 <SD_Reset+0x20>
	//使能SPI,主机方式,MSB在前,模式0,4分频,2倍频
}

void SPI_Init(void)
{//SPI初始化
	SPI_PORT = (1 << SPI_SS) | (1 << SPI_MISO);		//将SS置位输出拉高,MISO输入带上拉
     3e8:	80 e5       	ldi	r24, 0x50	; 80
     3ea:	88 bb       	out	0x18, r24	; 24
	SPI_DDR = (1 << SPI_SS) | (1 << SPI_MOSI) | (1 << SPI_SCK);
     3ec:	80 eb       	ldi	r24, 0xB0	; 176
     3ee:	87 bb       	out	0x17, r24	; 23

/*******************************  SPI模式设置  ***********************************/

void SPI_Low(void)		
{//SPI低速模式
	SPCR = 0;
     3f0:	1d b8       	out	0x0d, r1	; 13
	SPCR = (1 << SPE) | (1 << MSTR) | (1 << SPR0) | (1 << SPR1);
     3f2:	83 e5       	ldi	r24, 0x53	; 83
     3f4:	8d b9       	out	0x0d, r24	; 13
     3f6:	1f ef       	ldi	r17, 0xFF	; 255
	//将SS SCK MOSI置为输出	
}

uint8_t SPI_RW(uint8_t dat)
{//SPI读写1Byte(欲想读之必先与之)
	SPDR = dat;
     3f8:	0f ef       	ldi	r16, 0xFF	; 255
		for(i=0;i<0x0f;i++) //初始时,首先要发送最少74个时钟信号,这是必须的!!!
		{
			SPI_RW(0XFF);
		}

		temp = SD_Write_Cmd(pcmd);				//写入CMD0
     3fa:	7e 01       	movw	r14, r28
     3fc:	08 94       	sec
     3fe:	e1 1c       	adc	r14, r1
     400:	f1 1c       	adc	r15, r1
	SPI_Low();						//SPI低速模式

	retry = 0;
	do
	{ 
		SET_SD_CS;
     402:	d8 9a       	sbi	0x1b, 0	; 27
     404:	80 e0       	ldi	r24, 0x00	; 0
	//将SS SCK MOSI置为输出	
}

uint8_t SPI_RW(uint8_t dat)
{//SPI读写1Byte(欲想读之必先与之)
	SPDR = dat;
     406:	0f b9       	out	0x0f, r16	; 15
	while(!(SPSR & (1 << SPIF)))
     408:	77 9b       	sbis	0x0e, 7	; 14
     40a:	fe cf       	rjmp	.-4      	; 0x408 <SD_Reset+0x48>
		;
	return (SPDR);
     40c:	9f b1       	in	r25, 0x0f	; 15

	retry = 0;
	do
	{ 
		SET_SD_CS;
		for(i=0;i<0x0f;i++) //初始时,首先要发送最少74个时钟信号,这是必须的!!!
     40e:	8f 5f       	subi	r24, 0xFF	; 255
     410:	8f 30       	cpi	r24, 0x0F	; 15
     412:	c9 f7       	brne	.-14     	; 0x406 <SD_Reset+0x46>
		{
			SPI_RW(0XFF);
		}

		temp = SD_Write_Cmd(pcmd);				//写入CMD0
     414:	c7 01       	movw	r24, r14
     416:	0e 94 bb 01 	call	0x376	; 0x376 <SD_Write_Cmd>
     41a:	11 50       	subi	r17, 0x01	; 1
		retry++;
		if(retry > 254) 
     41c:	19 f4       	brne	.+6      	; 0x424 <SD_Reset+0x64>
		{ 
			SET_SD_CS;							//关闭片选
     41e:	d8 9a       	sbi	0x1b, 0	; 27
     420:	81 e0       	ldi	r24, 0x01	; 1
     422:	09 c0       	rjmp	.+18     	; 0x436 <SD_Reset+0x76>
			return(INIT_CMD0_ERROR);			//CMD0写入失败
		}
	}while(temp != 0x01);
     424:	81 30       	cpi	r24, 0x01	; 1
     426:	69 f7       	brne	.-38     	; 0x402 <SD_Reset+0x42>

	SET_SD_CS;
     428:	d8 9a       	sbi	0x1b, 0	; 27
	//将SS SCK MOSI置为输出	
}

uint8_t SPI_RW(uint8_t dat)
{//SPI读写1Byte(欲想读之必先与之)
	SPDR = dat;
     42a:	8f ef       	ldi	r24, 0xFF	; 255
     42c:	8f b9       	out	0x0f, r24	; 15
	while(!(SPSR & (1 << SPIF)))
     42e:	77 9b       	sbis	0x0e, 7	; 14
     430:	fe cf       	rjmp	.-4      	; 0x42e <SD_Reset+0x6e>
		;
	return (SPDR);
     432:	8f b1       	in	r24, 0x0f	; 15
     434:	80 e0       	ldi	r24, 0x00	; 0
	}while(temp != 0x01);

	SET_SD_CS;
	SPI_RW(0XFF); 								//按照SD卡的操作时序在这里补8个时钟	
	return 0;									//返回0,说明复位操作成功
}
     436:	26 96       	adiw	r28, 0x06	; 6

⌨️ 快捷键说明

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