草庐IT

S32K148-CAN收发

taotaonihao 2023-03-28 原文

最近在搞一个转换板开发,大概意思把CAN信号转换成SPI信号,方案有两种:1)通过硬件电路直接把信号的bit位一位一位移给两个集成芯片;2)通过MCU接收CAN信号,再把信号变量转换成SPI信号发送给其他集成芯片,从而主MCU通过转换板与其他芯片进行信息交互。目前我们采用的第二种方案,第二种方案实施较为简单,但是成本稍高。

因为涉及到CAN的收发问题,刚好最近又在学习S32K148的芯片,顺便记录一下用SDK配置驱动和裸机配置的方法,有问题,欢迎大家指正。

SDK配置步骤:

1)CAN0初始化;

主要包括一些外设时钟初始化

2)配置RXBUFF;

主要是RX_Message的标准帧,扩展帧,远程帧属性结构体

3)配置TXBUFF;

主要是TX_Message的标准帧,扩展帧,远程帧属性结构体

4)配置接收Message的ID滤波掩码;

主要是报文接收ID的全局掩码设置,0标志对所有bit位不关心,1表示需要关注相应bit位

5)注册接收中断回调函数;

6)配置接收函数;

can_buff_config_t CAN0Tx_buffCfg =
    {
          .enableFD = false,
          .enableBRS = false,
          .fdPadding = 0U,
          .idType = CAN_MSG_ID_EXT,
          .isRemote = false
    };
      //国标枪充CAN0接收BUFFER配置
      can_buff_config_t CAN0Rx_buffCfg =
      {
            .enableFD = false,
            .enableBRS = false,
            .fdPadding = 0U,
            .idType = CAN_MSG_ID_EXT,
            .isRemote = false
      };
调试过程中,一定要注意RXBUFF和TXBUFF配置结构体放在全局变量,如果放在函数体内,CAN的发送和接收会出问题
void CAN0_init(void)
  {
        CAN_Init(&can_pal1_instance, &can_pal1_Config0);
          CAN_ConfigRxBuff(&can_pal1_instance, CAN0_RevMailBox, &CAN0Rx_buffCfg, CAN0_RxFilter);
          CAN_ConfigTxBuff(&can_pal1_instance, CAN0_TxMailBox, &CAN0Tx_buffCfg);
          //掩码设置为0 就接收全部Msg_ID的报文
          CAN_SetRxFilter(&can_pal1_instance, CAN_MSG_ID_EXT, CAN0_RevMailBox, 0);
          //配置接收中断
          CAN_InstallEventCallback(&can_pal1_instance, &CAN0_Callback_Func, (void*)0);
          //CAN接收配置
          CAN_Receive(&can_pal1_instance, CAN0_RevMailBox, &CAN0_RecMsg);
  }

中断接收回调函数,在中断函数里接收CAN发来的数据

void CAN0_Callback_Func (uint32_t instance,can_event_t event,uint32_t buffIdx,void *flexcanState)
  {
    (void)flexcanState;
    (void)instance;
    (void)buffIdx;
    CAN_Receive(&can_pal1_instance, CAN0_RevMailBox, &CAN0_RecMsg);
    switch(event)
        {
            case CAN_EVENT_RX_COMPLETE:
                break;
            case CAN_EVENT_TX_COMPLETE:

                break;
            default:
                break;
        }
  }

发送数据

    can_message_t CAN01_TxMsg;
                CAN01_TxMsg.id = 0x181056F4;
                CAN01_TxMsg.length = 8;
                CAN01_TxMsg.data[0] = 0xFF;
                CAN01_TxMsg.data[1] = 0xFF;
                CAN01_TxMsg.data[2] = 0xFF;
                CAN01_TxMsg.data[3] = 0xFF;
                CAN01_TxMsg.data[4] = 0x02;
                CAN01_TxMsg.data[5] = 0xFF;
                CAN01_TxMsg.data[6] = 0xFF;
                CAN01_TxMsg.data[7] = 0xFF;
                CAN_SendBlocking(&can_pal1_instance, CAN0_TxMailBox, &CAN01_TxMsg, TIMEOUT);

 

最后,在main()函数里初始化,在任务周期里就可以进行发送,中断里进行接收。

下一章节,我在记录裸机配置CAN的收发。

谢谢

 

