您的位置 首页 新能源

CC1101接口库在STM32上的移植

【目的】移植原来TI对于CC1101与MSP430接口库到STM32平台,参考原TI库应用笔记MSP430InterfacetoCC1100/2500CodeLibrary,做到…

【意图】

移植本来TI关于CC1101与MSP430接口库到STM32渠道,参阅原TI库运用笔记“ MSP430 Interface to CC1100/2500 Code Library”,做到尽量坚持一切函数名不改动,以便利曾经根据MSP430的程序向STM32移植。

【要求】

1.编程要求:改写本来根据MSP430的程序,运用于STM32,尽量坚持一切函数名不改动,以便利曾经根据MSP430的程序向STM32移植。

2.完结功用:STM32与CC1101经过SPI接口正常传输数据,不同节点的CC1101能够正常传输数据。

3.试验现象:STM32与CC1101衔接后,能够与另一个节点通讯,节点初始在随机时刻发送一个数据,任一节点收到数据后LED闪一下,并把数据回传,如此循环,会看到LED不断闪耀。

【硬件电路】

测验时CC1101与STM32引脚衔接表如表1所示。

表1 CC1101与STM32引脚衔接表

CC1101部分

STM32部分

功用

引脚位号

称号

引脚位号

称号

1

VCC

18

VSS_1

电源

2

GND

19

VDD_1

3

SI

14

PA7/SPI1_MOSI

SPI接口MOSI

4

SCLK

12

PA5/SPI1_SCK

SPI接口时钟线

5

SO

13

PA6/SPI1_MISO

SPI接口MISO

6

GDO2

9

PA2

通用IO

7

GDO0

8

PA1

接纳中止

8

CSN

10

PA3

芯片片选使能

【原理】

CC1101是TI公司一款高性价比的单片UHF收发器,为低功耗无线电运用而规划。它是CC1100器材的加强升级版,灵敏度更高,功耗更小,带宽更大。CC1101可满意多个领域中的低功耗无线运用要求,如警报与安全、主动抄表、工业监控以及家庭和楼宇主动化等。CC1101抱负适用于工业、科学及医药设备(ISM)以及316、433、868及916MHz短距设备(SRD)频带。可是,该器材也可便利编程,以支撑其它频率,如300-348MHz、387-467MHz及779-928MHz等。超卓的频带与调制格局支撑使其能与现在的RF终端设备相兼容。

图1 CC1101 的外引脚图(仰望)

CC1100经过4线SPI兼容接口 (SI,SO,SCLK和 CSn)装备。这个接口一同用作写和读缓存数据。SPI 接口上一切的处理都同一个包括一个读/写位,一个突发拜访位和一个 6 位地址的头字节一同效果。在地址和数据转化期间, CSn 脚 (芯片挑选,低电平有用)有必要坚持为低电平。假如在过程中 CSn 变为高电平,则转化撤销。当 CSn 变低, 在开端转化头字节之前, MCU有必要等候,直到 SO脚变低。这标明电压调制器现已安稳,晶体正在运作中。除非芯片处在 SLEEP 或 XOFF 状况,SO 脚在 CSn变低之后总会当即变低。关于CC1101对装备寄存器写和读操作如图2所示。

芯片状况位

当头字节在 SPI 接口上被写入时,芯片状况字节在 SO 脚上被 CC1100 写入。状况字节包括要害状况信号,对MCU是有用的。第一位 s7,是CHIP_RDYn 信号。在 SCLK的在第一个正边际之前,这个信号有必要变低。CHIP_RDYn 信号标明晶体正处于工作中,调理数字供应电压是安稳的。6,5 和4 位由状况值组成。这个值反映了芯片的状况。 当使 XOSC 闲暇并使数字中心的能量敞开,一切其他模块处于低功耗状况时。只要芯片处于此状况时,频率和信道装备才干被更新。当芯片处于接纳形式时, RX状况是活动的。同样地,当芯片处于发送形式时,TX状况是活动的。状况字节中的后四位( 3 :0)包括FIFO_BYTES_AVAILABLE。为了进行读操作,这个区域包括可从 RX FIFO 读取的字节数。为了进行写操作,这个区域包括可写入 TX FIFO 的 字节数。

