|
老师你好 :
我重新发帖了 第一次发帖对论坛的管理不是很清楚
多谢几位网友的回复。。。。
最近一直在整SD卡 已经好几天了 也不知道问题出在哪里我使用的是AVRmega128单片机 SD卡 使用的是SanDisk 1G 的MicroSD卡 复位和初始化 都已经成功 在读数据0扇区的时候 读出来的数据与 WINHEX软件里看到的数据不一样 我检查了很多遍程序 也找不到原因 请求老师抽空帮忙看一下 !
![](http://cache.amobbs.com/bbs_upload782111/files_30/ourdev_562296.png)
我的SD卡与AVR128 接口原理用电阻分压得到3.3V (原文件名:ourdev_562197.png)
我把程序也贴出来了
/////////////主函数
#include <iom128v.h>
#include <macros.h>
#include "spi.h"
#include"SD_.h"
#include "uart1.c"
unsigned char temp;
uchar rx_data;
unsigned char FAT32_Buffer[512];
void delay(uint ms)
{
uint i,j;
for(i=0;i<ms;i++)
{
for(j=0;j<1141;j++);
}
}
void main(void)
{
uchar Reset_retry;
uint i;
delay(200);
delay(200);delay(200);delay(200);
DDRA=0XFF;
PORTA=0XFF;
uart_init();
SPI_masterINIT(128); //128分频
for(Reset_retry=0;Reset_retry<5;Reset_retry++)//多复位 增加兼容性
{
SD_Reset();//sd卡复位
}
SPI_masterINIT(2); //2分频
SD_Read_Sector(0,FAT32_Buffer);
for(i=0;i<512;i++)
{
uart_tx(FAT32_Buffer);
}
while(1);
}
/////////////SD卡程序
void uart_init(void)
{
UBRR1L=0x67; //osc=16M ,U2X=0,bit/s=9600
UBRR1H=0x00;
UCSR1B=(1<<RXEN1)|(1<<TXEN1)|(1<<RXCIE1); //RX Enable,TX Enable,RX interrupt Enable
UCSR1C=(1<<UCSZ01)|(1<<UCSZ00); //8bit data ,1bit stop
}
void uart_tx(uchar txc) //send a uchar data
{
while(!(UCSR1A&(1<<UDRE1))); //check send enable
UDR1=txc;
}
unsigned char Write_Com(unsigned char com,unsigned long addr) //写命令
{
unsigned char count,r1;
count=0;
//addr<<=9;
SD_CS_H; //////片选定义 PORTB.0
SPI_R_W_BYTE(0xff);
SD_CS_L ;
SPI_R_W_BYTE(com|0x40);
SPI_R_W_BYTE(addr>>24);
SPI_R_W_BYTE(addr>>16);
SPI_R_W_BYTE(addr>>8);
SPI_R_W_BYTE(addr&0xff);
if(com==0)
SPI_R_W_BYTE(0x95);
else
SPI_R_W_BYTE(0xff);
while((r1=SPI_R_W_BYTE(0xff))==0xff)
{
if((count++)==200)
break;
}
SD_CS_H;
SPI_R_W_BYTE(0xff);
return r1;
}
//sd卡的复位
void SD_Reset(void)
{
unsigned char i,r1;
unsigned int retry=0;
uart_tx(0x55);
uart_tx(0x55);
uart_tx(0x55);
uart_tx(0x55);
do
{
for(i=0;i<20;i++)
{
SPI_R_W_BYTE(0xff);
}
r1=Write_Com(0,0); //写CMD0
if(r1==0x01)
{
PORTA&=~BIT(0);
}
}
while((r1!=0x01)&&((retry++)<1000));
retry=0;
do
{
r1=Write_Com(1,0); //写CMD1
}
while((r1!=0x00)&&((retry++)<300));
r1=Write_Com(59,0);
r1=Write_Com(16,512);
}
//读一个扇区
void SD_Read_Sector(unsigned long SD_addr,unsigned char *buffer)
{
unsigned char i,r1;
unsigned int x;
i=0;
do
{
r1=Write_Com(17,SD_addr<<9);
i++;
}
while((r1!=0x00)&&(i<200));
SD_CS_L ;
while(SPI_R_W_BYTE(0xff)!=0xfe);
PORTA&=~BIT(1);
for(x=0;x<512;x++)
{
buffer[x]=SPI_R_W_BYTE(0XFF);
}
i=SPI_R_W_BYTE(0xff);
i=SPI_R_W_BYTE(0xff);
SD_CS_H ;
SPI_R_W_BYTE(0xff);
}
SPI部分
void SPI_masterINIT(unsigned char x)
{
PORTB=(1<<3)|(1<<0)|(1<<4)|(1<<5)|(1<<6); //miso开启上拉 ss输出高电平
DDRB=(1<<0)|(1<<1)|(1<<2)|(1<<4)|(1<<5)|(1<<6);//设置mosi sck ss输出
switch(x)
{
case 128: //avr技术文档说明其分频数
SPSR&=~(1<<0);SPCR=0x53;break; //128分频率
case 2:
SPSR|=(1<<0);SPCR=0x50;break; //2分频率
}
}
unsigned char SPI_R_W_BYTE(unsigned char spi_data)
{
SPDR=spi_data;
while(!(SPSR&(1<<7)));
return SPDR;
}
程序运行好 如果 SD 卡复位成功 连接在PORTA.0的LED发光 如果初始化成功 PORTA.1的LED发光
读取数据后 通过串口发回 512个字节 到计算机
可是我每次看的数据都一样 但是就跟 WINHEX软件里看到的数据不一致。。。。。。
我读回来的数据
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
C0 00 1F FF 3F 00 00 00 01 00 60 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 02 C7 FF FF <<<<<------这里明显不对 应该是 55 AA 其他的地方也有错误
能想到的 我都想到了 我也看了很多程序了 大同小异 硬件我的 写保护和 卡检测没有接 我想应该没有问题吧
在线等吧 懂得大侠们 也给出出招吧! |
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|