OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5943|回复: 5

求助原子哥的程序解释

[复制链接]

14

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2012-11-19
在线时间
3 小时
发表于 2014-7-9 15:04:27 | 显示全部楼层 |阅读模式
5金钱
    
const u8 TX_ADDRESS[TX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01}; 
const u8 RX_ADDRESS[RX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01};


void NRF24L01_Init(void)
{
 GPIO_InitTypeDef GPIO_InitStructure;
  SPI_InitTypeDef  SPI_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOG, ENABLE); 

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; 
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOB, &GPIO_InitStructure); 
  GPIO_SetBits(GPIOB,GPIO_Pin_12);
 
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; 
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 
  GPIO_SetBits(GPIOD,GPIO_Pin_2);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7; 
  GPIO_Init(GPIOG, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_8;   
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; 
GPIO_Init(GPIOG, &GPIO_InitStructure);

// GPIO_ResetBits(GPIOG,GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8);
 
    SPI2_Init();  
 SPI_Cmd(SPI2, DISABLE); 

SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; 
SPI_InitStructure.SPI_Mode = SPI_Mode_Master; 
    SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; 
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; 
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; 
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; 
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16; 
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; 
SPI_InitStructure.SPI_CRCPolynomial = 7; 
SPI_Init(SPI2, &SPI_InitStructure);  
 
SPI_Cmd(SPI2, ENABLE); 
 
NRF24L01_CE=0; 
NRF24L01_CSN=1; 
 
}

u8 NRF24L01_Check(void)
{
u8 buf[5]={0XA5,0XA5,0XA5,0XA5,0XA5};
u8 i;
SPI2_SetSpeed(SPI_BaudRatePrescaler_4); /
NRF24L01_Write_Buf(WRITE_REG_NRF+TX_ADDR,buf,5);
NRF24L01_Read_Buf(TX_ADDR,buf,5); 
for(i=0;i<5;i++)if(buf!=0XA5)break;   
if(i!=5)return 1;
return 0; 
}  
/
u8 NRF24L01_Write_Reg(u8 reg,u8 value)
{
u8 status;
    NRF24L01_CSN=0;                
  status =SPI2_ReadWriteByte(reg);/
  SPI2_ReadWriteByte(value);     
  NRF24L01_CSN=1;               
  return(status);      
}

u8 NRF24L01_Read_Reg(u8 reg)
{
u8 reg_val;    
  NRF24L01_CSN = 0;         
  SPI2_ReadWriteByte(reg);  
  reg_val=SPI2_ReadWriteByte(0XFF);
  NRF24L01_CSN = 1;         
  return(reg_val);           
}

u8 NRF24L01_Read_Buf(u8 reg,u8 *pBuf,u8 len)
{
u8 status,u8_ctr;       
  NRF24L01_CSN = 0;         
  status=SPI2_ReadWriteByte(reg);//       
  for(u8_ctr=0;u8_ctr<len;u8_ctr++)pBuf[u8_ctr]=SPI2_ReadWriteByte(0XFF);//
  NRF24L01_CSN=1;       //
  return status;        //·
}

u8 NRF24L01_Write_Buf(u8 reg, u8 *pBuf, u8 len)
{
u8 status,u8_ctr;    
  NRF24L01_CSN = 0;         
  status = SPI2_ReadWriteByte(reg);
  for(u8_ctr=0; u8_ctr<len; u8_ctr++)SPI2_ReadWriteByte(*pBuf++); / 
  NRF24L01_CSN = 1;       //
  return status;          
}   

u8 NRF24L01_TxPacket(u8 *txbuf)
{
u8 sta;
  SPI2_SetSpeed(SPI_BaudRatePrescaler_8);
NRF24L01_CE=0;
  NRF24L01_Write_Buf(WR_TX_PLOAD,txbuf,TX_PLOAD_WIDTH);
  NRF24L01_CE=1;/
while(NRF24L01_IRQ!=0);
sta=NRF24L01_Read_Reg(STATUS);  
NRF24L01_Write_Reg(WRITE_REG_NRF+STATUS,sta); 
if(sta&MAX_TX)
{
NRF24L01_Write_Reg(FLUSH_TX,0xff);
return MAX_TX; 
}
if(sta&TX_OK)//·????ê??
{
return TX_OK;
}
return 0xff;
}

u8 NRF24L01_RxPacket(u8 *rxbuf)
{
u8 sta;       
SPI2_SetSpeed(SPI_BaudRatePrescaler_8); //
sta=NRF24L01_Read_Reg(STATUS);  //
NRF24L01_Write_Reg(WRITE_REG_NRF+STATUS,sta); //
if(sta&RX_OK)//??????????
{
NRF24L01_Read_Buf(RD_RX_PLOAD,rxbuf,RX_PLOAD_WIDTH);//?
NRF24L01_Write_Reg(FLUSH_RX,0xff);//
return 0; 
}   
return 1;//
}    