寄存器拜访

CC1100装备寄存器坐落SPI地址从0x00到0x2F之间。一切的装备寄存器均能读和写。当对寄存器写时,每逢一个待写入的数据字节传输到 SI脚时,状况字节将被送至 SO脚。 经过在地址头设置突发位,接连地址的寄存器能高效地被拜访。这个地址在内部计数器内设置开端地址。每添加一个新的字节计数器值添加 1。 突发拜访,不管是读拜访仍是写拜访,有必要经过设置CSn 为高来停止。对 0x30-0x3D间的地址来说, 突发位用以在状况寄存器和指令滤波之间挑选。状况寄存器只读。突发读取对状况寄存器是不可取的,故它们每次只能被读一个。

指令滤波

指令滤波可被视为 CC1100 的单字节指令。经过指令滤波寄存器的选址,内部序列被发动。这些指令用来封闭晶体振荡器,敞开传输形式和电磁波激活等。指令滤波寄存器的拜访和一个寄存器的写操作相同,但没有数据被传输。就是说,只

有 R/W 位(置为 0) ,突发拜访(置为 0)和六个地址位(0x30和0x3D之间)被写。一个指令滤波可能在任何其他 SPI 拜访之后,而不需要将 CSn 拉至高电平。指令滤波当即被执行,当 CSn 高时 SPWD和 SXOFF滤波是破例。

FIFO拜访

64 字节 TX FIFO 和 64 字节 RX FIFO 经过0x3F 被拜访。当读/写位为 0 时,TX FIFO被拜访,当读/写位为 1 时,RX FIFO 被拜访。 TX FIFO是只写的,而 RX FIFO是只读的。突发位用来决议 FIFO 拜访是单字节仍是突发拜访。单字节拜访办法希望地址的突发位为 0 及1 数据字节。在数据字节之后等候一个新的地址,因而,CSn持续坚持低。突发拜访办法答应一地址字节,然后是接连的数据字节,直到经过设置 CSn 为高来关断拜访。 当对 TX FIFO写时,状况字节对每个 SO脚上的新数据字节是输出量,如图 6 所示。这个状况位能用来侦测对 TX FIFO 写数据时的下溢。留意,状况字节包括在写入字节到 TX FIFO 的过程前闲暇的字节数。当最终一个合适 TX FIFO的字节被传送至 SI 脚后, 被 SO脚接纳的状况位会标明在 TX FIFO中只要一个字节是闲暇的。

传输 FIFO 可能会经过发布一个 SFTX 指令滤波而被吞没。相似地,一个 SFRX指令滤波会吞没接纳 FIFO。当进入休眠状况时, 两个 FIFO都被清空。PATABLE 拜访

0x3E 地址用来拜访 PATABLE。PATABLE用来挑选 PA 能量操控设置。在接纳此地址之后,SPI 等候至少 8 个字节。经过操控PATABLE,能完结可控的 PA能量上升和下降,削减的带宽的 ASK 调制整型也如此PATABLE 是一个 8 字节表, 界说了 PA操控 设置, 为 8 个 PA 功率值(由FRENDO.PA_POWER 的 3 个位的值所挑选)的每一个所运用。这个表从最低位到最高位可读和写,一此一位。一个索引计数器用来操控对这个表的拜访。每读出或写入表中的一个字节,计数器就加 1。当 CSn 为高时,计数值置为最小值。当到达最大值时,计数器由零从头开端计数。

PATABLE 拜访

对 PATABLE 的拜访是单字节或许突发拜访,由突发位决议。当运用突发拜访时,索引计数器的值添加;到达7时从头从0开端。读/写位操控拜访是写拜访(R/W=0)或许读拜访(R/W=1)。 假如一字节被写入 PATABLE,且这个值将要被读出,那么,为了设置索引计数器的值重为 0,CSn有必要在读拜访之前置为高。 留意,当 PATABLE 进入休眠状况时,所存储的内容会丢掉,特别是第一个字节。

