📄 sd.lss
字号:
}
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 + -