有关S32K148-CAN收发的更多相关文章

  1. ruby-on-rails - 新 Rails 项目 : 'bundle install' can't install rails in gemfile - 2

    我已经像这样安装了一个新的Rails项目:$railsnewsite它执行并到达:bundleinstall但是当它似乎尝试安装依赖项时我得到了这个错误Gem::Ext::BuildError:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcheckingforlibkern/OSAtomic.h...yescreatingMakefilemake"DESTDIR="cleanmake"DESTDIR="

  2. ruby CSV : How can I read a tab-delimited file? - 2

    CSV.open(name,"r").eachdo|row|putsrowend我得到以下错误:CSV::MalformedCSVErrorUnquotedfieldsdonotallow\ror\n文件名是一个.txt制表符分隔文件。我是专门做的。我有一个.csv文件,我转到excel,并将文件保存为.txt制表符分隔的文件。所以它是制表符分隔的。CSV.open不应该能够读取制表符分隔的文件吗? 最佳答案 尝试像这样指定字段分隔符:CSV.open("name","r",{:col_sep=>"\t"}).eachdo|row|

  3. STM32读取串口传感器数据(颗粒物传感器,主动上传) - 2

    文章目录1.开发板选择*用到的资源2.串口通信(个人理解)3.代码分析(注释比较详细)1.主函数2.串口1配置3.串口2配置以及中断函数4.注意问题5.源码链接1.开发板选择我用的是STM32F103RCT6的板子,不过代码大概在F103系列的板子上都可以运行,我试过在野火103的霸道板上也可以,主要看一下串口对应的引脚一不一样就行了,不一样的就更改一下。*用到的资源keil5软件这里用到了两个串口资源,采集数据一个,串口通信一个,板子对应引脚如下:串口1,TX:PA9,RX:PA10串口2,TX:PA2,RX:PA32.串口通信(个人理解)我就从串口采集传感器数据这个过程说一下我自己的理解,

  4. CAN协议的学习与理解 - 2

    最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总

  5. ruby - 混帐 & ruby : How can I unset the GIT_DIR variable from inside a ruby script? - 2

    我编写了一个非常简单的“部署”脚本,作为我的裸git存储库中的post-updateHook运行。变量如下livedomain=~/mydomain.comstagingdomain=~/stage.mydomain.comgitrepolocation=~/git.mydomain.com/thisrepo.git(bare)core=~/git.mydomain.com/thisrepo.gitcore==addedremoteintoeachlive&stagegitslive和stage都初始化了gitrepos(非裸),我已经将我的裸仓库作为远程添加到它们中的每一个(名为co

  6. ruby-on-rails - 在 Ruby 或 Rails 中,hash.merge({ :order => 'asc' }) can return a new hash with a new key. 什么可以返回带有已删除键的新散列? - 2

    在Ruby(或Rails)中,我们可以做到new_params=params.merge({:order=>'asc'})现在new_params是一个带有添加键:order的散列。但是是否有一行可以返回带有已删除key的散列?线路new_params=params.delete(:order)不会工作,因为delete方法返回值,仅此而已。我们必须分3步完成吗?tmp_params=paramstmp_params.delete(:order)returntmp_params有没有更好的方法?因为我想做一个new_params=(params[:order].blank?||para

  7. ruby - 类型错误 : can't convert String into Integer - 2

    我有代码:classScenedefinitialize(number)@number=numberendattr_reader:numberendscenes=[Scene.new("one"),Scene.new("one"),Scene.new("two"),Scene.new("one")]groups=scenes.inject({})do|new_hash,scene|new_hash[scene.number]=[]ifnew_hash[scene.number].nil?new_hash[scene.number]当我启动它时出现错误:freq.rb:11:in`[]'

  8. STM32的HAL和LL库区别和性能对比 - 2

    LL库和HAL库简介LL:Low-Layer,底层库HAL:HardwareAbstractionLayer,硬件抽象层库LL库和hal库对比,很精简,这实际上是一个精简的库。LL库的配置选择如下:在STM32CUBEMX中,点击菜单的“ProjectManager”–>“AdvancedSettings”,在下面的界面中选择“AdvancedSettings”,然后在每个模块后面选择使用的库总结:1、如果使用的MCU是小容量的,那么STM32CubeLL将是最佳选择;2、如果结合可移植性和优化,使用STM32CubeHAL并使用特定的优化实现替换一些调用,可保持最大的可移植性。另外HAL和L

  9. ruby : How can I detect/intelligently guess the delimiter used in a CSV file? - 2

    我需要能够确定我的Ruby项目中的csv文件中使用了哪个分隔符(逗号、空格或分号)。我知道,csv模块中的Python中有一个Sniffer类,可用于猜测给定文件的分隔符。Ruby中有类似的东西吗?非常感谢任何形式的帮助或想法。 最佳答案 看起来py实现只检查几种方言:excel或excel_tab。因此,仅检查","或"\t"的简单实现是:COMMON_DELIMITERS=['","',"\"\t\""].freezedefsniff(path)first_line=File.open(path).firstreturnunle

  10. ruby-on-rails - rails : How can you access session variables using multiple controllers? - 2

    我在使用session变量时遇到问题。我有两个名为“graduate_students_controller”和“current_students_controller”的Controller。这些Controller中的每一个都控制不同的View文件。我在这两个Controller中使用session变量来存储session信息。问题来了。假设我有两个View文件“reports/current_students_list”、“reports/graduate_students_list”,每个文件都由上述Controller单独控制。现在,如果我尝试从同一浏览器中打开这两个网页并尝

随机推荐