图2 装备寄存器写和读操作

STM32的串行外设接口(SPI)

STM32的串行外设接口(SPI)有如下特性:

● 3线全双工同步传输

● 带或不带第三根双向数据线的双线单工同步传输

● 8或16位传输帧格局挑选

● 主或从操作

● 支撑多主形式

● 8个主形式波特率预分频系数(最大为fPCLK/2)

● 从形式频率 (最大为fPCLK/2)

● 主形式和从形式的快速通讯

● 主形式和从形式下均能够由软件或硬件进行NSS办理:主/从操作形式的动态改动

可编程的时钟极性和相位

● 可编程的数据次序,MSB在前或LSB在前

● 可触发中止的专用发送和接纳标志

● SPI总线忙状况标志

● 支撑牢靠通讯的硬件CRC

─ 在发送形式下,CRC值能够被作为最终一个字节发送

─ 在全双工形式中对接纳到的最终一个字节主动进行CRC校验

● 可触发中止的主形式毛病、过载以及CRC过错标志

● 支撑DMA功用的1字节发送和接纳缓冲器:发生发送和承受恳求

一般SPI经过4个引脚与外部器材相连: MISO:主设备输入/从设备输出引脚。该引脚在从形式下发送数据,在主形式下接纳数据。 MOSI:主设备输出/从设备输入引脚。该引脚在主形式下发送数据,在从形式下接纳数据。 SCK:串口时钟,作为主设备的输出,从设备的输入 NSS:从设备挑选。这是一个可选的引脚,用来挑选主/从设备。它的功用是用来作为“片

选引脚”,本试验中没有运用。SPI的方框图如图3所示。

图3 SPI内部框图

图4 数据帧格局图

【试验过程】

1.学习STM32串行外设接口(SPI)相关常识,了解所调用的库函数,学习CC1101相关常识,了解CC1101的装备办法,研讨TI关于CC1101与MSP430的接口程序库,了解库的完结办法。

2.衔接电路。

3.编写程序,凭借逻辑分析仪东西,调试程序。

【程序代码结构】

一切与CC1101相关的代码均放于CCxxxx文件夹,源文件用处分类阐明如表2所示。关于运用分层框图如图5所示。由于程序较大,仅把与硬件相关、改动较大的TI_CC_spi.c放在附录中。

表2 源文件用处分类阐明

类型

文件名

功用

硬件界说文件

TI_CC_CC1100-CC2500.h

对CC1101内部寄存器的界说

TI_CC_STM32.h

对运用的STM32相关SPI引脚进行界说

TI_CC_hardware_board.h

对运用的STM32通用数据引脚进行界说

SPI接口文件

TI_CC_spi.c

经过SPI拜访CC1101寄存器的功用完结文件。

TI_CC_spi.h

对TI_CC_spi.c的函数进行声明

与运用层接口文件

CC1100-CC2500.c

对CC1101的运用的功用文件,包括初始化、发送数据包、接纳数据包

CC1100-CC2500.h

对CC1100-CC2500.c的函数进行声明

include.h

高层包括文件,包括一切.h文件

运用层

CC1100-CC2500.c

TI_CC_spi.c

TI_CC_hardware_board.h

TI_CC_STM32.h

TI_CC_CC1100-CC2500.h

TI_CC_STM32.h

SPI运用

硬件界说

main.c

图5 库文件程序分层框图

【试验总结】

CC1101是在上升沿读入数据,即上升沿有用,一般时钟线默许是高电平,装备此功用的寄存器时CPOL(时钟极性 )和CPHA(时钟相位)当CPOL=0时,闲暇状况时,SCK坚持低电平,CPOL=1时,闲暇状况时,SCK坚持高电平。CPHA =0时数据采样从第一个时钟边缘开端,CPHA =1时数据采样从第二个时钟边缘开端。在CC1101的装备中,这两个操控装备为CPOL=1,CPHA =1。

