本帖最后由 jyxielong 于 2010-12-25 20:23 编辑
调了两天了。。。。还在初始化。。。汗啊。。。。
MCU mega32 (系统电压3.1V),1M时钟
我用JTAG调试,在初始化后面加断点,发现程序一直在发送CMD0那里死循环
用示波器观察发现,SPI发送出去的数据和数组里的一样,但是MISO引脚上的响应信号一直是高电平(0xff)。。。这是什么原因?
硬件上 我直接用杜邦线和SD卡的脚焊在一起,然后连到单片机IO口上。。。
#include"avr/io.h"
#include"util/delay.h"
volatile unsigned char RR=12,retry=0;
volatile unsigned char i=0,j=0;
unsigned char CMD[6]={0x40,0x00,0x00,0x00,0x00,0x95};
unsigned char RR1[6];
void SPI_init()
{
DDRB|=(1<<;PB4); // SS端设置为输出
DDRB|=(1<<;PB5); // MOSI端口设置为输出
DDRB&=~(1<<;PB6); // MISO端口设置为输入
DDRB|=(1<<;PB7);
SPCR=0x50;//主机模式,使能SPI,时钟4分频,起始沿采样,数据高位在前
PORTB|=(1<<;PB4);//SS=1;片选不使能
PORTB=0xff;//全部IO口使能内部上拉
}
unsigned char spi_sendB(unsigned char temp)
{
unsigned char back=0;
SPDR=temp;
while(!(SPSR&(1<<SPIF)));//等待发送完成
// asm("nop");
back=SPDR;
return back;
}
int main()
{
_delay_ms(2000);
SPI_init();
_delay_ms(2000);
for(i=0;i<20;i++)//至少74个时钟周期
{
spi_sendB(0xff);
}
PORTB&=~(1<<;PB4);//选中片选
do
{
for(i=0;i<6;i++)//发送CMD0命令,设置为SPI模式
{
RR=spi_sendB(CMD);
}
// retry++;
}
while(RR!=1);
。//在这里加断点,程序一直到不了这里
。
。
} |