Exemple #1
0
u8 NRF24L01_TxPacket(u8 *txbuf)
{
	u8 sta;
	u16 Time_out_count=0;
	SPI2_SetSpeed(SPI_SPEED_8);//spi速度为9Mhz(24L01的最大SPI时钟为10Mhz)   
	NRF24L01_CE_L();
	NRF24L01_Write_Buf(NRF24L01_WR_TX_PLOAD,txbuf,NRF24L01_TX_PLOAD_WIDTH);//写数据到TX BUF  32个字节
	NRF24L01_CE_H();                 //启动发送   
	while(GPIOB->IDR&1<<11) //等待发送完成
	{
		++Time_out_count;
		if(Time_out_count>=65535)
			return 0xfe;//time out 
	}
	sta=NRF24L01_Read_Reg(NRF24L01_STATUS);  //读取状态寄存器的值   
	NRF24L01_Write_Reg(NRF24L01_WRITE_REG+NRF24L01_STATUS,sta); //清除TX_DS或MAX_RT中断标志
	if(sta&NRF24L01_MAX_TX)//达到最大重发次数
	{
		NRF24L01_Write_Reg(NRF24L01_FLUSH_TX,0xff);//清除TX FIFO寄存器 
		return NRF24L01_MAX_TX; 
	}
	if(sta&NRF24L01_TX_OK)//发送完成
	{
		return NRF24L01_TX_OK;
	}
	return 0xff;//其他原因发送失败
}
Exemple #2
0
//检测24L01是否存在
//返回值:0,成功;1,失败	
u8 NRF24L01_Check(void)
{
	u8 buf[5]={0XA5,0XA5,0XA5,0XA5,0XA5};
	u8 i;
	SPI2_SetSpeed(SPI_BaudRatePrescaler_8); //spi速度为9Mhz(24L01的最大SPI时钟为10Mhz)   	 
	NRF24L01_Write_Buf(WRITE_REG_NRF+TX_ADDR,buf,5);//写入5个字节的地址.	
	NRF24L01_Read_Buf(TX_ADDR,buf,5); //读出写入的地址  
	for(i=0;i<5;i++)if(buf[i]!=0XA5)break;	 							   
	if(i!=5)return 1;//检测24L01错误	
	return 0;		 //检测到24L01
}	 	 
void ENC28J60_Reset(void)
{
 	 
	ENC28J60_SPI2_Init(); //re-init SPI2
	SPI2_SetSpeed(SPI_BaudRatePrescaler_4);	//9MHz
 	TIM4_Init(1000,719);//setup a clock for ENC28J60
	ENC28J60_RST_CLEAR(); //reset ENC28J60		
	ENC28J60_delayms(10);	 
	ENC28J60_RST_SET();	//finish reset			    
	ENC28J60_delayms(10);	 
}
Exemple #4
0
//启动NRF24L01发送一次数据
//txbuf:待发送数据首地址
//返回值:0,接收完成;其他,错误代码
u8 NRF24L01_RxPacket(u8 *rxbuf)
{
	u8 sta;		    							   
	SPI2_SetSpeed(SPI_BaudRatePrescaler_8); //spi速度为9Mhz(24L01的最大SPI时钟为10Mhz)   
	sta=NRF24L01_Read_Reg(STATUS);  //读取状态寄存器的值    	 
	NRF24L01_Write_Reg(WRITE_REG_NRF+STATUS,sta); //清除TX_DS或MAX_RT中断标志
	if(sta&RX_OK)//接收到数据
	{
		NRF24L01_Read_Buf(RD_RX_PLOAD,rxbuf,RX_PLOAD_WIDTH);//读取数据
		NRF24L01_Write_Reg(FLUSH_RX,0xff);//清除RX FIFO寄存器 
		return 0; 
	}	   
	return 1;//没收到任何数据
}					    
Exemple #5
0
////////////////////
///
///注意:执行完后会进入待机模式,如需进行下一次接收,必须使能CE,或者重新使用NRF24L01_RX_Mode();进入接收模式
//////////////////////
u8 NRF24L01_RxPacket(u8 *rxbuf)
{
	u8 sta;
	NRF24L01_CE_L();	//进入待机模式
	SPI2_SetSpeed(SPI_SPEED_8); //spi速度为9Mhz(24L01的最大SPI时钟为10Mhz)   
	sta=NRF24L01_Read_Reg(NRF24L01_STATUS);  //读取状态寄存器的值      
	NRF24L01_Write_Reg(NRF24L01_WRITE_REG+NRF24L01_STATUS,sta); //清除TX_DS或MAX_RT中断标志	
	if(sta&NRF24L01_RX_OK)//接收到数据
	{
		NRF24L01_Read_Buf(NRF24L01_RD_RX_PLOAD,rxbuf,NRF24L01_RX_PLOAD_WIDTH);//读取数据
		NRF24L01_Write_Reg(NRF24L01_FLUSH_RX,0xff);//清除RX FIFO寄存器 
		return NRF24L01_RX_OK; 
	}
	
	return 0;//没收到任何数据
}    
Exemple #6
0
u8 NRF24L01_Check(void)
{
	u8 buf[5]={0XA5,0XA5,0XA5,0XA5,0XA5};
	u8 i;
	SPI2_SetSpeed(SPI_SPEED_8); //spi速度为9Mhz(24L01的最大SPI时钟为10Mhz)    
	NRF24L01_Write_Buf(NRF24L01_WRITE_REG+NRF24L01_TX_ADDR,buf,5);//写入5个字节的地址.
	NRF24L01_Read_Buf(NRF24L01_TX_ADDR,buf,5); //读出写入的地址  
	for(i=0;i<5;i++)
	{
		if(buf[i]!=0XA5)
			break; 
	}		
	if(i==5)
		return 1;//检测到24L01
	return 0; //检测24L01错误
}  
//初始化SPI FLASH的IO口
void W25QXX_Init(void)
{	
  GPIO_InitTypeDef GPIO_InitStructure;
	RCC_APB2PeriphClockCmd(	RCC_APB2Periph_GPIOB, ENABLE );//PORTB时钟使能 

	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;  // PB12 推挽 
 	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 	GPIO_Init(GPIOB, &GPIO_InitStructure);
 	GPIO_SetBits(GPIOB,GPIO_Pin_12);
 
        W25QXX_CS=1;				//SPI FLASH不选中
//	SPI2_Init();		   	//初始化SPI
	SPI2_SetSpeed(SPI_BaudRatePrescaler_2);//设置为18M时钟,高速模式
	W25QXX_TYPE=W25QXX_ReadID();//读取FLASH ID.  

}  
Exemple #8
0
//初始化24L01的IO口
void NRF24L01_IO_Init(void)
{
  	GPIO_InitTypeDef GPIO_InitStructure;		                                              //定义GPIO初始化结构体    
    /* 使能GPIOB,GPIOD,GPIOE的AHB1时钟*/
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB , ENABLE);
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;											  //设置管脚模式为输出模式
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;										  //设置翻转速度为100Mhz,M4就是快啊
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;											  //设置输出类型为推挽输出
    GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_0|GPIO_Pin_1);									//设置管脚为Pin_5,根据自己液晶接法设置
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;										  //设置上/下拉电阻为无上拉下拉电阻		
    GPIO_Init(GPIOB, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;                     
  	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
  	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//设置为上拉
  	GPIO_Init(GPIOB, &GPIO_InitStructure);
    GPIO_SetBits(GPIOB,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2);
    SPI2_Init();
 	SPI2_SetSpeed(SPI_SPEED_8);//
}
Exemple #9
0
//启动NRF24L01发送一次数据
//txbuf:待发送数据首地址
//返回值:发送完成状况
u8 NRF24L01_TxPacket(u8 *txbuf)
{
	u8 sta;
 	SPI2_SetSpeed(SPI_BaudRatePrescaler_8);//spi速度为9Mhz(24L01的最大SPI时钟为10Mhz)   
	NRF24L01_CE=0;
  	NRF24L01_Write_Buf(WR_TX_PLOAD,txbuf,TX_PLOAD_WIDTH);//写数据到TX BUF  32个字节
 	NRF24L01_CE=1;//启动发送	   
	while(NRF24L01_IRQ!=0);//等待发送完成
	sta=NRF24L01_Read_Reg(STATUS);  //读取状态寄存器的值	   
	NRF24L01_Write_Reg(WRITE_REG_NRF+STATUS,sta); //清除TX_DS或MAX_RT中断标志
	if(sta&MAX_TX)//达到最大重发次数
	{
		NRF24L01_Write_Reg(FLUSH_TX,0xff);//清除TX FIFO寄存器 
		return MAX_TX; 
	}
	if(sta&TX_OK)//发送完成
	{
		return TX_OK;
	}
	return 0xff;//其他原因发送失败
}
Exemple #10
0
//初始化SPI FLASH的IO口
void SPI_Flash_Init(void)
{
	RCC->APB2ENR|=1<<3;     //使能PORTB时钟 	    
 	RCC->APB2ENR|=1<<5;		//使能PORTD时钟
 	RCC->APB2ENR|=1<<8;		//使能PORTG时钟
	GPIOB->CRH&=0XFFF0FFFF; 
	GPIOB->CRH|=0X00030000;	//PB12 推挽 	    
	GPIOB->ODR|=1<<12;    	//PB12上拉
	//这里pd2和pg7拉高,是为了防止NRF24L01和SD卡影响FLASH的烧写.
	//因为他们共用一个SPI口. 
	GPIOD->CRL&=0XFFFFF0FF; 
	GPIOD->CRL|=0X00000300;	//PD2 推挽 	    
	GPIOD->ODR|=1<<2;    	//PD2上拉

	GPIOG->CRL&=0X0FFFFFFF; 
	GPIOG->CRL|=0X30000000;	//PG7 推挽 	    
	GPIOG->ODR|=1<<7;    	//PG7 上拉
	SPI2_Init();		   	//初始化SPI
	SPI2_SetSpeed(SPI_SPEED_2);//设置为18M时钟,高速模式
	SPI_FLASH_TYPE=SPI_Flash_ReadID();//读取FLASH ID.
}  
Exemple #11
0
//SD卡正常工作的时候,可以高速了
void VS_SPI_SpeedHigh(void)
{
    SPI2_SetSpeed(SPI_BaudRatePrescaler_8);//设置到高速模式
}
Exemple #12
0
//SD卡初始化的时候,需要低速
void VS_SPI_SpeedLow(void)
{
    SPI2_SetSpeed(SPI_BaudRatePrescaler_32);//设置到低速模式
}