在改写本来TI的程序时,为了坚持好的移植性,因而对一切的函数名均未做改动,文件名也尽量不改动,仅将TI_CC_MSP430.h改为TI_CC_STM32.h,当然由于是运用于两种天壤之别的MCU,所以与硬件相关的宏界说有较大改动。

STM32与CC1101的通讯的逻辑分析仪截图如图6-图8所示,其间图6是发动CC1101时的逻辑波形,图7是写装备寄存器时的逻辑波形,图8读寄存器时的逻辑波形。

6 发动CC1101时的逻辑波形

图 写装备寄存器时的逻辑波形

图8 读寄存器时的逻辑波形

附录:

////////////////////////////////////////////////////////////////////////////////

// 文件名: TI_CC_spi.c

// 工作环境: IAR for ARM 5.41 Kickstart,根据STM32F103ZE-EK

// 作者: 程家阳

// 生成日期: 2010.03.15

// 功用: STM32与CCxxxx进行通讯的SPI底层函数,完结初始化STM32的SPI口用于衔接

// CCxxxx,读写CCxxxx寄存器。

//留意:

//

//

// 相关文件:

// 修正日志:

////////////////////////////////////////////////////////////////////////////////

#include “include.h”

#include “TI_CC_spi.h”

////////////////////////////////////////////////////////////////////////////////

// 程序名 : void TI_CC_Wait(unsigned int cycles)

// 效果 : 延时

// 输入参数:无

// 输出参数:无

// 阐明: uS级延时

//

////////////////////////////////////////////////////////////////////////////////

void TI_CC_Wait(unsigned int cycles)

{

while(cycles>15) // 15 cycles consumed by overhead

cycles = cycles – 6; // 6 cycles consumed each iteration

}

////////////////////////////////////////////////////////////////////////////////

// 程序名 : void TI_CC_SPISetup(void)

// 效果 : 初始化装备SPI

// 输入参数:无

// 输出参数:无

// 阐明:

//

////////////////////////////////////////////////////////////////////////////////

void TI_CC_SPISetup(void)

{

SPI_InitTypeDef SPI_SST_Init_Structure;//界说SPI装备结构体

GPIO_WriteBit(TI_CC_CSn_GPIO, TI_CC_CSn_PIN, Bit_SET);//CS disable

RCC_APB2PeriphClockCmd( RCC_APB2Periph_SPI1 ,ENABLE);//时钟使能

//装备为双线双工形式

SPI_SST_Init_Structure.SPI_Direction=SPI_Direction_2Lines_FullDuplex;

//主器材

SPI_SST_Init_Structure.SPI_Mode=SPI_Mode_Master;

//8bit数据帧

SPI_SST_Init_Structure.SPI_DataSize=SPI_DataSize_8b;

//时钟线默许高

SPI_SST_Init_Structure.SPI_CPOL=SPI_CPOL_High ;

//数据捕获于第二个时钟沿,这两个其实装备了时钟极性和相位

SPI_SST_Init_Structure.SPI_CPHA=SPI_CPHA_2Edge;

//NSS形式挑选

SPI_SST_Init_Structure.SPI_NSS=SPI_NSS_Soft;

//波特率预分频值为 64

SPI_SST_Init_Structure.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_64;

//数据传输从 MSB 位开端

SPI_SST_Init_Structure.SPI_FirstBit=SPI_FirstBit_MSB;

SPI_Init(SPI1, &SPI_SST_Init_Structure); //操作

SPI_Cmd(SPI1,ENABLE); //使能

//下面的几句,详细效果不太清楚,需了解

//TI_CC_SPI_USCIA0_PxSEL |= TI_CC_SPI_USCIA0_SIMO | TI_CC_SPI_USCIA0_SOMI | TI_CC_SPI_USCIA0_UCLK;

// SPI option select

//TI_CC_SPI_USCIA0_PxDIR |= TI_CC_SPI_USCIA0_SIMO | TI_CC_SPI_USCIA0_UCLK;

// SPI TXD out direction

}

