`

SPI之CC1101

 
阅读更多

 

SPI读写操作

INT8U SpiTxRxByte(INT8U dat)

{

   INT8U i,temp;

   temp = 0;

   SCK = 0;

   for(i=0; i<8; i++)

   {

      if(dat & 0x80)

      {

          MOSI = 1;

      }

      else MOSI = 0;

      dat <<= 1;

      SCK = 1;

      _nop_();

      _nop_();

      temp <<= 1;

      if(MISO)temp++;

      SCK = 0;

      _nop_();

      _nop_();  

   }

   return temp;

}

 

SPI写寄存器操作

void halSpiWriteReg(INT8U addr, INT8U value)

{

   CSN = 0;

   while (MISO);

   SpiTxRxByte(addr);     //写地址

   SpiTxRxByte(value);    //写入配置

   CSN = 1;

}

 

SPI读寄存器操作

INT8U halSpiReadReg(INT8U addr)

{

   INT8U temp, value;

   temp = addr|READ_SINGLE;//读寄存器命令

   CSN = 0;

   while (MISO);

   SpiTxRxByte(temp);

   value = SpiTxRxByte(0);

   CSN = 1;

   return value;

}

 

CC1101初始化设置

RF_SETTINGS rfSettings =

{

   0x00,

   0x08,  // FSCTRL1  Frequency synthesizer control.

   0x00,  // FSCTRL0  Frequency synthesizer control.

   0x10,  // FREQ2    Frequency control word, high byte.

   0xA7,  // FREQ1    Frequency control word, middle byte.

   0x62,  // FREQ0    Frequency control word, low byte.

   0x5B,  // MDMCFG4  Modem configuration.

   0xF8,  // MDMCFG3  Modem configuration.

   0x03,  // MDMCFG2  Modem configuration.

   0x22,  // MDMCFG1  Modem configuration.

   0xF8,  // MDMCFG0  Modem configuration.

   0x00,  // CHANNR   Channel number.

0x47,  // DEVIATN  Modem deviation setting

   0xB6,  // FREND1   Front end RX configuration.

   0x10,  // FREND0   Front end RX configuration.

   0x18,  // MCSM0    Main Radio Control State Machine configuration.

   0x1D,  // FOCCFG   Frequency Offset Compensation Configuration.

   0x1C,  // BSCFG    Bit synchronization Configuration.

   0xC7,  // AGCCTRL2 AGC control.

   0x00,  // AGCCTRL1 AGC control.

   0xB2,  // AGCCTRL0 AGC control.

   0xEA,  // FSCAL3   Frequency synthesizer calibration.

   0x2A,  // FSCAL2   Frequency synthesizer calibration.

   0x00,  // FSCAL1   Frequency synthesizer calibration.

   0x11,  // FSCAL0   Frequency synthesizer calibration.

   0x59,  // FSTEST   Frequency synthesizer calibration.

   0x81,  // TEST2    Various test settings.

   0x35,  // TEST1    Various test settings.

   0x09,  // TEST0    Various test settings.

   0x0B,  // IOCFG2   GDO2 output pin configuration.

0x06,  // IOCFG0D  GDO0 output pin configuration.

   0x04,  // PKTCTRL1 Packet automation control.

   0x05,  // PKTCTRL0 Packet automation control.

   0x00,  // ADDR     Device address.

   0x0c   // PKTLEN   Packet length.

};

 

数据接收流程操作

INT8U halRfReceivePacket(INT8U *rxBuffer, INT8U *length)

{

   INT8U status[2];

   INT8U packetLength;

   INT8U i=(*length)*4; //具体多少要根据datarate和length来决定

   halSpiStrobe(CCxxx0_SRX);     //进入接收状态

   delay(2);

   while (GDO0)

   {

      delay(2);

      --i;

      if(i<1)

        return 0;    

   }  

if ((halSpiReadStatus(CCxxx0_RXBYTES) & BYTES_IN_RXFIFO))

 //如果接的字节数不为0

   {

       packetLength = halSpiReadReg(CCxxx0_RXFIFO);

//读出第一个字节,此字节为该帧数据长度

       if (packetLength <= *length)    

//如果所要的有效数据长度小于等于接收到的数据包的长度

      {

halSpiReadBurstReg(CCxxx0_RXFIFO, rxBuffer, packetLength); //读出所有接收到的数据

           *length = packetLength;             

//把接收数据长度的修改为当前数据的长度

// Read the 2 appended status bytes (status[0] = RSSI, status[1] = LQI)

           halSpiReadBurstReg(CCxxx0_RXFIFO, status, 2); 

//读出CRC校验位

          halSpiStrobe(CCxxx0_SFRX);     //清洗接收缓冲区

           return (status[1] & CRC_OK); //如果校验成功返回接收成功

       }

       else

      {

           *length = packetLength;

           halSpiStrobe(CCxxx0_SFRX);   //清洗接收缓冲区

           return 0;

       }

   }

   else

   return 0;

}

 

数据发送流程操作

void halRfSendPacket(INT8U *txBuffer, INT8U size)

{

   halSpiWriteReg(CCxxx0_TXFIFO, size);

   halSpiWriteBurstReg(CCxxx0_TXFIFO, txBuffer, size);//写入要发送的数据

   halSpiStrobe(CCxxx0_STX);     //进入发送模式发送数据

   // Wait for GDO0 to be set -> sync transmitted

   while (!GDO0);

   // Wait for GDO0 to be cleared -> end of packet

   while (GDO0);

      halSpiStrobe(CCxxx0_SFTX);

}

分享到:
评论

相关推荐

    STM32L152软件模拟SPI驱动CC1101

    在本项目中,我们关注的是如何使用STM32L152通过软件模拟SPI(Serial Peripheral Interface)来驱动CC1101无线收发器。 SPI是一种同步串行通信协议,常用于连接微控制器与各种外设,如传感器、存储器和射频芯片。它...

    CC1101收发驱动程序_CC1101_

    1. **SPI时钟匹配**:确保微控制器的SPI时钟速度与CC1101的SPI时钟速度兼容,以避免数据传输错误。 2. **片选信号管理**:正确控制CS信号,确保在数据交换过程中保持有效的低电平。 3. **电源管理**:合理设计电源...

    stm8 spi 通讯 CC1101

    STM8 spi CC1101 简单收发试验 可进行相关移植 STM8 spi CC1101 简单收发试验 可进行相关移植

    STM32F103驱动无线模块CC1101程序

    1. **SPI通信协议**:CC1101与STM32F103之间的通信通常通过SPI(Serial Peripheral Interface)接口进行。SPI是一种同步串行接口,允许单主设备控制一个或多个从设备,具有高速、全双工和低引脚数量的优点。在配置CC...

    cc1101 spi manual_cc1101spimanual_CC1101_wooleut_

    《CC1101 SPI手册》是一份非常实用的技术文档,主要关注的是如何高效地管理和实现CC1101芯片的SPI(Serial Peripheral Interface)通信。这篇文档详细介绍了CC1101无线收发器与微控制器之间的SPI通信协议,这对于...

    cc1101DM365SPI2驱动

    《DM365平台下cc1101SPI2驱动详解》 在嵌入式系统设计中,硬件接口的驱动程序扮演着至关重要的角色。本文将深入探讨标题为"cc1101DM365SPI2驱动"的项目,这是一款针对DM365处理器的cc1101无线收发芯片的SPI2接口...

    spi_cc.zip_cc1101 AVR

    标题 "spi_cc.zip_cc1101 AVR" 暗示了这个压缩包包含与SPI通信协议相关的代码,特别是针对CC1101芯片和AVR微控制器的应用。描述提到这是针对CC1101和AVR微控制器的测试,这可能是一个用于无线通信或者射频应用的项目...

    CC1101.rar_CC1101_CC1101 OOK_CC1101 STM32收发驱动_CC1101收发_ook

    1. 发送:STM32将待发送的数据转换为OOK编码,通过SPI接口写入CC1101的缓冲区,CC1101根据配置的OOK模式生成相应的射频信号发射出去。 2. 接收:CC1101接收到射频信号后,经过解调器处理,STM32通过SPI读取接收到的...

    电子-CC1101.zip

    《CC1101在STM32平台的应用与SPI通信详解》 在嵌入式系统设计中,无线通信模块的应用日益广泛,CC1101就是一款常用的低功耗、高性能的Sub-GHz无线收发器。这款芯片由Texas Instruments(TI)公司推出,适用于902-...

    CC1101_SPI.rar

    在本文中,我们将深入探讨如何在STM8S微控制器上使用软件模拟的SPI(Serial Peripheral Interface)通信协议来控制CC1101射频芯片。CC1101是一款广泛应用于433MHz无线通信的单片收发器,而STM8S则是一款基于8位STM8...

    基于STM32无线模块CC1101驱动代码

    7. 能耗优化:考虑到CC1101和STM32都是低功耗设计,驱动代码应该考虑如何在不牺牲性能的前提下降低功耗,例如,在空闲时关闭CC1101的电源,或者调整SPI速度以减少电流消耗。 通过以上步骤,我们可以成功地在STM32...

    cc1101这个

    - SPI (Serial Peripheral Interface) 初始化:SPI是一种同步串行接口标准,用于连接主控制器(MCU)与外设(如CC1101)。初始化过程包括设置SPI的时钟速率、模式等参数。 - MCU引脚配置:为了实现CC1101与微控制器...

    CC1101 无线组网

    4. **硬件接口**:CC1101通过SPI(串行外围接口)与微控制器进行通信,配置和控制收发器的工作状态。用户可以通过编写固件来实现对CC1101的完全控制,包括频率设定、功率级别调整、数据包格式定义等。 5. **应用...

    STM32_SPI1_CC1101_TX_RX

    STM32VET6(SPI1) CC1101 PA4 -&gt; CSN PA5 -&gt; SCK PA6 PA7 -&gt; MOSI PB0 PC5 经测试,收发成功,如果想换成SPI2或SPI3,只需要修改相关配置即可! 用的是标准固件库 V3.5,开发环境是MDK4.22+J-link 开发板,是...

    CC1101无线模块是采用TI公司的CC1101芯片制作的模块

    此外,CC1101还支持直接用IO口模拟SPI时序,这样即使不配备专用的SPI接口,用户也能通过MCU的普通GPIO口实现与CC1101的通信,大大增强了模块的兼容性和灵活性。 在功能上,CC1101芯片集成了多种功能,包括频率合成...

    STM32CC1101_STM32无线收发_CC1101

    3. **数据传输**:STM32将要发送的数据通过SPI接口写入CC1101的发送缓存(TXFIFO),CC1101则按照预设的配置发送出去。同时,STM32也需要监听接收缓存(RXFIFO),当有数据接收到时进行处理。 4. **中断处理**:...

    STM32连接CC1101模块的发射程序!

    在连接时,需要将STM32的SPI引脚(SCK、MISO、MOSI和NSS)分别连接到CC1101的相应引脚,同时可能还需要连接GPIO来控制CC1101的Chip Select(CS)信号。 CC1101模块有多个寄存器用于配置其工作模式、频率、功率等级...

    AT89C51单片机--CC1101无线接收程序(经本人调试成功)

    通过以上分析,可以看出这段代码主要实现了AT89C51单片机控制CC1101无线接收模块的基本功能,包括SPI接口的配置、关键寄存器的定义以及必要的控制函数。这对于理解并实现无线通信系统非常有帮助。

    stm32+cc1101e 能实现简单的无线通信

    在本项目中,由于硬件SPI接口可能未在STM32上可用或不方便使用,我们采用软件模拟SPI(Software SPI)的方式,即通过GPIO引脚模拟SPI时序来与CC1101通信。软件SPI需要编程实现MOSI、MISO、SCK和NSS(选通信号)等线...

Global site tag (gtag.js) - Google Analytics