我写的SPI操作NRf2401的程序,不知有问题?,求解啊,代码...
时间:10-02
整理:3721RD
点击:
void INit()
{
SPI_InitTypeDef SPI_InitStructure; //申明结构体
GPIO_InitTypeDef GPIO_InitStructure; //zhaodao 哪个模块,然后再开启对应的时钟,配置各个口的工作模式,调用
////////////////////////////////////////////////////////////////////////
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE); //因为A口为复用时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1,ENABLE);
///////////////////////////////////////////////////////////////////////
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3|GPIO_Pin_4; //CE 引脚控制模式选择,因为要用来控制它的
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //它的电平,所以选择输出方式((》》》))
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //
GPIO_Init(GPIOA,&GPIO_InitStructure); //
Set_NRF2401_CE; ///必须先拉高,因为不工作时为H
// Set_nss; //先拉高,不让工作
//////////////////////////////////////////////////////////////////////
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4|GPIO_Pin_6|GPIO_Pin_7; //用一个使能,先拉高 ((b)),把所有的片选都配置上了
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//因为用它来控制外面的,所以选择输出,上下拉随意
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//
GPIO_Init(GPIOB,&GPIO_InitStructure);
Set_NRF2401_CS; //
GPIO_SetBits(GPIOB,GPIO_Pin_6); //
GPIO_SetBits(GPIOB,GPIO_Pin_7); //
////////////////////////////////////////////////////////////////////
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2; //IRQ 中断引脚
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;////上拉输入
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_SetBits(GPIOA,GPIO_Pin_2); //初始化时先拉高,因为触发时为L
//////////////////////////////////////////////////////////////////////
////////////////////设置俩处,1:GPIO 2:SPI那里的/////////////////////
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP; //复用推挽输出 ,只有这样才可以区别不是普通IO口
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
////////////////设置SPI工作模式////////////////////////////////
SPI_Cmd(SPI1,DISABLE); //配置时先失能
SPI_InitStructure.SPI_Direction=SPI_Direction_2Lines_FullDuplex; //双工模式 ,其实没必要
SPI_InitStructure.SPI_Mode=SPI_Mode_Master; //SPI1为主模式
SPI_InitStructure.SPI_DataSize=SPI_DataSize_8b;//8位
SPI_InitStructure.SPI_CPOL=SPI_CPOL_Low; //平时时钟为低
SPI_InitStructure.SPI_CPHA=SPI_CPHA_1Edge;//第1个开始,<<4种(1,0,低,1)(1,1,低,2)(0,1,高,2)(0,0,高,1) >>
SPI_InitStructure.SPI_NSS=SPI_NSS_Soft; //
SPI_InitStructure.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_8; //8>>72>>9M,主模式的时钟决定传输速率,suiyi
SPI_InitStructure.SPI_FirstBit=SPI_FirstBit_MSB; //数据从MSB开始 ,高位开始
SPI_InitStructure.SPI_CRCPolynomial=7; //CRC多项式,校验位
SPI_Init(SPI1,&SPI_InitStructure);
/////////////////////////////////////////////////////////////////////////////////////////
SPI_Cmd(SPI1,ENABLE);
SPI_ReadWrite(0xff); //启动传输
/////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2; //GPIO_pin_ALL,所有的IO口都配置了,LCD就这样配置
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //
///////////////////////////////////////////////////////////
GPIO_Init(GPIOB,&GPIO_InitStructure);
/////////////////////////////////////////////////////////////////////////////////////////
Clr_NRF2401_CE; //模式选择 ,之后就不用设置了
Set_NRF2401_CS; //CS 是SPI 片选端,所以每次都要先使能CS,再写相关程序,再关闭
}
初始化的部分。
int main()
{
u8 buf[33]={0};
u8 temp1=' ';
u8 t;
stm32_clock_init(9);//72M,因为NRF 9M,所以用外部PLL
// NRF24L01_Init();
INit(); //对GPIO和SPI配置 ,已经把CE拉低了,所以在后面的SPI作用时都不用配置了,好用
GPIO_SetBits(GPIOB,GPIO_Pin_2);
while(nrf2401_check()) //如果没有, 返回值
{
///LED灯指示 ;
GPIO_ResetBits(GPIOB,GPIO_Pin_2); // 一直亮 (A2)
//delay_ms1(12000000);
//GPIO_SetBits(GPIOB,GPIO_Pin_2);
//delay_ms1(12000000);
}
程序一直停在 while(nrf2401_check())
说明没有检测到NRf,不知哪里的问题,大家帮帮忙、、、、、、
{
SPI_InitTypeDef SPI_InitStructure; //申明结构体
GPIO_InitTypeDef GPIO_InitStructure; //zhaodao 哪个模块,然后再开启对应的时钟,配置各个口的工作模式,调用
////////////////////////////////////////////////////////////////////////
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE); //因为A口为复用时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1,ENABLE);
///////////////////////////////////////////////////////////////////////
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3|GPIO_Pin_4; //CE 引脚控制模式选择,因为要用来控制它的
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //它的电平,所以选择输出方式((》》》))
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //
GPIO_Init(GPIOA,&GPIO_InitStructure); //
Set_NRF2401_CE; ///必须先拉高,因为不工作时为H
// Set_nss; //先拉高,不让工作
//////////////////////////////////////////////////////////////////////
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4|GPIO_Pin_6|GPIO_Pin_7; //用一个使能,先拉高 ((b)),把所有的片选都配置上了
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//因为用它来控制外面的,所以选择输出,上下拉随意
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//
GPIO_Init(GPIOB,&GPIO_InitStructure);
Set_NRF2401_CS; //
GPIO_SetBits(GPIOB,GPIO_Pin_6); //
GPIO_SetBits(GPIOB,GPIO_Pin_7); //
////////////////////////////////////////////////////////////////////
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2; //IRQ 中断引脚
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;////上拉输入
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_SetBits(GPIOA,GPIO_Pin_2); //初始化时先拉高,因为触发时为L
//////////////////////////////////////////////////////////////////////
////////////////////设置俩处,1:GPIO 2:SPI那里的/////////////////////
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP; //复用推挽输出 ,只有这样才可以区别不是普通IO口
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
////////////////设置SPI工作模式////////////////////////////////
SPI_Cmd(SPI1,DISABLE); //配置时先失能
SPI_InitStructure.SPI_Direction=SPI_Direction_2Lines_FullDuplex; //双工模式 ,其实没必要
SPI_InitStructure.SPI_Mode=SPI_Mode_Master; //SPI1为主模式
SPI_InitStructure.SPI_DataSize=SPI_DataSize_8b;//8位
SPI_InitStructure.SPI_CPOL=SPI_CPOL_Low; //平时时钟为低
SPI_InitStructure.SPI_CPHA=SPI_CPHA_1Edge;//第1个开始,<<4种(1,0,低,1)(1,1,低,2)(0,1,高,2)(0,0,高,1) >>
SPI_InitStructure.SPI_NSS=SPI_NSS_Soft; //
SPI_InitStructure.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_8; //8>>72>>9M,主模式的时钟决定传输速率,suiyi
SPI_InitStructure.SPI_FirstBit=SPI_FirstBit_MSB; //数据从MSB开始 ,高位开始
SPI_InitStructure.SPI_CRCPolynomial=7; //CRC多项式,校验位
SPI_Init(SPI1,&SPI_InitStructure);
/////////////////////////////////////////////////////////////////////////////////////////
SPI_Cmd(SPI1,ENABLE);
SPI_ReadWrite(0xff); //启动传输
/////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2; //GPIO_pin_ALL,所有的IO口都配置了,LCD就这样配置
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //
///////////////////////////////////////////////////////////
GPIO_Init(GPIOB,&GPIO_InitStructure);
/////////////////////////////////////////////////////////////////////////////////////////
Clr_NRF2401_CE; //模式选择 ,之后就不用设置了
Set_NRF2401_CS; //CS 是SPI 片选端,所以每次都要先使能CS,再写相关程序,再关闭
}
初始化的部分。
int main()
{
u8 buf[33]={0};
u8 temp1=' ';
u8 t;
stm32_clock_init(9);//72M,因为NRF 9M,所以用外部PLL
// NRF24L01_Init();
INit(); //对GPIO和SPI配置 ,已经把CE拉低了,所以在后面的SPI作用时都不用配置了,好用
GPIO_SetBits(GPIOB,GPIO_Pin_2);
while(nrf2401_check()) //如果没有, 返回值
{
///LED灯指示 ;
GPIO_ResetBits(GPIOB,GPIO_Pin_2); // 一直亮 (A2)
//delay_ms1(12000000);
//GPIO_SetBits(GPIOB,GPIO_Pin_2);
//delay_ms1(12000000);
}
程序一直停在 while(nrf2401_check())
说明没有检测到NRf,不知哪里的问题,大家帮帮忙、、、、、、
建议下次发这样的贴时,把不清楚的标清楚!这样网友更直接
问题设是?