一、硬件:
0.原理图概览
1.板层堆叠推荐
偏离推荐的堆叠结构可能会改变寄生效应,在某些情况下可能导致需要重新设计滤波器平衡-非平衡变压器。
阻抗匹配
选择板厂可提供的最相近的堆叠结构,为匹配阻抗50Ω,根据板厂的堆叠结构,计算相应的线宽。
如本次设计使用嘉立创层压结构,板材FR4,最相近的就是JLC041611-7628(通用/成品板厚1.57mm±10%),
外层和内层铜厚都设置为1盎司,嘉立创自动计算出的线宽为13.20mil,即13.2x0.0254=0.33528
然后保险起见,根据上述嘉立创的板材和层压结构,使用TI的TXLINE再次计算线宽:
1.选择CPW Ground,
2.板材FR4电介质选择GaAs
3.导体选择Copper铜
4.介电常数4.5 (FR4介电常数4.2~4.7)
5.损耗正切角默认0.0005
6.阻抗50Ohms
7.频率:本次CC1310使用868MHz频段
8.电长度(物理长度/波长x360):波长ƛ = c/f,c = 光速 (299,792,458 m/s),f = 频率 (Hz),我是按默认算了,该参数好像影响不大。。
9.Gap(铺铜与导线距离):根据实际情况,本次铺铜间隔规则设置是0.254mm
10.Height(信号线与参考层高度):嘉立创层叠为0.2030mm
11.Thickness(铜厚):0.035mm(1盎司)
推算结果如下,线宽为0.33278mm,与嘉立创计算结果一致
2.频段、天线
CC1310支持1GHz以下多频段无线通信,具体哪个频段可以软件配置。花了很长一段时间去寻找,不同的频段通信时CC1310芯片天线引脚的电感电容值是否需要更改,直到通过LAUNCHXL-CC1310 评估板 | TI.com.cn找到CC-ANTENNA-DK2 开发套件 | TI.com.cn它的天线套件应用手册。
我们通常说的频段是指ISM(IndustrialScientificMedical Band,工业、科学、医疗频段),天线套件资料中也说明了不同国家地区常用的天线频段:
这个天线套件是12合1板,全都是天线,对应不同的频段使用
刚好就充当我们CC1310开发板Launchpad的天线
看来,对于不同频段,CC1310外围电路是不需要更改的,只需要更改相对应的天线即可,同时需要关注板载天线,因为板载天线主要用于大批量产品。
但是看了应用手册《CC13xx/CC26xx 硬件配置和 PCB 设计注意事项 (Rev. H)》中有这么一句:
元件值取决于工作频带....又迷茫了,也不知资料中说的元件值是指红色元件值还是图中所有未标明大小的值。
3.RF差分转单端
即:
4.滤波器
即:
注意有一句话好像解释了前面的问题:滤波器具有将阻抗转换为50Ω的功能
但是不确定。。。
5.滤波器Layout
右边的最好
Layout最好去看文档
CC13xx/CC26xx 硬件配置和 PCB 设计注意事项 (Rev. H) |
6.天线匹配网络(单频带)
这个Π型匹配网络针对于板载PCB天线,外接天线不需要。
7.去耦电容
要求所有去耦电容器的回流(到芯片GND)路径最小,注意大电容封装。
8.晶体、晶振
24/48MHz晶体:无线电需要以 24/48MHz 晶体作为频率基准。选择小ppm的晶振。
32.768kHz 晶体是可选的,CC1310内部有可以作为参考。
二、嵌入式软件
1.开发环境下载及配置:
1.SDK: SimpleLink_cc13x0_sdk_4_20_02_07 (需要安装在C盘默认路径ti中,否则会出现未知问题,如IAR工程找不到代码文件)
2.编译环境:IAR8.5以上版本(推荐IAR9.2以上,安装注册和8版本有区别需要注意) 或 TI的CCS
IAR9.30以上版本安装、注册、新建工程和配置过程详细介绍_arm开发_luobeihai-GitCode 开源社区 (csdn.net)
3.IAR导入配置:IAR-->Tools-->Configure custom argument variable-->Global-->import
IAR导入路径:SDK安装路径下simplelink_cc13x0_sdk_4_20_02_07\tools\iar 中SIMPLELINK_CC13X0_SDK.custom_argvars
2.新建工程和编译
新建一个IAR工程
1.将C:\ti\C:\ti\simplelink_cc13x0_sdk_4_20_02_07\tools\iar中的Examples.html 拖入IAR中
2.在CC1310_LAUNCHXL中复制一个demo,比如复制一个uart例程,在TI Drivers下选择uartecho的NO RTOS
3.在工作盘建立一个工程文件夹,选择该文件夹为复制的工程路径 4.建立一个Source Insight来阅读代码,需要将ti的C:\ti\C:\ti\simplelink_cc13x0_sdk_4_20_02_07\source\ti\drivers 包含
5.打开例程的工程,右击工程,修改调试配置:
1)options-->TI XDS-->emulator-->specify custom board file
2)options-->TI XDS-->board-->CC13xx_XDS110_CJTAG.dat
3)output converter -->Generate addition output-->output format --> Intel extended hex
参考CC1310开发环境IAR_cc1310 iar-CSDN博客
6.官方例程说明文档Readme中最后一句说明,根据不同情况设置Debug为XDS110还是JTAG-4pin
3.下载调试(以及JTAG的坑)
1.开发板自带JTAG,XDS110
2.使用XDS110□ XDS220□ Texas Instruments 仿真器
3.使用仿真器时,如果用IAR8.5版本以下下载CC1310程序,会导致仿真器固件损坏(也不知道是为什么),具体表现为:XDS110仿真器的灯一直亮红色,正常情况应该是绿色。遇到这种情况时要走下面的流程:
3.1 拆开XDS110仿真器,断电,短接GND和TDO引脚,上电。此时上电应该灯应该为熄灭状态,那表示短接成功了,解压打开恢复固件(安装英文路径):
点击start等5秒灯变绿就好了。
3.2 如果多次 断电、短接GND和TDO引脚、上电 无效,仍亮红灯,则需要准备JLINK仿真器和JFlash软件重刷XDS110固件:
【免费】XDS110-XDS220固件修复文件资源-CSDN文库
文件中有固件bin代码文件和JFlash、固件修复程序
3.3 准备重刷固件:连接JLINK仿真器和XDS110仿真器的GND和GND、CLK和TCK、DIO和TMS,给两个仿真器上电(两个仿真器的3V3相连的话只需要给JLINK仿真器上电即可)。
3.4 软件JFlash下载完后,有一堆运行程序,打开J-Link RTT Viewer->File->Connect,连接选USB,Specify Target Device选择拆开的XDS110的主芯片上的丝印前两行,比如我的是TM4C1294KCPDT,Target Interface Speed选择SWD。
3.5 连接成功后断开连接,说明烧录硬件没问题
3.6 打开JFlashV6.80,File新建工程后连接主芯片TM4C1294KCPDT,先擦除扇区,再烧录以下bin文件,烧录起始地址默认0x0
3.7 烧录后灯应该是绿灯或者不亮的,绿灯就是成了,不亮的话打开设备管理器,能看到有电脑标示Stellairs Device Firmware Upgrade,这时打开恢复固件,点击start等5秒灯变绿即可。
4.基本例程说明
1.PIN_Config GPIO配置数据类型,定义pin配置列表
2.PIN_open 理解为pin配置列表生效
3.PIN_setOutputValue 设置pin输出电平值
4.PIN_getOutputValue 获取pin输出电平值
5.PIN_getPortOutputValue 获取全部pin输出电平值,参数为PIN_Handle
6.sleep 延时,单位s
7.usleep 延时,单位us
。。。其他自己看例程吧,会点灯其他的也就差不多了
需要注意的是GPIO点灯控制有两种方式,一种便是上面提到的PIN_open,
另一种是GPIO_setConfig(); GPIO_write();
但是这种方式的参数并不是单纯的 IOID_6,从例程中go to到最后是枚举变量中的参数,因此把Borad_GPIO_LED0直接替换成IOID_6是无法点亮的。
但是这个枚举由于找不到函数原型,因此不清楚是哪里定义和使用的,有知道的大佬还请赐教。
5.UART
例程uartecho提供了最基本的初始化,功能:接收到什么就发送什么,串口引脚直接在CC1310_LAUNCHL.h文件#define更改。
但是应用时需要改一些初始化配置,如例程中接收和发送都是阻塞方式,增加以下初始化代码,其他参数需要改的话自己进句柄里看看有哪些需要改。
uartParams.baudRate = 115200;
uartParams.dataLength = UART_LEN_8;
uartParams.stopBits = UART_STOP_ONE;
uartParams.parityType = UART_PAR_NONE;
//读写回调模式和回调函数
uartParams.writeMode = UART_MODE_CALLBACK;
uartParams.writeCallback = Uart_WriteCallback;
uartParams.readMode = UART_MODE_CALLBACK;
uartParams.readCallback = Uart_ReadCallback;
static void Uart_WriteCallback(UART_Handle handle, void *txBuf, size_t size)
{
}
static void Uart_ReadCallback(UART_Handle Handle, void *buf, size_t count)
{
UART_read(Handle, buf, 1);
}
6.RF
修改RF频率:
修改配置参数RF_cmdPropRadioDivSetup.centerFreq 和 RF_cmdFs.frequency
RF例程说明:
关于RF无线收发官方有2套例程,分别是rfEchoRx、rfEchoTx 和 rfPacketRx、rfPacketTx,两套例程的功能区别如下:
前者是带收发回复的,即Tx板发送完成后,进入下一个操作接收Rx板的回复,如果没有回复会执行相应的操作,在开发板上体现为红绿灯交替闪烁;Rx板接收完成后,进入下一个操作发送刚刚接收到的数据到Tx板。
后者不带收发回复,即Tx板只管发送,至于有没有板子接收那我就不管了,同理Rx只管接收。
初始化区别:
Echo例程Tx和Rx初始化有关联,不论是Tx板还是Rx板都打开了发送和接收;
Packet例程Tx板只打开发送功能,Rx板只打开接收功能。
死机问题:
如果烧录后,执行到RF_runCmd函数就死机,查看硬件电路:
晶振是否是24M,晶振是否起振,程序运行过程中晶振起振是否失效,VDDR_RF是否在1.7~1.95V(实测1.6V以上也算正常)
7.ADC
初始化:
void MCU_ADC_init(void)
{
/* 底层初始化 */
ADCBuf_init();
ADCBuf_Params_init(&adcBufParams);
// adcBufParams.callbackFxn = adcBufCallback; /* 中断采集模式时,中断函数 */
adcBufParams.recurrenceMode = ADCBuf_RECURRENCE_MODE_ONE_SHOT; /* 转换模式:ONE_SHOT(阻塞)或CONTINUOUS(中断) */
adcBufParams.returnMode = ADCBuf_RETURN_MODE_BLOCKING; /* 选择返回模式:阻塞/中断 */
adcBufParams.blockingTimeout = 1000000; /* 阻塞模式超时时间,us */
adcBufParams.samplingFrequency = 200; /* 采样率 */
adcBuf = ADCBuf_open(Board_ADCBUF0, &adcBufParams);
/* 阻塞模式参数初始化 */
oneshotConversion.arg = NULL; /* 中断模式下,指向自定义参数,以传递给adcBufCallback */
oneshotConversion.adcChannel = Board_ADCBUF0CHANNEL4; /* ADC通道 */
oneshotConversion.sampleBuffer = sampleBufferOne; /* 阻塞、中断模式可用 */
// oneshotConversion.sampleBufferTwo = sampleBufferTwo; /* 中断模式可用 */
oneshotConversion.samplesRequestedCount = ADCBUFFERSIZE; /* 通道的采样请求数量,即采多少次,sampleBuffer和sampleBufferTwo必须足够大,至少>=该采样数 */
/* 中断模式参数初始化 */
// continuousConversion.arg = NULL; /* 中断模式下,指向自定义参数,以传递给adcBufCallback */
// continuousConversion.adcChannel = Board_ADCBUF0CHANNEL4; /* ADC通道 */
// continuousConversion.sampleBuffer = sampleBufferOne; /* 阻塞、中断模式可用 */
// continuousConversion.sampleBufferTwo = sampleBufferTwo; /* 中断模式可用 */
// continuousConversion.samplesRequestedCount = ADCBUFFERSIZE; /* 通道的采样请求数量,即采多少次,sampleBuffer和sampleBufferTwo必须足够大,至少>=该采样数 */
if (adcBuf == NULL)
{
/* adcBUF开启失败 */
while(1);
}
if (ADCBuf_convert(adcBuf, &oneshotConversion, 1) !=
ADCBuf_STATUS_SUCCESS)
{
/* 没有正确启动转换过程 */
while(1);
}
}
使用:
/* AD转换 */
ADCBuf_convert(adcBuf, &oneshotConversion, 1); //1是要转换的通道个数
/* 获取并调整AD值 */
ADCBuf_adjustRawValues(adcBuf, sampleBufferOne, ADCBUFFERSIZE, Board_ADCBUF0CHANNEL4);
/* 获取并调整真实值(单位mV) */
ADCBuf_convertAdjustedToMicroVolts(adcBuf, Board_ADCBUF0CHANNEL4, sampleBufferOne,
microVoltBuffer, ADCBUFFERSIZE)
程序说明:
1.ADC默认参考电压为4.3V,可修改代码改变参考电压,不支持外部参考电压
2. ADCBUFFERSIZE是采样次数
sampleBuffer:存储AD值,用于阻塞和中断模式
sampleBufferTwo:存储AD值,仅用于中断模式
Board_ADCBUF0CHANNEL4: ADC通道,本代码基于CC1310RHB(5x5mm)封装的,使用DIO_11,该封装DIO_7~DIO14分别对应ADC通道0~7
8.例程移植
1.打开main_nortos.c,找到main函数,步进;
2.找到PIN_init函数,更改BoardGpioInitTable为使用的列表;
3.如果没有外挂flash,找到所有ExtFlash有关的函数,内部都注释掉
4.所有#define用不到的全部更改为PIN_UNASSIGNED
5.其他例程中有一些应用层功能文件,需要复制移植过来,再include,直接include是找不到文件的
避坑报错
1.在Debug仿真过程中,有可能弹出如此弹框:Get Alternative File,内容是Could not Find the following source file,让你替换文件,类似以下这个弹框
如果你找到该文件并替换,可能会成功,也可能会强制你退出Debug并且无法再下载,报错如下:Error -2131 @ 0x..... failed to write register,然后弹出execution failure in flash loader。
进入Options,勾选Override defailt.board file,重新选择board file文件即可,然后就会神奇的发现即使再把这个选项取消勾选,也可以正常Debug和烧录了。