找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8376|回复: 0
打印 上一主题 下一主题
收起左侧

SPI&nRF24无线数据传输详解

[复制链接]
跳转到指定楼层
楼主
ID:81203 发表于 2015-5-26 18:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STM32库文件:

       stm32f10x_rcc.c
       stm32f10x_gpio.c
       stm32f10x_usart.c
       stm32f10x_it.c  //中断服务函数
       misc.c                //中断向量
       stm32f10x_spi.c

其他函数SPI与nRF间的数据通信
    SPI_NRF.c

基本结构:



通过ISP传输完成STM32与nRF24间的数据通信
  SCK
  
为主机为从机提供的时钟信号
MOSI  (master out  slave in)
为主机和从机间数据通信传输通道
MISO
为主机和从机间数据通信传输通道
CE
工作使能,使nRF24处于传输和接收状态
CSN
SPI功能片选使能,低电平有效
IRQ
nRFMCU传输的中断信号

SPI配置

  SPI_Direction
  
SPI_Direction_2Lines_FullDuplex
  SPI_Direction_2Lines_RxOnly
  SPI_Direction_1Line_Rx
  SPI_Direction_1Line_Tx
数据通信方式
SPI_Mode
SPI_Mode_Master
  SPI_Mode_Slave
主从模式
SPI_DataSize
SPI_DataSize_8b
  SPI_DataSize_16b
数据位数设定
SPI_CPOL
SPI_CPOL_Low
  SPI_CPOL_High
数据采样点的设定
  
  相对于低电平或高电平的第一个边沿或第二个边沿
SPI_CPHA
SPI_CPHA_1Edge
  SPI_CPHA_2Edge
SPI_NSS
SPI_NSS_Soft
  SPI_NSS_Hard
NSS信号的产生
SPI_BaudRatePrescaler
SPI_BaudRatePrescaler_8   (2,4,8,16,32…..256)
SCL信号由系统时钟分频产生
SPI_FirstBit
SPI_FirstBit_MSB
  SPI_FirstBit_LSB

SPI_CRCPolynomial
CRCPR    CRC polynomial register
  The CRC polynomial (0007h) is the reset  value of this register
16-bit寄存器设置



工作流程


SPI数据传输使用的函数

SPI与nRF间的数据通信函数
u8 SPI_NRF_RW(u8 dat);

用于向NRF读/写一字节数据(只能一次写入8-bit,这是nRF芯片决定的。SPI可以采用8-bit或16-bit完成数据传输)       该函数输入值为SPI写入的值,返回值为SPI读取到的值
只完成写入命令时,可以不管其返回值。而其返回值,为该寄存器的状态值,可用于判断该命令执行是否成功。
而对于nRF24芯片寄存器数据的读取,每8-bit的数据传输都要求master传输一个空命令后,nRF24才传输下一个数据。而函数返回值就为该数据值。
所谓的空命令,就是nRF24中的Define No Operation, might be usedto read status register
对该函数分析得
      1. 无论是对nRF24的读取和写,都会有返回值。在写时,返回值为状态信息
               2. 在数据读取时,每一字节的数据都是在一个输入命令后才能完成。
u8 SPI_NRF_ReadReg(u8 reg );
从nRF特定的寄存器读出8bit数据


u8 SPI_NRF_WriteReg(u8 reg,u8 dat);


NRF特定的寄存器写入数据


命令+地址  组合成为8-bit数据,不同的命令有着不同的数据格式


R_Registe命令设为 0x00  W_Registe 设为 0x20
结合寄存器地址,register map    TX_ADDR 0x10


地址为0x10         TR_ADDR参数设定时,应输入名0011 000   (0x20+0x10)


u8 SPI_NRF_ReadBuf(u8 reg,u8 *pBuf,u8 bytes);

       SPI_NRF_WriteReg(u8 reg,u8 dat) 区别写入数据为连续的一串数据组数据,通过数据指针和数据大小来完成。

u8 SPI_NRF_WriteBuf(u8 reg ,u8 *pBuf,u8 bytes);



void NRF_TX_Mode(void);


void NRF_RX_Mode(void);


u8 NRF_Rx_Dat(u8 *rxbuf);


u8 NRF_Tx_Dat(u8 *txbuf);


当其缓冲区的数据发送完后,产生一个IRQ信号。也就是一串数据发送完以后

u8 NRF_Check(void);




其他

传输配置,通信频率,收发地址,pipe  一致时才能进行通信
传输模式下,不开启外部中断
接收模式下,开启中断。这样就直接将中断服务用于接收模式






分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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