OpenEdv-开源电子网

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

战舰例程,无线通信初始化错误,哪错了神们

[复制链接]

2

主题

8

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2013-7-29
在线时间
1 小时
发表于 2013-7-29 21:19:53 | 显示全部楼层 |阅读模式
u8 NRF24L01_Check(void)
{
 u8 buf[5]={0XA5,0XA5,0XA5,0XA5,0XA5};
 u8 i;
    SPI1_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!=0XA5)break;           
 if(i!=5)return 1;            //检测24L01错误 
 return 0;               //检测到24L01
}

u8 NRF24L01_Read_Buf(u8 reg,u8 *pBuf,u8 len)
{
 u8 status,u8_ctr;       
   NRF24L01_CSN = 0;               //使能SPI传输
   status=SPI1_ReadWriteByte(reg); //发送寄存器值(位置),并读取状态值      
  for(u8_ctr=0;u8_ctr<len;u8_ctr++)
      pBuf[u8_ctr]=SPI1_ReadWriteByte(0XFF);   //读出数据
   NRF24L01_CSN=1;                 //关闭SPI传输
   return status;           //返回读到的状态值
}
得到的buf中的数据是5个FF,而不是A5,哪错了
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-7-29 22:15:57 | 显示全部楼层
回复【楼主位】1111M:
---------------------------------
插无线模块了么?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

8

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2013-7-29
在线时间
1 小时
 楼主| 发表于 2013-7-30 08:04:29 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
插了,找不出原因纠结
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-7-30 11:37:47 | 显示全部楼层
用的我们的无线模块?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

8

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2013-7-29
在线时间
1 小时
 楼主| 发表于 2013-7-30 20:45:10 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
调好了,向老师请教个问题
u8 NRF24L01_Read_Reg(u8 reg)
{
u8 reg_val;     
Clr_NRF24L01_CSN;          //使能SPI传输
SPIx_ReadWriteByte(reg);   //发送寄存器号
reg_val=SPIx_ReadWriteByte(0XFF);//读取寄存器内容??
Set_NRF24L01_CSN;          //禁止SPI传输     
return(reg_val);           //返回状态值
}
u8 SPIx_ReadWriteByte(u8 TxData)
{
u8 retry=0;  
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET) //检查指定的SPI标志位设置与否:发送缓存空标志位
{
retry++;
if(retry>200)return 0;
}   
SPI_I2S_SendData(SPI1, TxData); //通过外设SPIx发送一个数据
retry=0;
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET); //检查指定的SPI标志位设置与否:接受缓存非空标志位
{
retry++;
if(retry>200)return 0;
}        
return SPI_I2S_ReceiveData(SPI1); //返回通过SPIx最近接收的数据     
}

reg_val=SPIx_ReadWriteByte(0XFF);为什么写FF就能读取寄存器内容,想不通
回复 支持 反对

使用道具 举报

2

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2013-3-14
在线时间
0 小时
发表于 2013-7-30 20:55:34 | 显示全部楼层
回复【5楼】1111M:
---------------------------------
SPI是可以全双工通讯的 ,发送的同时可收到数据,0xff 可替换其他无意义的数据
回复 支持 反对

使用道具 举报

2

主题

8

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2013-7-29
在线时间
1 小时
 楼主| 发表于 2013-7-30 21:26:10 | 显示全部楼层
回复【6楼】SevenFly:
----------------------------
明白了,多谢
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-7-30 21:56:33 | 显示全部楼层
回复【5楼】1111M:
---------------------------------
因为NRF是从机,不能主动产生时钟.所以必须由主机发送时钟,而让SPI发送时钟的唯一办法,就是往DR写入一个数据,启动一次数据发收(同时进行),这样便可以产生时钟给从机,从而顺便从从机读取数据.
另外0XFF,就是维持MOSI一直为高电平.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

8

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2013-7-29
在线时间
1 小时
 楼主| 发表于 2013-8-1 11:02:25 | 显示全部楼层
还有个问题想不通,再次请教一下老师
u8 NRF24L01_RxPacket(u8 *rxbuf)
{
u8 sta;           
sta=NRF24L01_Read_Reg(STATUS);   //读取状态寄存器的值      
NRF24L01_Write_Reg(WRITE_REG_NRF+STATUS,sta);  //清除TX_DS或MAX_RT中断标志
//  #define WRITE_REG_NRF       0x20  //写配置寄存器,低5位为寄存器地址
        // #define STATUS          0x07  //状态寄存器;bit0:TX FIFO满标志;bit3:1,接收数据通道号(最大:6);bit4,达到最多次重发
                              //bit5:数据发送完成中断;bit6:接收数据中断;
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; //没收到任何数据
}
sta=NRF24L01_Read_Reg(STATUS);   //读取状态寄存器的值      
NRF24L01_Write_Reg(WRITE_REG_NRF+STATUS,sta);  //清除TX_DS或MAX_RT中断标志
读STATUS,再写进配置寄存器怎么就把中断标志给清了?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-1 21:40:33 | 显示全部楼层
回复【9楼】1111M:
---------------------------------
STATUS 是写1清零吧。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-15 21:12

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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