环境:

IAR + ASF3.5(Atmel的软件框架)

前言:

使用ATSAMV70Q20(应该其他V系列或E系列都有这坑)之前,要弄清楚这个芯片版本是A版本还B版本(至少丝印上看不出来),可以通过chipid_read()来确认芯片是不是B版本,两个版本之间的时钟树配置不同,会影响到CAN通讯的速率配置,无法得到准确的速率就会无法正常通讯

初始化:

1、引脚复用配置(使用pio_set_peripheral配置对应功能),初始化自定义的接收FIFO等

2、控制参数初始化

3、CAN模块配置

4、设置默认的过滤器

5、启动

相关的配置结构体,CanCfg为固定的配置项,包含了基地址,中断等信息;CanCtrl为运行控制相关参数,在后续中进行初始化


typedef struct
{Mcan *                          CANBase;                     ///< CAN基地址uint32_t                        IRQ_Type;                    ///< 中断类型uint32_t                        IRQ_Priority;                ///< 中断优先级uint32_t                        DefaultExtendFilterID;       ///< 接收指定扩展帧数据的IDuint32_t                        DefaultExtendFilterMask;     ///< ID掩码enum mcan_interrupt_source      IntSource;                   ///< 启用的中断来源
} CanConfig_t; /* Can固定配置 */
static const CanConfig_t CanCfg =
{.CANBase                 = MCAN0,               .IRQ_Type                = MCAN0_INT0_IRQn,         .IRQ_Priority            = 5,               .DefaultExtendFilterID   = 0xFFFF,              .DefaultExtendFilterMask = 0xFFFF,              .IntSource = (enum mcan_interrupt_source)(// MCAN_RX_BUFFER_NEW_MESSAGE   |// MCAN_RX_FIFO_0_NEW_MESSAGE   |  /* 标准帧都是收到FIFO0中 */MCAN_RX_FIFO_1_NEW_MESSAGE   |  /* 扩展帧都是收到FIFO1中 */// MCAN_TX_EVENT_FIFO_FULL      |// MCAN_TX_FIFO_EMPTY           |// MCAN_ERROR_LOGGING_OVERFLOW  |// MCAN_ERROR_PASSIVE           |// MCAN_WARNING_STATUS          |// MCAN_CRC_ERROR               |// MCAN_BIT_ERROR               |// MCAN_STUFF_ERROR             |// MCAN_FORMAT_ERROR            |// MCAN_ACKNOWLEDGE_ERROR       |MCAN_BUS_OFF                    /* 在通讯错误过多时候CAN会关闭通讯并产生中断 */)
};typedef struct
{struct mcan_module              Instance;                       ///< MCAN ASF 实例struct mcan_tx_element          Tx_Element;                     ///< 发送设置元素struct mcan_rx_element_fifo_1   Rx_Element_Fifo1;               ///< 用来接收扩展帧的FIFOuint32_t                        TransmitIndex;                  ///< 发送使用的FIFO索引编号volatile uint32_t               Rx_Fifo1_ReadIndex;             ///< ASF FIFO1 索引
} CanControl_t; /* Can控制块 */
static CanControl_t CanCtrl;

相关配置


/*** @brief CAN控制部分的参数初始化*/
static void ctrl_paramInit(CanControl_t * ctrl)
{mcan_get_tx_buffer_element_defaults(&ctrl->Tx_Element); /* 从ASF取默认配置 */ctrl->Tx_Element.T1.bit.DLC     = 8; /* 设置数据长 */ctrl->Rx_Fifo1_ReadIndex        = 0; /* 读取索引初始化 */ctrl->TransmitIndex             = 0; /* 发送索引初始化 */// ctrl->Tx_Element.T0.reg |= MCAN_TX_ELEMENT_T0_EXTENDED_ID(0xAAAA) | MCAN_TX_ELEMENT_T0_XTD;
}/*** @brief 接收过滤ID设置* */
static void filter_setDefault(CanControl_t *ctrl)
{struct mcan_extended_message_filter_element et_filter;mcan_get_extended_message_filter_element_default(&et_filter);/* EFID1指定接收的具体ID */et_filter.F0.bit.EFID1 = CanCfg.DefaultExtendFilterID;/* EFID2为ID掩码 */et_filter.F1.bit.EFID2 = CanCfg.DefaultExtendFilterMask;/* 设置过滤器,参数3 Index最大值为 conf_mcan里的CONF_MCAN0_RX_STANDARD_ID_FILTER_NUM */mcan_set_rx_extended_filter(&ctrl->Instance, &et_filter, 0);
}/*** @brief CAN模块化初始化,BusOff的时候也会用到*/
static void mcan_config(CanControl_t * ctrl, const CanConfig_t *config)
{struct mcan_config mcan_config;// mcan_stop(&ctrl->Instance); /* 在总线错误的时候需要用到 */mcan_get_config_defaults(&mcan_config); mcan_init(&ctrl->Instance,config->CANBase,&mcan_config);irq_register_handler(config->IRQ_Type,config->IRQ_Priority);mcan_enable_interrupt(&ctrl->Instance,config->IntSource);mcan_start(&ctrl->Instance);
}

初始化的顺序


void M_CAN_Init(void)
{ctrl_paramInit(&CanCtrl);filter_setDefault(&CanCtrl);mcan_config(&CanCtrl, &CanCfg);
}

关于发送:


uint32_t M_CAN_Transmit_Message(CANExtendMsg_St *pdata)
{uint32_t i, err;i = mcan_tx_get_fifo_queue_status(&CanCtrl.Instance);if(i & MCAN_TXFQS_TFQF){return 1;}CanCtrl.Tx_Element.T0.reg = MCAN_TX_ELEMENT_T0_EXTENDED_ID(pdata->ExtendID) | MCAN_TX_ELEMENT_T0_XTD;memcpy(CanCtrl.Tx_Element.data, pdata->Data, 8);CanCtrl.TransmitIndex = (i & MCAN_TXFQS_TFQPI_Msk) >> MCAN_TXFQS_TFQPI_Pos;mcan_set_tx_buffer_element(&CanCtrl.Instance,&CanCtrl.Tx_Element,CanCtrl.TransmitIndex);err = mcan_tx_transfer_request(&CanCtrl.Instance, 1 << CanCtrl.TransmitIndex);return err;
}

中断接收处理


/*** @brief CAN0的中断处理函数*/
void MCAN0_INT0_Handler(void)
{uint32_t status;uint32_t fifo1_write_index;OSIntEnter(); /* 为了使用uCos的消息队列功能 */status = mcan_read_interrupt_status(&CanCtrl.Instance);if (status & MCAN_RX_FIFO_1_NEW_MESSAGE){/* 清中断 */mcan_clear_interrupt_status(&CanCtrl.Instance, MCAN_RX_FIFO_1_NEW_MESSAGE);status = mcan_rx_get_fifo_status(&CanCtrl.Instance, 1);/* 获取当前硬件已收到的数据索引 PutIndex */fifo1_write_index = ((MCAN_RXF1S_F1PI_Msk & status) >> MCAN_RXF1S_F1PI_Pos);/* 获得未处理的数据索引 GetIndex */CanCtrl.Rx_Fifo1_ReadIndex = ((MCAN_RXF1S_F1GI_Msk & status) >> MCAN_RXF1S_F1GI_Pos);while (CanCtrl.Rx_Fifo1_ReadIndex != fifo1_write_index){/* 获取数据 */mcan_get_rx_fifo_1_element(&CanCtrl.Instance,&CanCtrl.Rx_Element_Fifo1,CanCtrl.Rx_Fifo1_ReadIndex);/* 存入FIFO */write_fifo(CanCtrl.Rx_Element_Fifo1.R0.bit.ID, CanCtrl.Rx_Element_Fifo1.data);/* 表示已处理该数据,GetIndex会被增1 */mcan_rx_fifo_acknowledge(&CanCtrl.Instance, 1, CanCtrl.Rx_Fifo1_ReadIndex);status = mcan_rx_get_fifo_status(&CanCtrl.Instance, 1);/* 获取当前硬件已收到的数据索引 PutIndex */fifo1_write_index = ((MCAN_RXF1S_F1PI_Msk & status) >> MCAN_RXF1S_F1PI_Pos);/* 获得未处理的数据索引 GetIndex */CanCtrl.Rx_Fifo1_ReadIndex = ((MCAN_RXF1S_F1GI_Msk & status) >> MCAN_RXF1S_F1GI_Pos);}}if(status & MCAN_BUS_OFF){mcan_clear_interrupt_status(&CanCtrl.Instance, MCAN_BUS_OFF);mcan_stop(&CanCtrl.Instance);mcan_config(&CanCtrl, &CanCfg);}OSIntExit();
}

Atmel ATSAMV70Q20 的 CAN 扩展帧收发设置相关推荐

  1. LIN总线协议详解7(LIN帧收发的硬件实现)

    帧收发的硬件实现 目录 帧收发的硬件实现 一.组成 二.协议控制器 1.协议控制器介绍 2.实现方法 三.总线收发器 1.实现方案 2.采用IC厂家的集成方案 四.LIN 总线 五.时钟源 六.EMI ...

  2. CAN总线数据帧/标准帧/扩展帧/远程帧/错误帧的组成格式对比

    最近在研究CAN总线的驱动,需要详细了解数据帧/标准帧/扩展帧/远程帧/错误帧这几种帧的详细组成格式,于是收集了一下,统一放在这里进行对比和记录,以便日后需要时查阅. 1.数据帧-标准帧 CAN 标准 ...

  3. 基于FPGA的CAN通信,FPGA驱动SJA1000T芯片代码,实现标准帧与扩展帧的通信驱动

    基于FPGA的CAN通信,FPGA驱动SJA1000T芯片代码,实现标准帧与扩展帧的通信驱动,已上板调通 品牌型号 CAN SJA1000T 与世面上的不同,代码不是SJA1000T芯片代码,而是驱动 ...

  4. CAN通信标准帧和扩展帧(全网最透彻解答)

    CAN接口兼容规范2.0A和2.0B(主动),位速率高达1兆位/秒.它可以接收和发送11位标识符的标准帧,也可以接收和发送29位标识符的扩展帧. 标准帧和扩展帧的区别在于: 一.扩展帧的仲裁域有29位 ...

  5. CAN通信标准帧和扩展帧介绍

    简介 CAN接口兼容规范2.0A和2.0B(主动),位速率高达1兆位/秒.它可以接收和发送11位标识符的标准帧,也可以接收和发送29位标识符的扩展帧. 标准帧和扩展帧的区别在于: 一.扩展帧的仲裁域有 ...

  6. CAN通信标准帧和扩展帧

    CAN通信标准帧和扩展帧 CAN接口兼容规范2.0A和2.0B(主动),位速率高达1兆位/秒.它可以接收和发送11位标识符的标准帧,也可以接收和发送29位标识符的扩展帧.  扩展帧的仲裁域有29位,可 ...

  7. CAN协议扩展帧ID

    例如  ID:0x18102701 扩展帧ID共29位 准换为二进制0001 1000 0001 0000 0010 0111 0000 0001 29位110代表优先级十进制6,PF十进制16(16 ...

  8. 计算机如何把文件设为隐藏,已知文件类型的扩展名如何设置显示与隐藏?

    当你想把文件扩展名隐藏或是显示的时候,有木有突然感觉有那么一瞬间皱着眉头过呢?当你想要设置显示与隐藏扩展名的时候却莫名其妙的发现"隐藏已知文件类型的扩展名"这一项选不见了,心理莫名 ...

  9. CameraX ImageAnalysis 输出帧大小设置

    CameraX ImageAnalysis 输出帧大小设置 CameraX 是对 Jetpack 的补充,可让您更轻松地利用 Camera2 API 的功能 它提供一致且易于使用的 API 界面,适用 ...

最新文章

  1. iphone popViewControllerAnimated后刷新原先的表格
  2. python 正则search 所有_python之路----正则re(search,match,findall……)
  3. 【转】typedef函数指针的用法(C++)
  4. 微服务:实战从传统项目平滑过渡 - 笔记
  5. python中head_python学习笔记[headfirst]
  6. php代码上线,实现版本切换
  7. vert.x 分布式锁_使用Vert.x进行响应式开发
  8. java5新特性静态引用、foreach、自动装箱和泛型枚举以及可变参数的总结
  9. (软件工程复习核心重点)第十章面向对象设计-第二节:启发规则和软件重用
  10. UVA10625 GNU = GNU'sNotUnix【字符统计】
  11. MIS系统权限控制的一个简便方法
  12. Git学习笔记(2)——版本的回退,和暂存区的理解
  13. MODBUS转EtherNet/IP网关连接罗克韦尔(AB)PLC与英威腾变频器配置案例
  14. Photoshop DPI缩放比例问题
  15. 计算机组成原理平均cpi怎么算_计算机组成原理-计算机的性能指标及计算题
  16. 猴子搬香蕉 php,猴子搬香蕉
  17. 冰点还原容易出现的问题总结
  18. 2023最新SSM计算机毕业设计选题大全(附源码+LW)之java鲲龙装饰公司在线管理系统的设计与开发前台模块iub6h
  19. jvm的内存分布,参数配置 和 GC处理机制
  20. Julia-第一章简介和资源汇总

热门文章

  1. 误操作导致系统进不去得重装,C盘资料没备份?!别慌,还有救!-200820
  2. 折弯公差尺寸及工艺要求
  3. 解决华为安全键盘收回, 软键盘位置没收回的问题
  4. 使用Android Studio 开发地图案例之二(展示普通图、卫星图、交通流量图和百度城市热力图)
  5. 光伏板怎么申请ASTM E108阻燃测试?
  6. adb无线连接控制android手机
  7. 阿里技术类面试真题,你能做对几个?(含答案)
  8. Pubmedy的使用教程
  9. 用jsp实现文件的下载(download.jsp)
  10. 记录某大门户网站自动跳转不良网站,团队通宵排查病毒木马全过程