下面我把自己的程序放上来,(只到CMD17那,后面的还没写),大家帮忙看下。因为我的学习板上P1口有8个小LED,所以将response赋值给P1,就可以直接看到response。
#include <reg52.h> #define uchar unsigned char
uchar CMD0[] ={0x40|0 ,0,0,0,0,0x95}; uchar CMD55[]={0x40|55,0,0,0,0,0x95}; uchar CMD41[]={0x40|41,0,0,0,0,0x95}; uchar CMD17[]={0x40|17,0,0,0,0,0x95};
sbit SDCS=P2^0; sbit MOSI=P2^6; sbit SCLK=P2^4; sbit MISO=P2^2;
uchar _readByte(void); void _writeByte(uchar cmd); //所有的操作基于_readByte() 和_writeByte(),仅此2个函数涉及 SDCS 的开关 void _writeCMD(uchar* CMD); void _init(void); //============================================================== void main() { uchar response; _init(); _writeCMD( CMD17 ); _writeByte(0xff); //dummy response=_readByte(); // P1=response; while(1); //pass 这里得到 0x00的回应 _writeByte( 0xff ); //dummy P1=_readByte(); while(1); //这条用于测试能否得到0xfe 结果得到的是1111,1100 } //============================================================== uchar _readByte(void) { uchar i,response; SCLK=1; SDCS=0; for(i=8;i;i--) { SCLK=1; SCLK=0; response<<=1; if(MISO) response+=1; } SDCS=1; return response; } //================================================ void _writeByte(uchar cmd) //mcu在0->1跳变时将数据发出 { uchar i; SCLK=0; SDCS=0; for(i=8;i;i--) { SCLK=0; cmd<<=1; MOSI=CY; SCLK=1; } SDCS=1; } //================================================ void _writeCMD(uchar* CMD) { uchar i; uchar* tmp=CMD; for(i=6;i;i--) { _writeByte(*tmp); tmp++; } } //================================================ void _init(void) { uchar i; for(i=10;i;i--) _writeByte(0xff); //delay for over 74 clock cycles SDCS=0; _writeCMD( CMD0 ); _writeByte(0xff); //dummy // P1=_readByte();while(1); //pass, get 0x01 i=_readByte(); while(i) { _writeCMD( CMD55); _writeByte(0xff); _writeCMD( CMD41); _writeByte(0xff); i=_readByte(); } // P1=i;while(1); //pass, get 0x00 }
|