完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
CAN 是Controller Area Network的缩写(以下称为CAN),是ISO国际标准化的串行通信协议。CAN 的高性能和可靠性被得到广泛的认可,并被应用于工业自动化、船舶、医疗设备、工业设备等方向,为分布式控制系统实现各节点之间实时、可靠的数据通信提供了强有力的技术支持。
MM32L073内置CAN模块,可以广泛应用于需要CAN通信的应用场景,具体以下特点:
AMetal已经完成了对MM32L073的适配,若用户选用AMetal平台,则无需自行适配,直接使用相应的CAN功能接口进行操作即可。 初始化 以CAN初始化函数为例,函数原型为: am_can_handle_t am_mm32l073_can_inst_init(void); 该函数在user_config目录下的am_hwconf_mm32l073_can.c文件中定义为: /** CAN 实例初始化,获得 CAN 标准服务句柄 */ am_can_handle_t am_mm32l073_can_inst_init(void) { return am_mm32l073_can_init(&__g_can_dev, &__g_can_devinfo); } 在am_mm32l073_inst_init.h中声明为: am_can_handle_t am_mm32l073_can_inst_init(void); 因此使用CAN初始化函数时,需要包含头文件am_mm32l073_inst_init.h。初始化CAN,调用该函数时需要定义一个am_can_handle_t类型的变量,用于保存获取的CAN服务句柄,CAN初始化程序为: am_can_handle_t can_handle; can_handle = am_mm32l073_can_inst_init(); 接口函数 AMetal 提供了CAN相关的接口函数,详见表1。
1. CAN 通信启动 CAN 通信完成初始化之后,调用启动 CAN 通信函数开始通信,函数原型为:am_can_err_t am_can_start (am_can_handle_t handle)
2. CAN 通信复位 复位 CAN 通信,函数原型为:am_can_err_t am_can_reset (am_can_handle_t handle)
3. CAN 通信睡眠 CAN 通信睡眠的函数原型为: am_can_err_t am_can_sleep (am_can_handle_t handle)
4. CAN 通信唤醒 CAN 通信唤醒的函数原型为: am_can_err_t am_can_wakeup (am_can_handle_t handle)
5. CAN 中断使能 CAN 中断使能的函数原型为: am_can_err_t am_can_int_enable (am_can_handle_t handle, am_can_int_type_t mask)
AMetal 中定义了 CAN 的中断类型, 详见表2。
6. CAN 中断禁能 CAN 中断禁能的函数原型为:am_can_err_t am_can_int_disable (am_can_handle_t handle, am_can_int_type_t mask)
AMetal 中定义了 CAN 的中断类型, 详见表2。 7. CAN 设置模式 CAN 工作模式设置的函数原型为: am_can_err_t am_can_mode_set (am_can_handle_t handle, am_can_mode_type_t mode)
AMetal 中定义了 CAN 的工作模式,详见表3。
8. CAN 设置波特率 CAN 波特率设置的函数原型为: am_can_err_t am_can_baudrate_set (am_can_handle_t handle, struct am_can_bps_param *p_can_baudrate)
9. CAN 获取波特率 CAN 波特率获取的函数原型为: am_can_err_t am_can_baudrate_get (am_can_handle_t struct handle, am_can_bps_param *p_can_baudrate)
10. CAN 获取错误计数 CAN 获取错误计数的函数原型为: am_can_err_t am_can_err_cnt_get ( am_can_handle_t handle, struct am_can_err_cnt *p_can_err_cnt)
11. CAN 清空错误计数 CAN 清空错误计数的函数原型为: am_can_err_t am_can_err_cnt_clr (am_can_handle_t handle)
12. CAN发送消息 CAN发送消息的函数原型为: am_can_err_t am_can_msg_send(am_can_handle_t handle, am_can_message_t *p_txmsg)
13. CAN接收消息 CAN接收消息的函数原型为:am_can_err_t am_can_msg_recv(am_can_handle_t handle, am_can_message_t *p_rxmsg)
14. CAN停止发送消息 CAN停止发送消息的函数原型为: am_can_err_t am_can_msg_stop_send(am_can_handle_t handle)
15. CAN设置滤波 CAN设置滤波的函数原型为:am_can_err_t am_can_filter_tab_set (am_can_handle_t handle, uint8_t *p_filterbuff, size_t lenth)
16. CAN获取设置滤波 CAN获取设置滤波的函数原型为: am_can_err_t am_can_filter_tab_get (am_can_handle_t handle, uint8_t *p_filterbuff, size_t *p_lenth)
17. CAN状态获取 CAN获取状态的函数原型为:am_can_err_t am_can_status_get (am_can_handle_t handle, am_can_int_type_t *p_int_type, am_can_bus_err_t *p_bus_err)
18. CAN中断连接 CAN中断连接的函数原型为: am_can_err_t am_can_connect (am_can_handle_t handle, am_pfnvoid_t pfn_isr, void *p_arg)
19. CAN删除中断连接 CAN删除中断连接的函数原型为: am_can_err_t am_can_disconnect (am_can_handle_t handle, am_pfnvoid_t pfn_isr, void *p_arg)
20. CAN注册中断回调函数 CAN注册中断回调函数的原型为: am_can_err_t am_can_intcb_connect (am_can_handle_t handle, am_can_int_type_t inttype, am_pfnvoid_t pfn_callback, void *p_arg)
21. CAN解除中断回调函数的注册 CAN解除中断回调函数注册的函数原型为: am_can_err_t am_can_intcb_connect (am_can_handle_t handle, am_can_int_type_t inttype, am_pfnvoid_t pfn_callback, void *p_arg)
应用实例 本例将演示一个CAN通信的示例,需要通过USB转CAN连接到PC端,借助USB转CAN的上位机来演示收发过程。为了便于观察,可以通过串口观察收到的数据,实现代码如下: #include "ametal.h" #include "am_can.h" #include "am_delay.h" #include "am_vdebug.h" #include "amhw_mm32l073_can.h" #include "am_mm32l073_can.h" /* 滤波表 */ static uint8_t table[8] = {0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x01, 0xc0}; /* 错误判断*/ static void __can_err_sta(am_can_bus_err_t err) { if (err & AM_CAN_BUS_ERR_BIT) { /* 位错误 */ am_kprintf(("AM_CAN_BUS_ERR_BITn")); } if (err &AM_CAN_BUS_ERR_ACK) { /* 应答错误 */ am_kprintf(("AM_CAN_BUS_ERR_ACKn")); } if (err &AM_CAN_BUS_ERR_CRC) { /* CRC 错误 */ am_kprintf(("AM_CAN_BUS_ERR_CRCn")); } if (err &AM_CAN_BUS_ERR_FORM) { /* 格式错误 */ am_kprintf(("AM_CAN_BUS_ERR_FORMn")); } if (err &AM_CAN_BUS_ERR_STUFF) { /* 填充错误 */ am_kprintf(("AM_CAN_BUS_ERR_STUFFn")); } } /* 例程入口 */ void demo_mm32l073_can_entry (am_can_handle_t can_handle, am_can_bps_param_t *can_btr_baud) { am_can_err_t ret; uint8_t i = 0; am_can_message_t can_rcv_msg = {0}; am_can_bus_err_t can_bus_err_status; am_can_int_type_t can_int_status; /* 配置波特率 */ ret =am_can_baudrate_set (can_handle, can_btr_baud); //设置 CAN 波特率 if (ret == AM_CAN_NOERROR) { am_kprintf("rnCAN: controller baudrate set ok. rn"); } else { am_kprintf("rnCAN: controller baudrate set error! %d rn", ret); } /* 配置滤波表 */ ret =am_can_filter_tab_set( can_handle,table,sizeof(table)/sizeof(uint8_t)); if (ret == AM_CAN_NOERROR) { am_kprintf("rnCAN: controller filter tab set ok. rn"); } else { am_kprintf("rnCAN: controller filter tab set error! %d rn", ret); } /* 启动 can */ ret =am_can_start (can_handle); if (ret == AM_CAN_NOERROR) { am_kprintf("rnCAN: controller start rn"); } else { am_kprintf("rnCAN: controller start error! %d rn", ret); } AM_FOREVER { ret =am_can_msg_recv (can_handle, &can_rcv_msg); //接收数据 if (can_rcv_msg.msglen || can_rcv_msg.flags || can_rcv_msg.id) { //校验ID am_kprintf("can recv id: 0x%xrn",can_rcv_msg.id); for (i = 0; i < can_rcv_msg.msglen; i++) { am_kprintf("data: 0x%x rn",can_rcv_msg.msgdata); } ret =am_can_msg_send (can_handle, &can_rcv_msg); //数据发送 if (ret == AM_CAN_NOERROR) { am_kprintf(("rnCAN: controller rcv data ok. rn")); } else { am_kprintf("rnCAN: controller no rcv data! rn"); } } ret =am_can_status_get (can_handle, //获取 CAN 通信状态 &can_int_status, &can_bus_err_status); am_mdelay(10); if (can_bus_err_status != AM_CAN_BUS_ERR_NONE) { __can_err_sta(can_bus_err_status); } } } |
|
相关推荐
|
|
只有小组成员才能发言,加入小组>>
2248个成员聚集在这个小组
加入小组灵动微电子MM32全系列MCU产品应用手册,库函数和例程和选型表
11682 浏览 3 评论
【MM32 eMiniBoard试用连载】+基于OLED12864的GUI---U8G2
5924 浏览 1 评论
【MM32 eMiniBoard试用连载】移植RT-Thread至MM32L373PS
10956 浏览 0 评论
【MM32 eMiniBoard测评报告】+ 开箱 + 初探
4572 浏览 1 评论
灵动微课堂(第106讲) | MM32 USB功能学习笔记 —— WinUSB设备
4298 浏览 1 评论
[MM32软件] MM32F002使用内部flash存储数据怎么操作?
970浏览 1评论
797浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-25 11:22 , Processed in 0.691386 second(s), Total 70, Slave 53 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号