高手帮忙看看,我把代码贴出来,具体现象也描述了一下
我采用买开发板自带的SSP访问SPI口EEPROM的例子时,可以正确访问EEPROM.说明SSP口正常. 当我接上SD卡,发送CMD0,应该收到0x01,实际收到的尽是0xFF. 于是不停的发数据,用示波器观察,SCLK为328KHz,MOSI有数据输出.波形为时钟的上升沿数据稳定,便于SD卡锁存. 硬件是这样连接的:SCLK,MISO,MOSI分别对应接SD.5,SD.7,SD.2, NSS接到SD.1. 我是将NSS配置为普通IO片选的.
是不是应该将 NSS配置为NSS,接到3.3V,然后用另外的一个IO来做片选?
IO配置程序如下: /* SSP0 pins Config */ GPIO_DeInit(GPIO5); /*Gonfigure SSP0_CLK, SSP0_MOSI pins */ GPIO_StructInit(&GPIO_InitStructure); GPIO_InitStructure.GPIO_Direction = GPIO_PinOutput; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5; GPIO_InitStructure.GPIO_Type = GPIO_Type_PushPull ; //GPIO_InitStructure.GPIO_IPConnected = GPIO_IPConnected_Enable; GPIO_InitStructure.GPIO_Alternate = GPIO_OutputAlt2 ; GPIO_Init (GPIO5, &GPIO_InitStructure); /*Configure P5.7*/ GPIO_StructInit(&GPIO_InitStructure); GPIO_InitStructure.GPIO_Direction = GPIO_PinOutput; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; GPIO_InitStructure.GPIO_Type = GPIO_Type_PushPull ; GPIO_InitStructure.GPIO_Alternate = GPIO_OutputAlt1 ; GPIO_Init (GPIO5, &GPIO_InitStructure); GPIO_WriteBit(GPIO5,GPIO_Pin_7,(BitAction)1); /*Gonfigure SSP0_MISO pin GPIO5.6*/ GPIO_StructInit(&GPIO_InitStructure); GPIO_InitStructure.GPIO_Direction = GPIO_PinInput; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; GPIO_InitStructure.GPIO_Type = GPIO_Type_PushPull; GPIO_InitStructure.GPIO_IPConnected = GPIO_IPConnected_Enable; GPIO_InitStructure.GPIO_Alternate = GPIO_InputAlt1; GPIO_Init (GPIO5, &GPIO_InitStructure);
SSP配置: /* SSP0 configuration */ SSP_DeInit(SSP0); SSP_InitStructure.SSP_FrameFormat = SSP_FrameFormat_Motorola; SSP_InitStructure.SSP_Mode = SSP_Mode_Master; SSP_InitStructure.SSP_CPOL = SSP_CPOL_High; // SSP_InitStructure.SSP_CPOL = SSP_CPOL_Low; SSP_InitStructure.SSP_CPHA = SSP_CPHA_2Edge; SSP_InitStructure.SSP_DataSize = SSP_DataSize_8b; SSP_InitStructure.SSP_ClockRate = 100; SSP_InitStructure.SSP_ClockPrescaler = 2; // must be even SSP_Init(SSP0, &SSP_InitStructure);
/* SSP0 enable */ SSP_Cmd(SSP0, ENABLE);
SYSCLK配置: SCU_MCLKSourceConfig(SCU_MCLK_OSC); SCU_PLLFactorsConfig(N,M,P); SCU_PLLCmd(ENABLE); while(!(SCU->SYSSTATUS&SCU_FLAG_LOCK)); SCU_MCLKSourceConfig(SCU_MCLK_PLL);//MCLK=48M SCU_RCLKDivisorConfig(SCU_RCLK_Div4);//RCLK=12M SCU_PCLKDivisorConfig(SCU_PCLK_Div8);//PCLK=12M/8 |
|