void NRF24L01_RX_Mode(void)
{
 NRF24L01_CE=0;  
  NRF24L01_Write_Buf(WRITE_REG_NRF+RX_ADDR_P0,(u8*)RX_ADDRESS,RX_ADR_WIDTH);//??RX???????·
 
  NRF24L01_Write_Reg(WRITE_REG_NRF+EN_AA,0x01);    
  NRF24L01_Write_Reg(WRITE_REG_NRF+EN_RXADDR,0x01);//
  NRF24L01_Write_Reg(WRITE_REG_NRF+RF_CH,40);     //
  NRF24L01_Write_Reg(WRITE_REG_NRF+RX_PW_P0,RX_PLOAD_WIDTH);//
  NRF24L01_Write_Reg(WRITE_REG_NRF+RF_SETUP,0x0f);// 
  NRF24L01_Write_Reg(WRITE_REG_NRF+CONFIG, 0x0f);//
  NRF24L01_CE = 1; //
}  

void NRF24L01_TX_Mode(void)
{  
 NRF24L01_CE=0;    
  NRF24L01_Write_Buf(WRITE_REG_NRF+TX_ADDR,(u8*)TX_ADDRESS,TX_ADR_WIDTH);//
  NRF24L01_Write_Buf(WRITE_REG_NRF+RX_ADDR_P0,(u8*)RX_ADDRESS,RX_ADR_WIDTH); //

  NRF24L01_Write_Reg(WRITE_REG_NRF+EN_AA,0x01);     /
  NRF24L01_Write_Reg(WRITE_REG_NRF+EN_RXADDR,0x01); //
  NRF24L01_Write_Reg(WRITE_REG_NRF+SETUP_RETR,0x1a);//
  NRF24L01_Write_Reg(WRITE_REG_NRF+RF_CH,40);       //
  NRF24L01_Write_Reg(WRITE_REG_NRF+RF_SETUP,0x0f);  //
  NRF24L01_Write_Reg(WRITE_REG_NRF+CONFIG,0x0e);    //
 NRF24L01_CE=1;//CE????,10us?ó????·???

}  


里面的 SPI2_Init();    已经初始化一次SPI2了,为什么立刻 SPI_Cmd(SPI2, DISABLE);又失能,然后重新初始化呢?
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;  //
SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //
    SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; //
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; //
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16; //
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //
SPI_InitStructure.SPI_CRCPolynomial = 7; //
SPI_Init(SPI2, &SPI_InitStructure);  //? 
SPI_Cmd(SPI2, ENABLE); //
而且分频系数也不一样,



最佳答案

查看完整内容[请看2#楼]

默认的SPI2_Init不符合NRF24L01的时序要求(NRF奇葩) 所以SPI2_Init后,需要根据NRF24L01的特点,重新设置SPI的部分参数.所以才有后面的重新初始化.
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-7-9 15:04:28 | 显示全部楼层
默认的SPI2_Init不符合NRF24L01的时序要求(NRF奇葩)
所以SPI2_Init后,需要根据NRF24L01的特点,重新设置SPI的部分参数.所以才有后面的重新初始化.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

109

主题

1606

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2222
金钱
2222
注册时间
2011-12-15
在线时间
37 小时
发表于 2014-7-9 17:58:49 | 显示全部楼层
你能否贴一点代码,然后告诉具体什么问题
专业制作STM32 物联网通信模块板,模块交流群:369840039。
回复

使用道具 举报

14

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2012-11-19
在线时间
3 小时
 楼主| 发表于 2014-7-10 11:57:45 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
回复【3楼】正点原子:那为什么不直接就初始化后面的SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;  //
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;  //
    SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;  //
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;  //
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; //
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;  //
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16;  //
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //
SPI_InitStructure.SPI_CRCPolynomial = 7; //
SPI_Init(SPI2, &SPI_InitStructure);  //? 
SPI_Cmd(SPI2, ENABLE); //
就不用SPI2_Init(); 了
---------------------------------
回复

使用道具 举报

0

主题

7

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2014-2-8
在线时间
2 小时
发表于 2014-7-10 12:27:21 | 显示全部楼层
程序的一种编写风格吧
生当作人杰,死亦为鬼雄。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-7-10 23:32:09 | 显示全部楼层
回复【4楼】80510393:
---------------------------------
那你还要初始化IO呢。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-6 09:27

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表