CMT2380F32模块开发20-射频收发例程
Posted andylauren
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CMT2380F32模块开发20-射频收发例程相关的知识,希望对你有一定的参考价值。
这个芯片与其他芯片的不同之处就是带了一个射频模块,这个射频模块集成的十分粗暴,并不是寄存器级别的集成,而是模块级别的集成,需要使用单片机的SPI与射频模块通信,有点像以前的单片机+SI4432的方案,只是这个单片机把SI4432放到了芯片里面。
上来先说一下有关的文档,当在开发过程中,需要修改的时候可以详细阅读这些文档。
AN143-CMT2300A_FIFO和包格式使用指南V1.1.pdf
官方文档,介绍了CMT2300A的FIFO,包格式,以及中断系统的工作原理。
AN144-CMT2300A RSSI使用指南_CN_V0.9.pdf
官方文档,介绍了CMT2300A的RSSI相关的寄存器,使用方法及校准方法。
AN149 CMT2300A射频参数配置指南-CN-V1.0-2020-0430.pdf
官方文档,本文介绍 CMT2300A RFPDK 的射频,OOK 解调,和 FSK 解调的参数配置。
CMOSTEK RFPDK_V1.51.zip
无线寄存器配置生成软件,如果有工具可以抓包。
cmt2300a_params_convert.py
生成参数文件脚本
exp转c的py脚本说明.txt
生成参数文件脚本使用说明
这里我讲一下配置射频参数的过程,首先看一下AN149文档,这里需要你有一些射频知识,才能知道你要配置成什么样的参数。
需要安装配置软件CMOSTEK RFPDK_V1.51.zip
安装后打开软件提示没找到usb设备,直接OK,进入主界面。
然后选择CMT2300A设备
next后会弹出未找到usb设备,直接OK
这两个位置就是你配置参数的位置了。
配置完成后你可以点击List保存你的配置到界面,下次进来的时候就有记录了,点击Export就可以导出你的配置。
建议导出名字保存为F470p7_DR192_DV100_TxP20_BWauto_Counting.exp,因为后面使用的脚本中是这个名字。
然后需要你的机器有python的环境,将生成的文件放在与cmt2300a_params_convert.py同级目录下,并运行cmt2300a_params_convert.py。
运行后会生成CMT2380F32_Demo.c文件,替换CMT2380F32_SampleCode Rev1.0.2\\example\\rf\\source中的同名文件即可。
如果需要修改文件内容,或者文件名,需要自己研究一下python的脚本了。
下面讲一下例程
Base.c是单片机相关的初始化,比如系统时钟,io初始化,定时器初始化等
CMT2300Config.c射频需要用到的函数,如射频模块的初始化,模式设置,fifo处理,发送接收。
CMT2380F32_Demo.c射频参数数组,初始化使用
interrupt.c中断处理函数,这里只是处理了定时器0,在中断触发时进行了计数。
KeyScan.c按键扫描和按键处理函数。
MCU_Init();
for (SysTime = 0; SysTime < 30;)
;
CMT2300Iint(); //初始化2300
GO_RX();
if (!TestKey1()) //测试模式
for (SysTime = 0; SysTime < 30;) // 30ms去抖
if (TestKey1()) break;
if (SysTime >= 30) TestMode();
while (1)
KeyScan();
if (Key_OK)
KeyProcess();
else if (Pack_OK)
RxOKAck();
if (ResetTime > 20000) // 20s复位一次
CMT2300Iint();
GO_RX();
主函数是初始化mcu和射频模块,并设置为接收模式,然后判断是否有按键,有按键按下进入测试模式,如果没有进入测试模式就开始循环检测按键。在按键检测中同时在检查是否有数据收到,
void KeyScan(void)
byte recvData;
Key_OK = 0; // 按键按下标志
Pack_OK = 0;
Sync_OK = 0;
if (ReadKey() && Key_Lost)
for (SysTime = 0; SysTime < 5;)
Delay(250);
if (!ReadKey()) break;
if (SysTime >= 5)
Key_Lost = 0;
Key_OK = 1;
return;
if (Test_GPIO1()) //检测包成功中断,接收到数据
GO_STBY();
SPI_Write(CUS_FIFO_CTL, 0x00); //读取FIFO
recvData = Read_FIFO(); //接收到的数据,可以识别出0x56, 0x23
Clr_INT();
switch (recvData)
case PackNum_N:
Pack_OK = 1;
break;
case SyncNum_N:
Sync_OK = 1;
break;
default:
break;
GO_RX();
if (!ReadKey()) Key_Lost = 1;
有按键按下会Key_OK = 1;,收到数据分两种,一种是收到发送来的数据PackNum_N,代表另一个模块发来的包,会设置Pack_OK = 1;;还有一种是收到应答包SyncNum_N,会设置Sync_OK = 1;
如果有按键按下会调用KeyProcess();,在这里发送pack数据。
Send_Pack(TX_Buf, 1, 4); // 发送4次0x56
然后切换回接收模式,循环接收应答包。
在主循环中接收到pack包后,使用RxOKAck();
void RxOKAck(void)
PWM2A_H();
TX_Buf[0] = SyncNum_N;
Send_Pack(TX_Buf, 1, 6); //回传0x23,发送6次
for (SysTime = 0; SysTime < 1000;)
;
PWM2A_L();
GO_RX();
就是发送6次应答字节。
程序效果就是发射端,按键K1发射,接收端收到,LED点亮。
以上是关于CMT2380F32模块开发20-射频收发例程的主要内容,如果未能解决你的问题,请参考以下文章