微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > CC1101接口与STM32

CC1101接口与STM32

时间:11-11 来源:互联网 点击:

可编程的时钟极性和相位
● 可编程的数据顺序,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);// Sen

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top