当前位置: 首页 > news >正文

网站编程脚本语言文章网站后台

网站编程脚本语言,文章网站后台,下城区住房和城市建设局网站,中国seo网站一 背景说明 使用小华#xff08;华大#xff09;的MCU HC32F07X实现 CAN 通讯配置和使用 二 原理分析 【1】CAN原理说明#xff08;参考文章《CAN通信详解》#xff09;#xff1a; CAN是控制器局域网络(Controller Area Network, CAN)的简称#xff0c;是一种能够实现… 一 背景说明 使用小华华大的MCU HC32F07X实现 CAN 通讯配置和使用 二 原理分析 【1】CAN原理说明参考文章《CAN通信详解》 CAN是控制器局域网络(Controller Area Network, CAN)的简称是一种能够实现分布式实时控制的串行通信网络。 iCAN通信形式CAN 使用称为 CANH / CANL 的通信线路执行传输和接收。电位差较小的电信号称为隐性信号其逻辑值为1。电位差较大的电信号称为显性信号其逻辑值0。如果通信总线上发生显性和隐性冲突则显性优先。总线空闲时保持隐性。 iiCAN数据格式CAN的数据定义了有5种帧类型 iiCAN数据帧数据帧一般由 7 个段构成即 1 帧起始。表示数据帧开始的段。 2 仲裁段。表示该帧优先级的段。 3 控制段。表示数据的字节数及保留位的段。 4 数据段。数据的内容一帧可发送 0~8 个字节的数据。 5 CRC 段。检查帧的传输错误的段。 6 ACK 段。表示确认正常接收的段。 7 帧结束。表示数据帧结束的段 图中 D 表示显性电平 R 表示隐形电平。 更多具体内容不再赘述可以参考上面的文章链接或者自行搜索。 【2】HC32F07X的CAN外设 芯片CAN外设的主要特性 ■ 完全支持 CAN2.0A/CAN2.0B 协议。 ■ 向上兼容 CAN-FD 协议。 ■ 支持最高通信波特率 1Mbit/s ■ 支持 1~1/256 的波特率预分频 灵活配置波特率。 ■ 10 个接收缓冲器 - FIFO 方式 - 错误或者不被接收的数据不会覆盖存储的消息 ■ 1 个高优先主发送缓冲器 PTB ■ 4 个副发送缓冲器 STB - FIFO 方式 - 优先级仲裁方式 ■ 8 组独立的筛选器 - 支持 11 位标准 ID 和 29 位扩展 ID - 可编程 ID CODE 位以及 MASK 位 ■ PTB/STB 均支持支持单次发送模式 ■ 支持静默模式 ■ 支持回环模式 ■ 支持捕捉传输的错误种类以及定位仲裁失败位置 ■ 可编程的错误警告值 ■ 支持 ISO11898-4 规定时间触发 CAN 以及接收时间戳 系统框图如下 更多详细的内容可以参考HC32F07X芯片的DATASHEET。 三 CAN通讯硬件设计 以下推荐了两个CAN收发的硬件电路可以将外部的 CANH/CANL 差分信号转换为 CAN_TX/CAN_RX 信号用以内部MCU处理。一个是官方提供的一个是开发板提供的都可以正常使用。 注意CAN通信需要5V用以给收发器供电。 【1】推荐电路1 参考官方的硬件设计指南《AN_HC32L072_HC32L073_HC32F072系列硬件开发指南_Rev1.1》里面对于CAN通信收发的硬件电路有如下推荐电路其中使用了NXP的 TJA1042 作为收发器 【2】推荐电路2 使用的周立功开发板中也引出了CAN功能其中使用了NXP的TJA1051T作为收发器 四 CAN通讯软件配置 选用引脚 PD00(CAN_RX)、PD01(CAN_TX)、PC12(CAN_STB)实现CAN通信功能使用时钟频率为48MHz官方例程使用的是外部8M晶振CAN通讯波特率为1M标准帧ID号为1。 【1】系统时钟配置 static void App_SysClkInit(void) {stc_sysctrl_clk_cfg_t stcCfg;stc_sysctrl_pll_cfg_t stcPLLCfg;Sysctrl_SetPeripheralGate(SysctrlPeripheralFlash, TRUE); /// 使能FLASH模块的外设时钟Flash_WaitCycle(FlashWaitCycle1);Sysctrl_SetRCHTrim(SysctrlRchFreq4MHz); /// PLL使用RCH作为时钟源因此需要先设置RCHstcPLLCfg.enInFreq SysctrlPllInFreq4_6MHz; /// RCH 4MHzstcPLLCfg.enOutFreq SysctrlPllOutFreq36_48MHz; /// PLL 输出48MHzstcPLLCfg.enPllClkSrc SysctrlPllRch; /// 输入时钟源选择RCHstcPLLCfg.enPllMul SysctrlPllMul12; /// 4MHz x 12 48MHzSysctrl_SetPLLFreq(stcPLLCfg);/// 选择PLL作为HCLK时钟源;stcCfg.enClkSrc SysctrlClkPLL;/// HCLK SYSCLK/2stcCfg.enHClkDiv SysctrlHclkDiv1;/// PCLK 为HCLK/8stcCfg.enPClkDiv SysctrlPclkDiv1;/// 系统时钟初始化Sysctrl_ClkInit(stcCfg); } 【2】CAN初始化GPIO //CAN通信引脚定义 #define CAN_RX_PORT (GpioPortD) #define CAN_RX_PIN (GpioPin0) #define CAN_TX_PORT (GpioPortD) #define CAN_TX_PIN (GpioPin1) #define CAN_STB_PORT (GpioPortC) #define CAN_STB_PIN (GpioPin12)#define APB1_CLK 48000000 //CAN 的输入时钟 #define CAN_BAUD 1000000 //CAN 的波特率/************************************************************************** * 函数名称 COM_Init * 功能描述 CAN通信初始化GPIO **************************************************************************/ void COM_Init(void) {stc_gpio_cfg_t stcGpioCfg;Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE);stcGpioCfg.enDir GpioDirIn; /// 端口方向配置-输入stcGpioCfg.enDrv GpioDrvL; /// 端口驱动能力配置-高驱动能力stcGpioCfg.enPu GpioPuDisable; /// 端口上下拉配置-无stcGpioCfg.enPd GpioPdDisable;stcGpioCfg.enOD GpioOdDisable; /// 端口开漏输出配置-开漏输出关闭stcGpioCfg.enCtrlMode GpioAHB; /// 端口输入/输出值寄存器总线控制模式配置-AHBGpio_Init(CAN_RX_PORT, CAN_RX_PIN, stcGpioCfg);stcGpioCfg.enDir GpioDirOut;Gpio_Init(CAN_TX_PORT, CAN_TX_PIN, stcGpioCfg);Gpio_Init(CAN_STB_PORT, CAN_STB_PIN, stcGpioCfg);///CAN RX\TX复用功能配置Gpio_SetAfMode(CAN_RX_PORT, CAN_RX_PIN, GpioAf1);Gpio_SetAfMode(CAN_TX_PORT, CAN_TX_PIN, GpioAf1);///STB 低-PHY有效Gpio_ClrIO(CAN_STB_PORT, CAN_STB_PIN); } 【3】CAN波特率自适应配置接口 /************************************************************************** * 函数名称 COM_BaudCfg * 功能描述 CAN通信波特率自动配置 * 其他说明 48MHz主频1M波特率计算得到SJW2, PRESC1-1, SEG_215, SEG_130若输入500K波特率PRESC为2-1; 输入250K波特率PRESC为4-1 **************************************************************************/ void COM_BaudCfg(stc_can_init_config_t *p_stcCanInitCfg, uint32_t src_clk, uint32_t baud) {uint32_t i,value baud,record 1;uint32_t remain 0,sum_prescaler 0;while(( baud 0 )||( src_clk 0 ));sum_prescaler src_clk / baud;for ( i 73; i 3; i-- ) {remain sum_prescaler - ((sum_prescaler / i)*i);if( remain 0 ) {record i;break;} else {if (remain value) {value remain;record i;}}}/* 设置重新同步跳跃宽度为2个时间单位 */p_stcCanInitCfg-stcCanBt.SJW 2;p_stcCanInitCfg-stcCanBt.PRESC (sum_prescaler/record) - 1;p_stcCanInitCfg-stcCanBt.SEG_2 (record - 3) / 3;p_stcCanInitCfg-stcCanBt.SEG_1 (record - 3) - p_stcCanInitCfg-stcCanBt.SEG_2; } 【注】CAN波特率的计算和配置也可以使用CAN波特率计算器工具来计算得到下载地址CAN波特率计算器下载 【4】CAN初始化配置其中波特率配置为1M滤波器配置标准帧ID为1 /************************************************************************** * 函数名称 COM_Cfg * 功能描述 CAN通信初始化配置 **************************************************************************/ void COM_Cfg(void) {stc_can_init_config_t stcCanInitCfg;stc_can_filter_t stcFilter;Sysctrl_SetPeripheralGate(SysctrlPeripheralCan, TRUE);///CAN 波特率配置COM_BaudCfg(stcCanInitCfg, APB1_CLK, CAN_BAUD); //48MHz主频1M波特率stcCanInitCfg.stcWarningLimit.CanErrorWarningLimitVal 16-1;stcCanInitCfg.stcWarningLimit.CanWarningLimitVal 10;stcCanInitCfg.enCanRxBufAll CanRxNormal;stcCanInitCfg.enCanRxBufMode CanRxBufNotStored;stcCanInitCfg.enCanSTBMode CanSTBFifoMode;CAN_Init(stcCanInitCfg);///CAN 滤波器配置stcFilter.enAcfFormat CanAllFrames;stcFilter.enFilterSel CanFilterSel1;stcFilter.u32CODE 0x00000001;stcFilter.u32MASK 0x1FFFFFFF;CAN_FilterConfig(stcFilter, TRUE);CAN_IrqCmd(CanRxIrqEn, TRUE);EnableNvic(CAN_IRQn, IrqLevel0, TRUE); } 【5】CAN中断服务子程序用于CAN接收 stc_can_rxframe_t stcRxFrame; stc_can_txframe_t stcTxFrame; uint8_t u8RxFlag FALSE;/************************************************************************** * 函数名称 Can_IRQHandler * 功能描述 CAN中断服务函数 **************************************************************************/ void Can_IRQHandler(void) {if(TRUE CAN_IrqFlgGet(CanRxIrqFlg)){CAN_IrqFlgClr(CanRxIrqFlg);CAN_IrqCmd(CanRxIrqEn, FALSE);CAN_Receive(stcRxFrame);u8RxFlag TRUE;} } 【6】CAN发送接口用于CAN发送 /************************************************************************** * 函数名称 COM_Tx * 功能描述 CAN通信发送测试 **************************************************************************/ void COM_Tx(void) {//中断接收循环发送uint8_t u8Idx 0;if(TRUE u8RxFlag){u8RxFlag FALSE;if(1 stcRxFrame.Cst.Control_f.RTR){return;}//Can TxstcTxFrame.StdID stcRxFrame.StdID;stcTxFrame.Control_f.DLC stcRxFrame.Cst.Control_f.DLC;stcTxFrame.Control_f.IDE stcRxFrame.Cst.Control_f.IDE;stcTxFrame.Control_f.RTR stcRxFrame.Cst.Control_f.RTR;for(u8Idx0; u8IdxstcRxFrame.Cst.Control_f.DLC; u8Idx){stcTxFrame.Data[u8Idx] stcRxFrame.Data[u8Idx];}CAN_SetFrame(stcTxFrame);CAN_TransmitCmd(CanPTBTxCmd);CAN_IrqCmd(CanRxIrqEn, TRUE);} } 【7】主函数调用 int32_t main(void) {//系统时钟App_SysClkInit();//通信模块COM_Init();COM_Cfg();while(1){//通信COM_Tx();delay1ms(10);} } 五 CAN通讯测试1中断接收Echo发送单帧 进行CAN测试的方法很多如果没有USB-CAN通信转换工具/CAN协议分析工具可以增加CAN外部回环或者内部回环的配置配合Log串口输出或者仿真器Debug进行测试。我这边使用了USB-CAN通信转换工具CAN-II/CAN协议分析工具CANTest直接进行收发测试 【1】选择 CANTest 中的对应设备 USBCAN2 【2】匹配软件中的波特率为1M确定并启动CAN 【3】修改帧ID为1点击发送可以看到上位机发送数据到测试板经由测试板返回相同长度及内容的数据 以上配置及测试成功。 六 CAN通讯测试2中断接收发送多帧 【1】发送多帧背景说明 实际应用中往往需要收到一组请求之后发送多组数据。尝试直接在 COM_Tx 函数中紧跟着第一帧数据发送之后再发一帧有了如下操作 实测上述连续发送的方法是错误的因为时间间隔太短前一组通过主缓冲器PTB发送的数据还没有完成就又收到新的发送命令导致后发送的命令失败。 【2】同一个缓冲器连续发送多帧中间加延时的方法 使用同一个主缓冲器PTB发送中间增加1ms延时等待上一帧发送结束在我的系统上实测这个延迟的时间要大于500us其他环境不绝对: /************************************************************************** * 函数名称 COM_Tx * 功能描述 CAN通信发送测试 * 其他说明 **************************************************************************/ void COM_Tx(void) {uint8_t u8Idx 0;if(TRUE u8RxFlag){u8RxFlag FALSE;if(1 stcRxFrame.Cst.Control_f.RTR){return;}//主缓冲器Can Tx第一帧stcTxFrame.StdID 0;stcTxFrame.Control_f.DLC 8;stcTxFrame.Control_f.IDE 0;stcTxFrame.Control_f.RTR 0;stcTxFrame.TBUF32_2[0] 0;stcTxFrame.TBUF32_2[1] 1;CAN_SetFrame(stcTxFrame);CAN_TransmitCmd(CanPTBTxCmd); //PTB发送命令delay1ms(1); //若使用单一缓冲器连续发送失败需要中间加延时等待上一帧发送结束(实测大于500us)stcTxFrame.StdID 1;stcTxFrame.Control_f.DLC 8;stcTxFrame.Control_f.IDE 0;stcTxFrame.Control_f.RTR 0;stcTxFrame.TBUF32_2[0] 2;stcTxFrame.TBUF32_2[1] 3;CAN_SetFrame(stcTxFrame);CAN_TransmitCmd(CanPTBTxCmd); //PTB发送命令CAN_IrqCmd(CanRxIrqEn, TRUE);} } 测试结果如下   【3】使用不同缓冲器发送多帧的方法 除了上述同一个缓冲器加延时以实现连续发送多帧数据之外还可以依赖MCU CAN外设提供的另外几组缓冲器实现连续发送多帧数据的目的更可靠。 由芯片说明书可以看到主缓冲器PTB只能缓冲一帧数据。而另外的副缓冲器STB可以缓冲4帧数据。实现代码如下收到信号之后一次发送5帧数据其中第一帧挂载主缓冲器PTB上其他四帧挂载副缓冲器STB上 /************************************************************************** * 函数名称 COM_Tx * 功能描述 CAN通信发送测试 * 其他说明 **************************************************************************/ void COM_Tx(void) {uint8_t u8Idx 0;if(TRUE u8RxFlag){u8RxFlag FALSE;if(1 stcRxFrame.Cst.Control_f.RTR){return;}//主缓冲器Can Tx第一帧stcTxFrame.StdID 0;stcTxFrame.Control_f.DLC 8;stcTxFrame.Control_f.IDE 0;stcTxFrame.Control_f.RTR 0;stcTxFrame.TBUF32_2[0] 0;stcTxFrame.TBUF32_2[1] 1;CAN_SetFrame(stcTxFrame);CAN_TransmitCmd(CanPTBTxCmd); //PTB发送命令// delay1ms(1); //若使用单一缓冲器连续发送失败需要中间加延时等待上一帧发送结束(实测大于500us)//副缓冲器Can Tx第二帧stcTxFrame.StdID 1;stcTxFrame.Control_f.DLC 8;stcTxFrame.Control_f.IDE 0;stcTxFrame.Control_f.RTR 0;stcTxFrame.enBufferSel CanSTBSel;stcTxFrame.TBUF32_2[0] 2;stcTxFrame.TBUF32_2[1] 3;CAN_SetFrame(stcTxFrame);//副缓冲器Can Tx第三帧stcTxFrame.StdID 2;stcTxFrame.Control_f.DLC 8;stcTxFrame.Control_f.IDE 0;stcTxFrame.Control_f.RTR 0;stcTxFrame.enBufferSel CanSTBSel;stcTxFrame.TBUF32_2[0] 4;stcTxFrame.TBUF32_2[1] 5;CAN_SetFrame(stcTxFrame);//副缓冲器Can Tx第四帧stcTxFrame.StdID 3;stcTxFrame.Control_f.DLC 8;stcTxFrame.Control_f.IDE 0;stcTxFrame.Control_f.RTR 0;stcTxFrame.enBufferSel CanSTBSel;stcTxFrame.TBUF32_2[0] 6;stcTxFrame.TBUF32_2[1] 7;CAN_SetFrame(stcTxFrame);//副缓冲器Can Tx第五帧stcTxFrame.StdID 4;stcTxFrame.Control_f.DLC 8;stcTxFrame.Control_f.IDE 0;stcTxFrame.Control_f.RTR 0;stcTxFrame.enBufferSel CanSTBSel;stcTxFrame.TBUF32_2[0] 8;stcTxFrame.TBUF32_2[1] 9;CAN_SetFrame(stcTxFrame);CAN_TransmitCmd(CanSTBTxAllCmd); //STB所有帧发送命令CAN_IrqCmd(CanRxIrqEn, TRUE);} } 测试结果如下 综上CAN通信收发测试完成。
http://www.dnsts.com.cn/news/222470.html