////////////////////////////////////////////////////////////////////////////////

// 程序名 : void TI_CC_SPIWriteReg(char addr, char value)

// 效果 : 向一个”addr”指向的寄存器中写入值”value”

// 输入参数:char addr :指向的地址

// char value :要写入的值

// 输出参数:无

// 阐明:

//

////////////////////////////////////////////////////////////////////////////////

void TI_CC_SPIWriteReg(char addr, char value)

{

GPIO_WriteBit(TI_CC_CSn_GPIO, TI_CC_CSn_PIN, Bit_RESET); //CS enable

// Wait for CCxxxx ready

while(GPIO_ReadInputDataBit(TI_CC_SPI_USCIA0_GPIO, TI_CC_SPI_USCIA0_SOMI)!= RESET)

{

;

}

SPI_I2S_SendData(SPI1, (uint16_t)addr);// Send address

// Wait for TX to finish$$

while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_BSY )!= RESET)//线路忙则等候

{

;

}

SPI_I2S_SendData(SPI1, (uint16_t)value);//发送数据经过SPI1

// Wait for TX to finish

while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_BSY )!= RESET)//线路忙则等候

{

;

}

GPIO_WriteBit(TI_CC_CSn_GPIO, TI_CC_CSn_PIN, Bit_SET); // CS disable

}

////////////////////////////////////////////////////////////////////////////////

// 程序名 : void TI_CC_SPIWriteBurstReg(char addr, char *buffer, char count)

// 效果 : 向一个”addr”指向的寄存器中写入值”value”

// 输入参数:char addr :指向的地址

// char value :要写入的值

// 输出参数:无

// 阐明:

//

////////////////////////////////////////////////////////////////////////////////

void TI_CC_SPIWriteBurstReg(char addr, char *buffer, char count)

{

unsigned int i;

GPIO_WriteBit(TI_CC_CSn_GPIO, TI_CC_CSn_PIN, Bit_RESET); // /CS enable

// Wait for CCxxxx ready

while(GPIO_ReadInputDataBit(TI_CC_SPI_USCIA0_GPIO, TI_CC_SPI_USCIA0_SOMI)!= RESET)

{

;

}

// Send address

SPI_I2S_SendData(SPI1, (uint16_t)(addr | TI_CCxxx0_WRITE_BURST));

while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_BSY )!= RESET)//线路忙则等候

{

;

}

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

{

// Send data

SPI_I2S_SendData(SPI1, (uint16_t)buffer[i]);//发送数据经过SPI1

while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_BSY )!= RESET)//线路忙则等候

{

;

}

}

GPIO_WriteBit(TI_CC_CSn_GPIO, TI_CC_CSn_PIN, Bit_SET); //CS disable

}

////////////////////////////////////////////////////////////////////////////////

// 程序名 : char TI_CC_SPIReadReg(char addr)

// 效果 : 从一个单一的装备寄存器中读数,寄存器地址:”addr”

// 输入参数:char addr :指向的地址

// 输出参数:char :回来的寄存器值

// 阐明:

//

////////////////////////////////////////////////////////////////////////////////

char TI_CC_SPIReadReg(char addr)

{

char x;

GPIO_WriteBit(TI_CC_CSn_GPIO, TI_CC_CSn_PIN, Bit_RESET); // /CS enable

// Wait for TX to finish

while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_BSY )!= RESET)//线路忙则等候

{

;

}

// Send address

SPI_I2S_SendData(SPI1, (uint16_t)(addr | TI_CCxxx0_READ_SINGLE));

// Wait for TX to finish

while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_BSY )!= RESET)//线路忙则等候

{

;

}

//虚拟的接纳数据,用来清空接纳寄存器

x = SPI_I2S_ReceiveData(SPI1);//接纳数据经过SPI1

