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点亮。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值