OpenEdv-开源电子网

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

关于无线通信的一些疑问

[复制链接]

29

主题

71

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
207
金钱
207
注册时间
2013-7-25
在线时间
0 小时
发表于 2013-8-5 02:46:22 | 显示全部楼层 |阅读模式
    1.在无线通信模块中,在指定位置读,写指定长度的数据,为什么没有地址的偏移,却能连续地读写数据?比如for(u8_ctr=0;u8_ctr<len;u8_ctr++)pBuf[u8_ctr]=SPI2_ReadWriteByte(0XFF);//读出数据,没有发送地址就直接读取数据。
    2.SPI通信中,芯片怎么样区分读写的是命令还是数据?
    3.命令和地址有什么关系?两者是一样的吗?如果是,就如第一问所述,芯片怎么知道地址要后移?如果不是,那芯片又怎么知道要从哪里读写数据?

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-5 10:30:22 | 显示全部楼层
你有读过NRF24L01的数据手册吧?没有的话,好好读几遍。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

29

主题

71

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
207
金钱
207
注册时间
2013-7-25
在线时间
0 小时
 楼主| 发表于 2013-8-6 05:30:05 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
谢谢你的指点,我读了数据手册,第一问我明白了,第二问依然还是不知道,第三问还是有些疑惑:难道所有的外设都像无线模块那样,读写寄存器的时候,通过读写命令+寄存器地址来实现的吗?如果不是命令和地址又是怎么一回事
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-6 10:54:01 | 显示全部楼层
回复【3楼】风:
---------------------------------
NRF就是通过指令+寄存器地址来实现的啊.

//NRF24L01寄存器操作命令
#define READ_REG        0x00  //读配置寄存器,低5位为寄存器地址
#define WRITE_REG       0x20  //写配置寄存器,低5位为寄存器地址

这里我们注释就说明白了,第6位如果是1,那么就表示是写寄存器,寄存器地址在低5位体现.如果是0,就表示读寄存器.

   NRF24L01_Write_Reg(WRITE_REG+EN_AA,0x01);    //使能通道0的自动应答    
   NRF24L01_Write_Reg(WRITE_REG+EN_RXADDR,0x01);//使能通道0的接收地址    
   NRF24L01_Write_Reg(WRITE_REG+RF_CH,40);      //设置RF通信频率   
   NRF24L01_Write_Reg(WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);//选择通道0的有效数据宽度      
   NRF24L01_Write_Reg(WRITE_REG+RF_SETUP,0x0f);//设置TX发射参数,0db增益,2Mbps,低噪声增益开启   

具体到代码里面,你可以看到这样的写法,EN_AA就是寄存器地址,WRITE_REG其实就是把第六位设置为1,表示写寄存器,后面带的0x01,则是具体写入到EN_AA寄存器的值了.
然后:
//SPI写寄存器
//reg:指定寄存器地址
//value:写入的值
u8 NRF24L01_Write_Reg(u8 reg,u8 value)
{
u8 status;
    NRF24L01_CSN=0;                 //使能SPI传输
   status =SPI2_ReadWriteByte(reg);//发送寄存器号 
   SPI2_ReadWriteByte(value);      //写入寄存器的值
   NRF24L01_CSN=1;                 //禁止SPI传输    
   return(status);        //返回状态值
}
这就是写寄存器的函数,可以看到,先发送寄存器号(写标志+寄存器地址),然后发送各要写入的值,完成一次操作.
读寄存器操作如下:
//读取SPI寄存器值
//reg:要读的寄存器
u8 NRF24L01_Read_Reg(u8 reg)
{
u8 reg_val;     
  NRF24L01_CSN = 0;          //使能SPI传输
   SPI2_ReadWriteByte(reg);   //发送寄存器号
   reg_val=SPI2_ReadWriteByte(0XFF);//读取寄存器内容
   NRF24L01_CSN = 1;          //禁止SPI传输     
   return(reg_val);           //返回状态值
}
这就先写寄存器号,再度寄存器内容.
很好理解了.

多写写代码吧,光猜测,云里雾里的...实际写两行代码,比你冥想一天来的强得多....
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-15 15:08

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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