// Dummy write so we can read data

SPI_I2S_SendData(SPI1, (uint16_t)0xff);

// Address is now being TXed, with dummy byte waiting in TXBUF…

while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_BSY )!= RESET)//线路忙则等候$$$$

{

;

}

// Dummy byte RXed during addr TX now in RXBUF

// Clear flag//这个在stm32中是硬件铲除

while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_BSY )!= RESET)//线路忙则等候

{

;

}

// Data byte RXed during dummy byte write is now in RXBUF

x = SPI_I2S_ReceiveData(SPI1);//接纳数据经过SPI1

GPIO_WriteBit(TI_CC_CSn_GPIO, TI_CC_CSn_PIN, Bit_SET); // /CS disable

return x;

}

////////////////////////////////////////////////////////////////////////////////

// 程序名 : void TI_CC_SPIReadBurstReg(char addr, char *buffer, char count)

// 效果 : 从多个寄存器中读数,第一个寄存器地址:”addr”,读出的数据寄存于”buffer”

// 为开端地址的存储空间,一共读”count”个寄存器。

// 输入参数:char addr :指向的地址

// char *buffer:寄存的存储空间的开端地址

// char count:要读的寄存器的数量

// 输出参数:无

// 阐明:

//

////////////////////////////////////////////////////////////////////////////////

void TI_CC_SPIReadBurstReg(char addr, char *buffer, char count)

{

char i;

char x;

GPIO_WriteBit(TI_CC_CSn_GPIO, TI_CC_CSn_PIN, Bit_RESET); // /CS enable

// Wait for CCxxxx ready

while(GPIO_ReadInputDataBit(TI_CC_SPI_USCIA0_GPIO, TI_CC_SPI_USCIA0_SOMI)!= RESET)

{

;

}

// Send address

SPI_I2S_SendData(SPI1, (uint16_t)(addr | TI_CCxxx0_READ_BURST));

// Wait for TXBUF ready

while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_BSY )!= RESET)//线路忙则等候

{

;

}

//虚拟的接纳数据,用来清空接纳寄存器

x = SPI_I2S_ReceiveData(SPI1);//接纳数据经过SPI1

// Dummy write to read 1st data byte

SPI_I2S_SendData(SPI1, (uint16_t)0xff);//发送数据经过SPI1

// Addr byte is now being TXed, with dummy byte to follow immediately after

while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_BSY )!= RESET)//线路忙则等候

{

;

}

x = SPI_I2S_ReceiveData(SPI1);//接纳数据经过SPI1

while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_BSY )!= RESET)//线路忙则等候

{

;

}

// First data byte now in RXBUF

for (i = 0; i < (count-1); i++)

{

//UCA0TXBUF = 0; //Initiate next data RX, meanwhile.&$$$$$.

SPI_I2S_SendData(SPI1, (uint16_t)0);//发送数据经过SPI1

// Store data from last data RX

buffer[i] = SPI_I2S_ReceiveData(SPI1);//接纳数据经过SPI1

while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_BSY )!= RESET)//线路忙则等候

{

;

}

}

// Store last RX byte in buffer

buffer[count-1]= SPI_I2S_ReceiveData(SPI1);//接纳数据经过SPI1

GPIO_WriteBit(TI_CC_CSn_GPIO, TI_CC_CSn_PIN, Bit_SET); // CS disable

}

////////////////////////////////////////////////////////////////////////////////

// 程序名 : char TI_CC_SPIReadStatus(char addr)

// 效果 : 从状况寄存器中读数,寄存器地址:”addr”

// 输入参数:char addr :指向的状况寄存器地址

// 输出参数:char :状况寄存器的值

// 阐明:

//

////////////////////////////////////////////////////////////////////////////////

char TI_CC_SPIReadStatus(char addr)

