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;//其他原因发送失败 }
//检测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); }
//启动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;//没收到任何数据 }
//////////////////// /// ///注意:执行完后会进入待机模式,如需进行下一次接收,必须使能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;//没收到任何数据 }
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. }
//初始化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);// }
//启动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;//其他原因发送失败 }
//初始化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. }
//SD卡正常工作的时候,可以高速了 void VS_SPI_SpeedHigh(void) { SPI2_SetSpeed(SPI_BaudRatePrescaler_8);//设置到高速模式 }
//SD卡初始化的时候,需要低速 void VS_SPI_SpeedLow(void) { SPI2_SetSpeed(SPI_BaudRatePrescaler_32);//设置到低速模式 }