//神舟III号开发板
#include "spi.h"
#include "stm32f10x.h"


//串行外设接口SPI的初始化，SPI配置成主模式							  
//本例程选用SPI1对NRF24L01进行读写操作，先对SPI1进行初始化
//void SPI2_Init(void)
//{	 
//	SPI_InitTypeDef  SPI_InitStructure;
//	GPIO_InitTypeDef GPIO_InitStructure;
//	RCC_APB2PeriphClockCmd(	RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE );	
//	RCC_APB1PeriphClockCmd(	RCC_APB1Periph_SPI2, ENABLE );	
//
//	   
//	//SPI1口初始化
//	/* Configure SPI1 pins: SCK, MISO and MOSI */
//	GPIO_InitStructure.GPIO_Pin = SPI2_MISO| SPI2_MOSI| SPI2_SCK;
//	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
//	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//	GPIO_Init(GPIO_SPI2, &GPIO_InitStructure);
//
//    GPIO_SetBits(GPIO_SPI2,SPI2_MISO| SPI2_MOSI| SPI2_SCK);
//
//	/* SPI2 configuration */                                            //初始化SPI1结构体
//	SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;  //SPI1设置为两线全双工
//	SPI_InitStructure.SPI_Mode = SPI_Mode_Master;		                //设置SPI1为主模式
//	SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;		            //SPI发送接收8位帧结构
//	SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;		                    //串行时钟在不操作时，时钟为低电平
//	SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;	                    //第一个时钟沿开始采样数据
//	SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;		                    //NSS信号由软件（使用SSI位）管理
//	SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;  //SPI波特率预分频值为8
//	SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;	                //数据传输从MSB位开始
//	SPI_InitStructure.SPI_CRCPolynomial = 7;	                        //CRC值计算的多项式
//
//	SPI_Init(SPI2, &SPI_InitStructure);                                 //根据SPI_InitStruct中指定的参数初始化外设SPI2寄存器
//	
//	/* Enable SPI2  */
//	SPI_Cmd(SPI2, ENABLE);                                              //使能SPI1外设
//	
//	SPI2_ReadWriteByte(0xff);                                           //启动传输		 
//}  

void SPI1_Init(void)
{	 
	SPI_InitTypeDef  SPI_InitStructure;
	GPIO_InitTypeDef GPIO_InitStructure;
	RCC_APB2PeriphClockCmd(	RCC_APB2Periph_SPI1|RCC_APB2Periph_AFIO, ENABLE );	
	RCC_APB2PeriphClockCmd(	RCC_APB2Periph_GPIOA, ENABLE );	

	   
	//SPI1口初始化
	/* Configure SPI1 pins: SCK, MISO and MOSI */
	GPIO_InitStructure.GPIO_Pin = SPI1_MISO| SPI1_MOSI| SPI1_SCK;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIO_SPI1, &GPIO_InitStructure);

    GPIO_SetBits(GPIO_SPI1,SPI1_MISO| SPI1_MOSI| SPI1_SCK);

	/* SPI2 configuration */                                            //初始化SPI1结构体
	SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;  //SPI1设置为两线全双工
	SPI_InitStructure.SPI_Mode = SPI_Mode_Master;		                //设置SPI1为主模式
	SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;		            //SPI发送接收8位帧结构
	SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;//Low		            //串行时钟在不操作时，时钟为低电平
	SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;//1Edge	                //第一个时钟沿开始采样数据
	SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;		                    //NSS信号由软件（使用SSI位）管理
	SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;  //SPI波特率预分频值为8
	SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;	                //数据传输从MSB位开始
	SPI_InitStructure.SPI_CRCPolynomial = 7;	                        //CRC值计算的多项式

	SPI_Init(SPI1, &SPI_InitStructure);                                 //根据SPI_InitStruct中指定的参数初始化外设SPI2寄存器
	
	/* Enable SPI2  */
	SPI_Cmd(SPI1, ENABLE);                                              //使能SPI1外设
	//SPIx_SetSpeed(SPI_SPEED_8);
	  SPI1->CR1|=7<<3;                                                  //设置为低速模式
	SPI1_ReadWriteByte(0xff);                                           //启动传输		 
}  
//u8 SPI2_ReadWriteByte(u8 TxData)                                        //SPI读写数据函数
//{		
//	u8 retry=0;				 	
//	/* Loop while DR register in not emplty */
//	while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET)      //发送缓存标志位为空
//		{
//		retry++;
//		if(retry>200)return 0;
//		}			  
//	/* Send byte through the SPI1 peripheral */
//	SPI_I2S_SendData(SPI2, TxData);                                    //通过外设SPI1发送一个数据
//	retry=0;
//	/* Wait to receive a byte */
//	while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);   //接收缓存标志位不为空
//		{
//		retry++;
//		if(retry>200)return 0;
//		}	  						    
//	/* Return the byte read from the SPI bus */
//	return SPI_I2S_ReceiveData(SPI2);                                 //通过SPI1返回接收数据				    
//}

u8 SPI1_ReadWriteByte(u8 TxData)                                        //SPI读写数据函数
{		
	u8 retry=0;				 	
	/* Loop while DR register in not emplty */
	while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET)      //发送缓存标志位为空
		{
		retry++;
		if(retry>200)return 0;
		}			  
	/* Send byte through the SPI1 peripheral */
	SPI_I2S_SendData(SPI1, TxData);                                    //通过外设SPI1发送一个数据
	retry=0;
	/* Wait to receive a byte */
	while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET)   //接收缓存标志位为空循环等待
		{
		retry++;
		if(retry>200)return 0;
		}	  						    
	/* Return the byte read from the SPI bus */
	return SPI_I2S_ReceiveData(SPI1);                                 //通过SPI1返回接收数据				    
}
 void SPIx_SetSpeed(u8 SpeedSet)
  { 
      SPI1->CR1&=0XFFC7;   //Fsck=Fcpu/256 
      if(SpeedSet==SPI_SPEED_2) //二分频 
     { 
       SPI1->CR1|=0<<3; //Fsck=Fpclk/2=36Mhz 
      }
      else if(SpeedSet==SPI_SPEED_8)
          //八分频 
      { 
         SPI1->CR1|=2<<3; //Fsck=Fpclk/8=9Mhz 
       }
      else if(SpeedSet==SPI_SPEED_16)
        //十六分频 
      { 
        SPI1->CR1|=3<<3; //Fsck=Fpclk/16=4.5Mhz 
      }
      else                       //256 分频 
      { 
          SPI1->CR1|=7<<3;  //Fsck=Fpclk/256=281.25Khz             低速模式 
       } 
        SPI1->CR1|=1<<6;    //SPI 设备使能 
} 



















