大家好,本来是STM32F4用SPI1读写SD卡,后发现SPI1通信存在问题,用原子版本程序移植不成功。
硬件连接PA4--CS PA5--SCK PA6--MISO PA7--MOSI
用两种方式初始化SPI1,主函数执行SPI1_ReadWriteByte(0xFF)观察返回值,总是不对。相同程序把SPI1改到SPI2,一直得到0xFF,正确。
1)如下初始化,主程序一直返回0x00
void SPI1_Init(void)
{
u16 tempreg=0;
RCC->APB2ENR|=1<<12;
GPIO_Set(GPIOA,PIN5|PIN6|PIN7,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PU);
GPIO_AF_Set(GPIOA,5,5); //PA5,AF5
GPIO_AF_Set(GPIOA,6,5); //PA6,AF5
GPIO_AF_Set(GPIOA,7,5); //PA7,AF5
RCC->APB2RSTR|=1<<12;
RCC->APB2RSTR&=~(1<<12);
tempreg|=0<<10;
tempreg|=1<<9;
tempreg|=1<<8;
tempreg|=1<<2;
tempreg|=0<<11;
tempreg|=1<<1;
tempreg|=1<<0;
//
tempreg|=7<<3; //Fsck=Fpclk1/256
tempreg|=0<<7; //MSB First
tempreg|=1<<6; //SPI
SPI1->CR1=tempreg; //
SPI1->I2SCFGR&=~(1<<11);//
SPI1_ReadWriteByte(0xff);//
}
2)如下初始化,主程序一直返回0xFE
void SPI1_Init(void)
{
RCC->APB2ENR|=1<<12;
GPIO_Set(GPIOA,PIN5|PIN6|PIN7,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PU);
GPIO_AF_Set(GPIOA,5,5); //PA5,AF5
GPIO_AF_Set(GPIOA,6,5); //PA6,AF5
GPIO_AF_Set(GPIOA,7,5); //PA7,AF5
RCC->APB2RSTR|=1<<12; //
RCC->APB2RSTR&=~(1<<12);//
SPI1->CR1|=0<<10; //全双工模式
SPI1->CR1|=1<<9; //软件nss管理
SPI1->CR1|=1<<8;
SPI1->CR1|=1<<2; //SPI主机
SPI1->CR1|=0<<11; //8bit数据格式
SPI1->CR1|=1<<1; //空闲模式下SCK为1 CPOL=1
SPI1->CR1|=1<<0; //数据采样从第二个时间边沿开始,CPHA=1
//对SPI2属于APB1的外设.时钟频率最大为36M.
SPI1->CR1|=3<<3; //Fsck=Fpclk1/256
SPI1->CR1|=0<<7; //MSBfirst
SPI1->CR1|=1<<6; //SPI设备使能
SPI1->CR1=tempreg; //
SPI1->I2SCFGR&=~(1<<11);//
SPI1_ReadWriteByte(0xff);//
}
|