CH585 RF_Basic例程讲解含单向和双向发送

news/2025/3/17 15:38:32/文章来源:https://www.cnblogs.com/azou/p/18776980

CH585_RF基础通讯例程见下图路径:

1、RF初始化参数配置

/******************************************************************************** @fn      RFRole_Init** @brief   RF应用层初始化** @param   None.** @return  None.*/
void RFRole_Init(void)
{rfTaskID = TMOS_ProcessEventRegister( RFRole_ProcessEvent );{rfRoleConfig_t conf ={0};conf.TxPower = LL_TX_POWEER_4_DBM;//配置初始发射功率conf.rfProcessCB = RF_ProcessCallBack;//注册RF中断回调conf.processMask = RF_STATE_RX|RF_STATE_RX_CRCERR|RF_STATE_TX_FINISH|RF_STATE_TIMEOUT;//配置RF中断事件RFRole_BasicInit( &conf );//RF初始化
    }{gParm.accessAddress = 0x71762345;//配置默认通信地址gParm.crcInit = 0x555555;//初始化CRC校验和,一般不做修改// 配置PHY类型gParm.properties = LLE_MODE_PHY_2M;//配置2M模式// 配置重传间隔,发送次数大于1时有效,和TxParam.sendCount配合使用gParm.sendInterval = 1999*2;// 配置发送稳定时间gParm.sendTime = 10*2;//单向发送用不到,可配置为0;如果需要对方回复ACK,这个值不建议低于10*2,用于发送时等待PLL稳定RFRole_SetParam( &gParm );}
}

 

 

2、发送方和接收方参数配置

    // TX相关参数,全局变量
    {gTxParam.accessAddress = gParm.accessAddress;//配置初始通信地址gTxParam.crcInit = gParm.crcInit;//配置初始化CRC校验和gTxParam.properties = gParm.properties;//配置通信模式gTxParam.sendCount = 1;//配置重传间隔,发送次数大于1时有效,0和1都代表只发一次,无重传gTxParam.txDMA = (uint32_t)TxBuf;//TxDMA配置
    }// RX相关参数,全局变量
    {gRxParam.accessAddress = gParm.accessAddress;//配置初始通信地址gRxParam.crcInit = gParm.crcInit;//配置初始化CRC校验和gRxParam.properties = gParm.properties;//配置通信模式gRxParam.rxDMA = (uint32_t)RxBuf;//RxDMA配置
    }PFIC_EnableIRQ( BLEB_IRQn );PFIC_EnableIRQ( BLEL_IRQn );//使能BLE中断,中断方式接收PRINT("rf role init.id=%d\n",rfTaskID);

 

 

3、定时器中断配置,演示发送方发送数据,为了不影响RF接收数据的响应时间,配置了中断嵌套,允许其他中断打断

    TMR0_TimerInit( GetSysClock() / RF_DEVICE_PERIDOC );//4k速率发送,125us进一次中断TMR0_ITCfg(ENABLE, TMR0_3_IT_CYC_END); // 开启中断PFIC_SetPriority( TMR0_IRQn, 0x80 );PFIC_EnableIRQ(TMR0_IRQn);

 

 

4、定时器中断函数

__INTERRUPT
__HIGH_CODE
void TMR0_IRQHandler(void) // TMR0 定时中断
{if(TMR0_GetITFlag(TMR0_3_IT_CYC_END)){TMR0_ClearITFlag(TMR0_3_IT_CYC_END); // 清除中断标志// 初始化发送的数据#define TEST_DATA_LEN 4TxBuf[0] = 0x55;//帧头,数据自定义TxBuf[1] = TEST_DATA_LEN;//数据长度,不包含第一字节和第二字节,用于告知底层数据包整体长度//TxBuf长度=2+TEST_DATA_LENTxBuf[2]++;TxBuf[3] = gRssi;//RSSI是通过其他地方赋值过来的,不代表这个字节固定代表RSSITxBuf[4] = 0;TxBuf[5] = 0;rf_tx_start( TxBuf );//启动DMA发送
    }
}

 

 

5、RF发送函数

/*** @brief   rf发送数据子程序** @param   pBuf - 发送的DMA地址** @return  None.*/
__HIGH_CODE
void rf_tx_start( uint8_t *pBuf )
{RFIP_SetTxStart( );//配置寄存器启动发送,需要一定时间,在此期间可以配置下面的频点和数据准备// 配置发送的频点gTxParam.frequency = TEST_FREQUENCY;//配置频点// 发送的DMA地址gTxParam.txDMA = (uint32_t)pBuf;
//    gTxParam.accessAddress = gParm.accessAddress; // 发送同步字
//    gTxParam.sendCount = 1;  // 发送次数RFIP_SetTxParm( &gTxParam );//启动发送
}

 

 

6、配置Rx通信频点,配置Rx接收窗口时间

/*** @brief   rf接收数据子程序** @param   None.** @return  None.*/
__HIGH_CODE
void rf_rx_start( void )
{// 配置发送的频点gRxParam.frequency = TEST_FREQUENCY;// 配置接收的超时时间,0则无超时gRxParam.timeOut = 80*2;//单位0.5us//RF发送完切至Rx等待应答时,超时时间需要经过简单计算:对方在收到前导码数据后,由Rx态转变为Tx耗时约24us,等待Tx发送稳定sendtime=10us,RF数据包回复约10字节(2M速率1字节约4us)共40us,//建议配置超时时间至少为80us,如果代码处理还有耗时,建议再加上一些余量
//    gRxParam.accessAddress = gParm.accessAddress; // 接收同步字RFIP_SetRx( &gRxParam );//启动接收,打开接收窗口
}

 

 

 

7、发送结束后,会间隔一定时间,在中断里收到此次发送的状态回调,

如果发送成功,则进入RF_STATE_TX_FINISH中断,切换至接收态,打开接收窗口,在打开接收窗口后,根据主动配置的超时时间:

①如果超时,进入RF_STATE_TIMEOUT中断,选择丢包还是重传,重传需主动调用rf_tx_start再次发送

②如果在接收窗口期间内正确接收到了数据包,则进入RF_STATE_RX,用户可选择主动下发下一包

/******************************************************************************** @fn      RF_ProcessCallBack** @brief   rf中断处理程序** @param   sta - 中断状态.*          id - 保留** @return  None.*/
__HIGH_CODE
void RF_ProcessCallBack( rfRole_States_t sta,uint8_t id  )
{if( sta&RF_STATE_RX )//要么收到数据进RF_STATE_RX,要么没收到数据进入RF_STATE_TIMEOUT,二者进其一
    {rf_rx_process_data();//接收成功,获取完整数据
    }if( sta&RF_STATE_RX_CRCERR )//如果收到对方回复的数据后,校验结果与CRC不符会进入该中断
    {PRINT("nak@crc\n");}if( sta&RF_STATE_TX_FINISH )//底层发送成功后,会将发送成功状态通过中断函数报上来
    {
#if( WAIT_ACK )rf_rx_start( );//发送结束,等待对方收到数据校验前导码,打开接收窗口
#endifgTxCount ++;//可统计每秒钟发送成功的数据包数量
    }if( sta&RF_STATE_TIMEOUT )//打开接收窗口,超过配置的gRxParam.timeOut后,进入接收超时,
    {//此处可配置重传PRINT("timeout\n");//如果超时,在这里重新发送
    }
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/900411.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

uniapp整合SQLite(Android)

一、勾选SQLite数据库选项 (1)HBuilder工具打开项目 (2)项目/manifest.json =>App模块配置 => 勾选SQLite(数据库)二、封装sqlite.ts 在项目根目录下创建sqlite/sqlite.ts// 数据库名称 const dbName = scan/*** 数据库地址* @type {String} 推荐以下划线为开头 _d…

No.68 Vue---vue3新特性

一、vue3新特性 1.1 六大亮点二、组合API(setup)2.1 ref或者reactive 1、创建项目 vue create vue-demo5 2、进入文件,启动服务。 3、 2.2 methods中定义的方法写在setup() 2.3setup()中使用props和context 在2.x中,组件的方法中可以通过this获取到当前组件的实例,并执…

2025年2月国产数据库大事记-墨天轮

​本文为墨天轮社区整理的2025年2月国产数据库大事件和重要产品发布消息,一起看看2月有哪些大事发生~本文为墨天轮社区整理的2025年2月国产数据库大事件和重要产品发布消息。 目录2025年2月国产数据库大事记 TOP10 2025年2月国产数据库大事记(时间线) 产品/版本发布 兼容认证…

Mybatis-入门

配置:JDBC:原始HDBC的问题:数据库连接池:lombok:

SimpleRev(buu-reverse)

IDA打开题目大致看主函数没什么东西,主要控制开始和退出,我们进入decry加密函数看看,下面给出ai注释后的伪代码方便理解点击查看代码 // 解密验证函数,返回栈保护校验值 unsigned __int64 Decry() {// 局部变量声明(IDA自动生成的变量名)char v1; // 临时存…

soildworks装配体流体仿真

模型分析区域缩放可以将一个零件的分析结果导入到另一仿真中去 右键项目>自定义树>调用边界条件> 右键边界条件,添加之前的边界条件

因为Apifox不支持离线,我果断选择了Apipost!

要说国内最有名的两款API开发工具不是Apipost就是Apifox,因为曾经遭遇到这样的事情,导致我坚定的选择了Apipost。一个以用户立场设计工具、愿意把选择权交给用户的工具,是充分考虑用户和尊重用户的,这才应该是工具进化的终极意义。要说国内最有名的两款API开发工具不是Apip…

DEPRECATION WARNING: Using / for division is deprecated and will be removed in Dart Sass 2.0.0.

为了向后兼容,sass 会提醒不推荐使用/运算符。修改方式也告诉我们了,就是替换成math.div($spacer, 2)。 进一步在sass的中文网站 查到这个函数的 API,对比下自己的版本有没有高于这个1.33.0。如没有先去升级,否则直接修改即可。但改完后报错了,说没有 math 模块。 解决方…

第十五课 推理和代理(第十四课脑机接口没有学)

那么LLM是否也可以进行推理呢?之前我们学过,LLM可以通过提示词或者few-shot,zero-shot-Cot等进行推理。下面介绍一个新方法:自我一致性(Self-Consistency)下面来看一下效果还有一种策略:将一个问题分解成多个小问题逐个解决这种方法的泛化性甚至很好,也就是说我们举出的…

java的基础之标识符

标识符的注意点:关键字:数据类型:

智能增长引擎:纷享销客ShareAI产品白皮书(2025版)正式发布!

作为中国SaaS CRM领域连续五年稳居增速市场第一的国产CRM领先品牌,纷享销客一直在探索AI+CRM领域的数字化变革。 2024年7月,纷享AI正式发布,开启智能CRM新纪元。同年,纷享销客《AI+CRM,赋能企业高质量增长橙皮书》重磅推出,首次站在全行业视角,阐述了AI+CRM的建设策略、…