相关文章:

  • 做网站 包含详情页设计吗wordpress 去优酷广告插件
  • 做相册的网站 ppt网站截图怎么做
  • 企业网站制作多少钱网站建设竞品分析
  • 长春电商网站建设费用广安建设网站
  • h5开发网站优点衡水做外贸网站建设
  • 如何制作个人网站教程怎么用网站做调查表
  • 天空网站开发者经典企业网站欣赏
  • 中国建设银行官网首页网站聊天网站模板
  • 郑州建站公司网站网站编写费用
  • 创意网站 模板wordpress首页分类
  • 南昌市新农村建设网站wordpress 405
  • 佛山网站seo公司网络服务许可证
  • Spring做网站和什么镇江seo网络推广定制
  • 网站上的洗衣液瓶子做花瓶怎么材质甲蛙网站建设
  • h5制作哪个网站好上海松江建设银行网站
  • 利用虚拟主机建设企业网站顺企网官网下载
  • 网站建站网站80s隐秘而伟大中国建设银行网上银行网站
  • 定制建站 app建设网站建设痛点
  • 专业的昆明网站建设自适应网站导航怎么做
  • php企业中英文网站源码太原互联网公司有哪些
  • asp.net网站后台源码网站建设的主要情况说明书
  • 做网站年赚千万网上手机商城网站建设
  • 免费建学校网站怎么做网站上的模拟动画
  • 周末游做的好的网站广西优化网站
  • 青海省教育厅门户网站学籍查询高品质网站欣赏
  • 做网站用c 还是js合肥大型网站开发公司
  • 城乡建设部网站首页甲级北京那个网站建设公司比较好
  • 如何做好网站seo松原做网站的公司
  • 小白网站建设通付盾 建设网站
  • 做易购网站上海工作单位名称大全