我软仿看时序好像都对,就是实测不行。老是不能复位,GPIO配置应该是对的,谁帮我看看SPI和SD_Reset两格函数哪里不对。
[mw_shl_code=c,true] #include"stm32f10X.h"
#include"stm32f10x_conf.h"
#define SCK 0
#define MOSI 1
#define MISO 2
#define CS 3
#define delaytime 200
void print(char *file);
void delayus(u16 time);
u8 SPI (u8,u8);
void SDGPIO_Init();
void SD_Reset();
void USART();
int main()
{
//SD_Init();
USART();
print(" ");
print("Usart init successf!\n");
SDGPIO_Init();
while(1)
{
SD_Reset();
}
while(1);
}
void print(char *file)
{
while(*file!=0)
{
USART_SendData (USART1 ,*file);
file++;
while(USART_GetFlagStatus (USART1,USART_FLAG_TC )==RESET );
}
}
void USART()
{
USART_InitTypeDef usart;
GPIO_InitTypeDef gpio;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1 ,ENABLE);
gpio.GPIO_Mode =GPIO_Mode_AF_PP;
gpio.GPIO_Pin=GPIO_Pin_9 ;
gpio.GPIO_Speed =GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&gpio );
gpio.GPIO_Mode =GPIO_Mode_IN_FLOATING;
gpio.GPIO_Pin =GPIO_Pin_10 ;
GPIO_Init (GPIOA,&gpio );
usart.USART_BaudRate=9600;
usart.USART_HardwareFlowControl =USART_HardwareFlowControl_None ;
usart.USART_Mode =USART_Mode_Rx |USART_Mode_Tx ;
usart.USART_Parity =USART_Parity_No;
usart.USART_StopBits =USART_StopBits_1 ;
usart.USART_WordLength =USART_WordLength_8b ;
USART_Init(USART1 ,&usart );
USART_Cmd (USART1,ENABLE );
}
void delayus(u16 time)
{
u16 dir;
u16 dir1;
for(dir1=0;dir1<time;dir1++)
{
for(dir=0;dir<10;dir++);
}
}
u8 SPI(u8 ch,u8 RESET)
{
u8 dir=0;
PAOut(SCK)=0;
if(RESET==1)
delayus(delaytime);
for(dir=0;dir<8;dir++)
{
if(ch&&0x7f!=0)
{
PAOut(MOSI)=1;
}
else
{
PAOut(MOSI)=0;
}
if(RESET==1)
delayus(delaytime);
PAOut(SCK)=1;
if(RESET==1)
delayus(delaytime);
ch=ch<<1;
PAOut(SCK)=0;
if(RESET==1)
delayus(delaytime);
ch|=PAIn(MISO);
}
return ch ;
}
void SDGPIO_Init()
{
GPIO_InitTypeDef gpio;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
gpio.GPIO_Mode =GPIO_Mode_Out_PP;
gpio.GPIO_Pin =GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_3 ;
gpio.GPIO_Speed =GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&gpio);
gpio.GPIO_Pin=GPIO_Pin_2;
gpio.GPIO_Mode=GPIO_Mode_IPU;
GPIO_Init(GPIOA,&gpio);
}
void SD_Reset()
{
u8 dir=0;
PAOut(CS)=1;
delayus(delaytime);
for(dir=0;dir<10;dir++) SPI(0xff,1);
delayus(delaytime);
PAOut(CS)=0;
delayus(delaytime);
SPI(0x40,1);
SPI(0x00,1);
SPI(0x00,1);
SPI(0x00,1);
SPI(0x00,1);
SPI(0x95,1);
for(dir=0;dir<50;dir++)
{
if(SPI(0xff,1)!=0xff)print("SD reset successf!\n");
}
}
SD_ResetSD_Reset[/mw_shl_code]
|