/********************************End of Head************************************/
#include "NRF24L01.h"
#include "stm32f10x.h"
#define NFRCS
#define NFRCLK
#define NFRMOSI
#define NFRMISO
#define NFRIRQ
#define NFRCE
/*
PB12 PB14 PD8
(2) 3.3V CSN MISO IRQ
(1) GND CE SCLK2 MOSI
PD9 PB13 PB15
*/
//管脚元素
typedef struct _GPIO
{
GPIO_TypeDef * GPIO;
uint16_t Pin ;
}GPIO_handle;
//SPI管脚
typedef struct _SPI_Handle
{
GPIO_handle *CS;
GPIO_handle *CLK;
GPIO_handle *MOSI;
GPIO_handle *MISO;
}SPI_Handle;
#define NRF_CS GPIOB, GPIO_Pin_12
SPI_Handle SPI_1 =
{
.CS = {GPIOB,GPIO_Pin_12},//CS
.CLK= {GPIOB,GPIO_Pin_13},//CLK
.MOSI={GPIOB,GPIO_Pin_15},//MOSI //输出
.MISO={GPIOB,GPIO_Pin_14},//MISO //输入
};
#define SimuSPI_CPOL 0 //SCLK==0 是空闲状态,所以有效状态是SCLK等于高电平
#define SimuSPI_CPHA 1 //数据采样是在第2个边沿,数据发送在第1个边沿
//模版SPI发送数据(无CS)
u8 SimuSPIx_RW(SPI_Handle SPI,u8 Wdat)
{
u8 i=0,m;
u8 dat = 0;
for(i=0;i<8;i++)
{
#if (SimuSPI_CPHA ==0)
GPIO_WriteBit(SPI.CLK.GPIO ,SPI.CLK.Pin,SimuSPI_CPOL);
{
//写数据
if(Wdat&0x80){
GPIO_SetBits(SPI.MOSI.GPIO,SPI.MOSI.Pin);
}else{
GPIO_ResetBits(SPI.MOSI.GPIO,SPI.MOSI.Pin);
}
Wdat<<=1;
//读取数据
dat <<=1;
if(SimuSPI_MOSI){
dat|=0x01;
}
}
for(m=0;m<10;m++){}
GPIO_WriteBit(SPI.CLK.GPIO ,SPI.CLK.Pin,!SimuSPI_CPOL);
#else
GPIO_WriteBit(SPI.CLK.GPIO ,SPI.CLK.Pin,SimuSPI_CPOL);
{ //写数据
if(Wdat&0x80){
GPIO_SetBits(SPI.MOSI.GPIO,SPI.MOSI.Pin);
}else{
GPIO_ResetBits(SPI.MOSI.GPIO,SPI.MOSI.Pin);
}
Wdat<<=1;
}
GPIO_WriteBit(SPI.CLK.GPIO ,SPI.CLK.Pin,!SimuSPI_CPOL);
{ //读取数据
dat <<=1;
if(GPIO_ReadInputDataBit(SPI.MISO.GPIO,SPI.MISO.Pin)){
dat++;
}
}
for(m=0;m<10;m++){}
GPIO_WriteBit(SPI.CLK.GPIO ,SPI.CLK.Pin,SimuSPI_CPOL);
#endif
}
GPIO_WriteBit(SPI.CLK.GPIO ,SPI.CLK.Pin,SimuSPI_CPOL);
return dat;
}
//模版SPI初始化管脚
void SPIx_Init(SPI_Handle SPI)
{
GPIO_InitTypeDef GPIO_InitStructure;
/*Configure pins: CS */
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = SPI.CS.Pin ;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(SPI.CS.GPIO, &GPIO_InitStructure);
/*Configure pins: SCK / MISO */
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = SPI.CLK.Pin ;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(SPI.CLK.GPIO, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = SPI.MISO.Pin;
GPIO_Init(SPI.MISO.GPIO, &GPIO_InitStructure);
/*Configure SPI1 pins: MOSI*/
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Pin = SPI.MOSI.Pin ;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(SPI.MOSI.GPIO, &GPIO_InitStructure);
GPIO_SetBits(SPI.CS.GPIO ,SPI.CS.Pin ); //初始片选电平
GPIO_SetBits(SPI.CLK.GPIO ,SPI.CLK.Pin );
GPIO_SetBits(SPI.MOSI.GPIO,SPI.MOSI.Pin);
SimuSPIx_RW(SPI,0xFF); //启动传输
}
//******************************************************************************
//SPI转换输出
u8 NRF_SPI_WR(u8 dat)
{
return SimuSPIx_RW(SPI_1,dat);//启动传输
}