我用的是mini的开发板,硬件的SPI看完了,想试验一下自己模拟的,我的函数如下:
void SpiSim_Init(void)//IO口初始化的函数
{
GPIO_InitTypeDef GPIO_Structure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_Structure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Structure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_7;
GPIO_Structure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_Structure);
GPIO_SetBits(GPIOA,GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4)
GPIO_Structure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Structure.GPIO_Pin = GPIO_Pin_6;
GPIO_Init(GPIOA,&GPIO_Structure);
}
void SpiSim_SendOneByte(u8 byte,u8 InitFlag)//写函数,后面的u8 InitFlag是设置spi速度的
{
u8 i;
for(i=8;i;i--)
{
SpiSim_SCK = 0;
SpiSim_MOSI=(byte&0x80)>>7;
byte<<=1;
if(InitFlag)delay_us(2);
SpiSim_SCK = 1;
if(InitFlag)delay_us(2);
}
SpiSim_MOSI=1;
}
u8 SpiSim_ReadOneByte(u8 InitFlag)//读函数
{
u8 i,recive;
for(i=8;i>=1;i--)
{
SpiSim_SCK = 0;
if(InitFlag)delay_us(2);
SpiSim_SCK = 1;
if(InitFlag)delay_us(2);
recive<<=1;
if(SpiSim_MISO)
{
recive++;
}
}
return recive;
}
void SD_SendCMD(u8 cmd,u32 arg,u8 crc,u8 speed)//发送CMD
{
SpiSim_SendOneByte(cmd|0x40,speed);
SpiSim_SendOneByte(arg>>24,speed);
SpiSim_SendOneByte(arg>>16,speed);
SpiSim_SendOneByte(arg>>8,speed);
SpiSim_SendOneByte(arg,speed);
SpiSim_SendOneByte(crc,speed);
}
u8 SD_Response(u8 speed)//接收响应
{
u8 response=0,count=20;
do
{
response=SpiSim_ReadOneByte(speed);
}while(response==0x01&&count--);
return response;
}
u8 SD_Init(void)//SD初始化
{
volatile u8 i,response=0;
u8 buf[4];
u16 count;
SpiSim_Init();
SD_CS = 1;//Ƭѡ
for(i=0;i<15;i++)
{
SpiSim_SendOneByte(0xff,0x01);//至少74个时钟,我这里用了120个
}
SD_CS = 0;
count=0;
SD_SendCMD(CMD0,0,0x95,0x01);
response=SD_Response(0x01);
if(response==0x01)
{
//保留
}
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
问题解决,具体原因不知道我在网上查到的资料:
http://blog.163.com/dreamatic_al ... 045420137892747845/
按着这个上面发送完cnd55重新片选一下就好了。
#define SpiSim_SCK PAout(5)
#define SpiSim_MISO PAin(6)
#define SpiSim_MOSI PAout(7)
这是IO的定义
一周热门 更多>