• 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按键扫描和按键处理函数。

    1. MCU_Init();
    2. for (SysTime = 0; SysTime < 30;)
    3. ;
    4. CMT2300Iint(); //初始化2300
    5. GO_RX();
    6. if (!TestKey1()) //测试模式
    7. {
    8. for (SysTime = 0; SysTime < 30;) { // 30ms去抖
    9. if (TestKey1()) break;
    10. }
    11. if (SysTime >= 30) TestMode();
    12. }
    13. while (1) {
    14. KeyScan();
    15. if (Key_OK) {
    16. KeyProcess();
    17. } else if (Pack_OK) {
    18. RxOKAck();
    19. }
    20. if (ResetTime > 20000) { // 20s复位一次
    21. CMT2300Iint();
    22. GO_RX();
    23. }
    24. }

    主函数是初始化mcu和射频模块,并设置为接收模式,然后判断是否有按键,有按键按下进入测试模式,如果没有进入测试模式就开始循环检测按键。在按键检测中同时在检查是否有数据收到,

    1. void KeyScan(void)
    2. {
    3. byte recvData;
    4. Key_OK = 0; // 按键按下标志
    5. Pack_OK = 0;
    6. Sync_OK = 0;
    7. if (ReadKey() && Key_Lost) {
    8. for (SysTime = 0; SysTime < 5;) {
    9. Delay(250);
    10. if (!ReadKey()) break;
    11. }
    12. if (SysTime >= 5) {
    13. Key_Lost = 0;
    14. Key_OK = 1;
    15. return;
    16. }
    17. }
    18. if (Test_GPIO1()){ //检测包成功中断,接收到数据
    19. GO_STBY();
    20. SPI_Write(CUS_FIFO_CTL, 0x00); //读取FIFO
    21. recvData = Read_FIFO(); //接收到的数据,可以识别出0x56, 0x23
    22. Clr_INT();
    23. switch (recvData) {
    24. case PackNum_N:
    25. Pack_OK = 1;
    26. break;
    27. case SyncNum_N:
    28. Sync_OK = 1;
    29. break;
    30. default:
    31. break;
    32. }
    33. GO_RX();
    34. }
    35. if (!ReadKey()) Key_Lost = 1;
    36. }

    有按键按下会Key_OK = 1;,收到数据分两种,一种是收到发送来的数据PackNum_N,代表另一个模块发来的包,会设置Pack_OK = 1;;还有一种是收到应答包SyncNum_N,会设置Sync_OK = 1;

    如果有按键按下会调用KeyProcess();,在这里发送pack数据。

    Send_Pack(TX_Buf, 1, 4); // 发送40x56

    然后切换回接收模式,循环接收应答包。

    在主循环中接收到pack包后,使用RxOKAck();

    1. void RxOKAck(void)
    2. {
    3. PWM2A_H();
    4. TX_Buf[0] = SyncNum_N;
    5. Send_Pack(TX_Buf, 1, 6); //回传0x23,发送6
    6. for (SysTime = 0; SysTime < 1000;)
    7. ;
    8. PWM2A_L();
    9. GO_RX();
    10. }

    就是发送6次应答字节。

    程序效果就是发射端,按键K1发射,接收端收到,LED点亮。

  • 相关阅读:
    RxJava操作符
    docker swarm 布署minio集群
    如何修改docker容器中的MySQL数据库的密码?
    存储过程基本了解
    UDF提权(mysql)
    Flask 学习-9. 开启调试模式(debug模式)的2种方法
    论文阅读——Towards Adversarially Robust Object Detection
    Dubbo入门(三)Consumer的编写
    策略梯度方法介绍——确定性策略梯度定理
    对象 的属性名 在何时使用obj[‘属性名‘]
  • 原文地址:https://blog.csdn.net/andylauren/article/details/126420958