{

char x;

GPIO_WriteBit(TI_CC_CSn_GPIO, TI_CC_CSn_PIN, Bit_RESET); // /CS enable

//Wait for CCxxxx ready

while(GPIO_ReadInputDataBit(TI_CC_SPI_USCIA0_GPIO, TI_CC_SPI_USCIA0_SOMI)!= RESET)

{

;

}

// Send address

SPI_I2S_SendData(SPI1, (uint16_t)(addr | TI_CCxxx0_READ_BURST));//发送数据经过SPI1

while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_BSY )!= RESET)//线路忙则等候

{

;

}

// Dummy write so we can read data

x = SPI_I2S_ReceiveData(SPI1);//接纳数据经过SPI1

SPI_I2S_SendData(SPI1, (uint16_t)0xff);//发送数据经过SPI1

while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_BSY )!= RESET)//线路忙则等候

{

;

}

// Read data

x = SPI_I2S_ReceiveData(SPI1);//接纳数据经过SPI1

GPIO_WriteBit(TI_CC_CSn_GPIO, TI_CC_CSn_PIN, Bit_SET); // CS disable

return x;

}

////////////////////////////////////////////////////////////////////////////////

// 程序名 : void TI_CC_SPIStrobe(char strobe)

// 效果 : 向指令寄存器写数,写入的值”strobe”

// 输入参数:char strobe :要写入的值

// 输出参数:无

// 阐明:

//

////////////////////////////////////////////////////////////////////////////////

void TI_CC_SPIStrobe(char strobe)

{

GPIO_WriteBit(TI_CC_CSn_GPIO, TI_CC_CSn_PIN, Bit_RESET); //CS enable

// Wait for CCxxxx ready

while(GPIO_ReadInputDataBit(TI_CC_SPI_USCIA0_GPIO, TI_CC_SPI_USCIA0_SOMI)!= RESET)

{

;

}

// Send strobe

SPI_I2S_SendData(SPI1, (uint16_t)strobe);//发送数据经过SPI1

// Strobe addr is now being TXed

while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_BSY )!= RESET)//线路忙则等候

{

;

}

GPIO_WriteBit(TI_CC_CSn_GPIO, TI_CC_CSn_PIN, Bit_SET); //CS disable

}

////////////////////////////////////////////////////////////////////////////////

// 程序名 : void TI_CC_PowerupResetCCxxxx(void)

// 效果 : 硬复位CC芯片

// 输入参数:无

// 输出参数:无

// 阐明:

//

////////////////////////////////////////////////////////////////////////////////

void TI_CC_PowerupResetCCxxxx(void)

{

GPIO_WriteBit(TI_CC_CSn_GPIO, TI_CC_CSn_PIN, Bit_SET); // CS disable

TI_CC_Wait(30);

GPIO_WriteBit(TI_CC_CSn_GPIO, TI_CC_CSn_PIN, Bit_RESET); //CS enable

TI_CC_Wait(30);

GPIO_WriteBit(TI_CC_CSn_GPIO, TI_CC_CSn_PIN, Bit_SET); //CS disable

TI_CC_Wait(45);

GPIO_WriteBit(TI_CC_CSn_GPIO, TI_CC_CSn_PIN, Bit_RESET); //CS enable

// Wait for CCxxxx ready

while(GPIO_ReadInputDataBit(TI_CC_SPI_USCIA0_GPIO, TI_CC_SPI_USCIA0_SOMI)!= RESET)

{

;

}

// Send strobe

SPI_I2S_SendData(SPI1, (uint16_t)TI_CCxxx0_SRES);//发送数据经过SPI1

// Strobe addr is now being TXed

while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_BSY )!= RESET)//线路忙则等候

{

;

}

// Wait for CCxxxx ready

while(GPIO_ReadInputDataBit(TI_CC_SPI_USCIA0_GPIO, TI_CC_SPI_USCIA0_SOMI)!= RESET)

{

;

}

GPIO_WriteBit(TI_CC_CSn_GPIO, TI_CC_CSn_PIN, Bit_SET); //CS disable

}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qiche/xinnengyuan/275877.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部