一 . 最近接到一个案子,需要用PIC18F26Q84 进行CAN总线编程,进入到MCC 编程界面里面。
先梳理一下配置寄存器的流程,以前调过MCP2515的CAN总线配置。流程大概是
1. 进入允许设置寄存器模式
2. 配置CAN 总线的总线速率
3. 配置扩展帧或者标准帧的发送标识符数据(配置发送)
4. 配置扩展帧或者标准帧的接收标识符数据(配置接收)
5. 配置是标准帧格式还是扩展帧格式
6. 配置验收屏蔽寄存器
7. 进入工作模式 ,退出设置模式
8. 发送数据和根据中断接收数据
发送数据是指将数据写入发送缓冲区内
类比到PIC18 – 先确定系统频率之后,进行相关寄存器配置

额 废话不多说 程序在资源分享里面哦 PIC18F26Q84

二 . 1. 用MCC 生成一段代码,进行解读理解。 MCC 是 MICROSOFT 生成代码的一种工具,比较方便。
配置如下,时钟设置为 48M 的内部晶振。

  1. 可以看到生成的代码逻辑
    – 进入设置模式
    –设置FIFO 偏移量
    –配置速率
    –详细配置FIFO
    –纠错判断
    —设置工作模式
    – 正常工作
    这说明配置 CAN 总线寄存器的软件逻辑大体相似,接下来可以取几个关键点进行分析。
  2. 数据手册里面
    由于 CXTXQCON 这个寄存器是32 位的,而PIC18F26Q84 是个8位的单片机,所以可以根据以下名字进行配置读写寄存器。
    C1CONU=1; 这个寄存器说明如下
    C1CONH=97; 这个寄存器说明如下

    C1CONL=60; 这个寄存器说明如下 ,这个里面的设置 如果CAN 总线调通的时候是需要回过头来进行设置,以避免实际使用的时候错误干扰。
  3. 上面这几个寄存器已经对CAN 总线进行基本的初始化了。接下来是波特率的配置
static void CAN1_BitRateConfiguration(void)
{// SJW 37; C1NBTCFGL = 0x25;// TSEG2 37; C1NBTCFGH = 0x25;// TSEG1 152; C1NBTCFGU = 0x98;// BRP 0; C1NBTCFGT = 0x00;}


5. 上面这几个寄存器已经对CAN 总线进行基本的初始化了。接下来是FIFO 的配置

static void CAN1_TX_FIFO_Configuration(void)
{// TXATIE enabled; TXQEIE disabled; TXQNIE disabled; C1TXQCONL = 0x10;// FRESET enabled; UINC disabled; C1TXQCONH = 0x04;// TXAT 3; TXPRI 1; C1TXQCONU = 0x60;// PLSIZE 8; FSIZE 6; C1TXQCONT = 0x05;// TXEN enabled; RTREN disabled; RXTSEN disabled; TXATIE enabled; RXOVIE disabled; TFERFFIE disabled; TFHRFHIE disabled; TFNRFNIE disabled; C1FIFOCON1L = 0x90;// FRESET enabled; TXREQ disabled; UINC disabled; C1FIFOCON1H = 0x04;// TXAT Unlimited number of retransmission attempts; TXPRI 1; C1FIFOCON1U = 0x60;// PLSIZE 8; FSIZE 6; C1FIFOCON1T = 0x05;
}
static void CAN1_RX_FIFO_Configuration(void)
{// TXEN disabled; RTREN disabled; RXTSEN disabled; TXATIE disabled; RXOVIE enabled; TFERFFIE disabled; TFHRFHIE disabled; TFNRFNIE disabled; C1FIFOCON2L = 0x08;// FRESET enabled; TXREQ disabled; UINC disabled; C1FIFOCON2H = 0x04;// TXAT Unlimited number of retransmission attempts; TXPRI 1; C1FIFOCON2U = 0x60;// PLSIZE 8; FSIZE 6; C1FIFOCON2T = 0x05;}
//清空读取fifo
void CAN1_RX_FIFO_ResetInfo(void)
{uint8_t index;for (index = 0; index < NUM_OF_RX_FIFO; index++){rxFifos[index].fifoHead = 0;}
}

这段代码对应之前的两个TX FIFO 配置

6. 报错配置 – 并且已经打开中断

static void CAN1_ErrorNotificationInterruptEnable(void)
{CAN1_SetInvalidMessageInterruptHandler(DefaultInvalidMessageHandler);CAN1_SetBusWakeUpActivityInterruptHandler(DefaultBusWakeUpActivityHandler);CAN1_SetBusErrorInterruptHandler(DefaultBusErrorHandler);CAN1_SetModeChangeInterruptHandler(DefaultModeChangeHandler);CAN1_SetSystemErrorInterruptHandler(DefaultSystemErrorHandler);CAN1_SetTxAttemptInterruptHandler(DefaultTxAttemptHandler);CAN1_SetRxBufferOverFlowInterruptHandler(DefaultRxBufferOverflowHandler);PIR0bits.CANIF = 0;// MODIF disabled; TBCIF disabled; C1INTL = 0x00;// IVMIF disabled; WAKIF disabled; CERRIF disabled; SERRIF disabled; C1INTH = 0x00;// TEFIE disabled; MODIE enabled; TBCIE disabled; RXIE disabled; TXIE disabled; C1INTU = 0x08;// IVMIE enabled; WAKIE enabled; CERRIE enabled; SERRIE enabled; RXOVIE enabled; TXATIE enabled; C1INTT = 0xFC;PIE0bits.CANIE = 1;
}

typedef enum
{/*DLC_0 to DLC_8 for CAN 2.0 and CAN FD*/DLC_0,DLC_1,DLC_2,DLC_3,DLC_4,DLC_5,DLC_6,DLC_7,DLC_8,//Supported only in CAN FD mode/*DLC_12 to DLC_64 for CAN FD*/ DLC_12,DLC_16,DLC_20,DLC_24,DLC_32,DLC_48,DLC_64,
} CAN_DLC;
typedef enum
{CAN_TX_FIFO_FULL,CAN_TX_FIFO_AVAILABLE,
} CAN_TX_FIFO_STATUS;
typedef enum
{CAN_OP_MODE_REQUEST_SUCCESS,     // Requested Operation mode set successfullyCAN_OP_MODE_REQUEST_FAIL,        // Requested Operation mode set failure. Set configuration mode before setting CAN normal or debug operation mode.CAN_OP_MODE_SYS_ERROR_OCCURED    // System error occurred while setting Operation mode.
}  CAN_OP_MODE_STATUS;typedef enum
{ CAN_TX_MSG_REQUEST_SUCCESS = 0,             // Transmit message object successfully placed into Transmit FIFOCAN_TX_MSG_REQUEST_DLC_EXCEED_ERROR = 1,    // Transmit message object DLC size is more than Transmit FIFO configured DLC sizeCAN_TX_MSG_REQUEST_BRS_ERROR = 2,           // Transmit FIFO is configured has Non BRS mode and CAN TX Message object has BRS enabledCAN_TX_MSG_REQUEST_FIFO_FULL = 3,           // Transmit FIFO is Full
}
typedef enum
{CAN_NORMAL_FD_MODE = 0,    //Supported only in CAN FD modeCAN_DISABLE_MODE = 1,               CAN_INTERNAL_LOOPBACK_MODE = 2,CAN_LISTEN_ONLY_MODE = 3,CAN_CONFIGURATION_MODE = 4,CAN_EXTERNAL_LOOPBACK_MODE = 5,CAN_NORMAL_2_0_MODE = 6,CAN_RESTRICTED_OPERATION_MODE =7,
} CAN_OP_MODES;

二 . 读写 FIFO




用来判断目前片子的工作状态,用以纠错。
010 = 配置状态
110 = CAN 2.0 工作状态

typedef enum
{CAN_NORMAL_FD_MODE = 0,    //Supported only in CAN FD modeCAN_DISABLE_MODE = 1,               CAN_INTERNAL_LOOPBACK_MODE = 2,CAN_LISTEN_ONLY_MODE = 3,CAN_CONFIGURATION_MODE = 4,CAN_EXTERNAL_LOOPBACK_MODE = 5,CAN_NORMAL_2_0_MODE = 6,CAN_RESTRICTED_OPERATION_MODE =7,
} CAN_OP_MODES;

请求操作模式

时钟配置

配置CAN 的时候需要失能 JTAG



可以使用这些寄存器名称来读取数据。

PIC18 CAN总线相关推荐

  1. 《我和PIC单片机:基于PIC18》——第1章 初识PIC 1.1 与众不同的PIC

    第1章 初识PIC 我们可以把单片机简单地理解成单芯片计算机.经过多年的发展,单片机的内涵被不断丰富,越来越多的功能被赋予给了这个单芯片计算机,使得其功能变得愈发强大.可以说,在单片机的江湖中,家族林 ...

  2. can是什么时候处于显性_can总线怎么传输数据格式过程分析

    一.什么是CAN协议 电子计算机网络用电子语言来说话,各电控单元必须使用和解读相同的电子语言,这种语言称"协议",汽车电脑网络常见的传输协议有数种.宝来车装用博世公司产品,数据总线 ...

  3. 13. 微型计算机中,传送cpu发出的读/写指令的总线是,我的微机原理题库

    一.填空题: 1.100= 01100100 B= 64 H 2.125= 01111101 B= 7D H 3.65500=1111111111011100B=FFDC H 4.符号数+25和-32 ...

  4. linux i2c核心,总线与设备驱动,Linux2.6.37 I2C驱动框架分析(一)

    最近工作中又使用到了I2C,所以借S3C2440开发板GT2440为硬件平台温习一遍I2C驱动体系. linux内核中IIC驱动的体系框架 linux内核中IIC部分驱动代码位于:/drivers/i ...

  5. 原 史上最简单的SpringCloud教程 | 第八篇: 消息总线(Spring Cloud Bus)(Finchley版本)

    转载请标明出处: 原文首发于:https://www.fangzhipeng.com/springcloud/2018/08/30/sc-f8-bus/ 本文出自方志朋的博客 转载请标明出处: Spr ...

  6. I2C和SPI总线优缺点对比

    IIC vs SPI现今,在低端数字通信应用领域,我们随处可见IIC (Inter-Integrated Circuit) 和 SPI (Serial Peripheral Interface)的身影 ...

  7. linux驱动:设备-总线-驱动(以TI+DM8127中GPIO为例)

    一:说明:这次学习设备-总线-驱动是以TI+DM8127的GPIO为例 1.GPIO资源注册到omap_hwmod链表中 2.初始化GPIO 3.将GPIO注册到plarform层 4.将GPIO注册 ...

  8. 计组--习题--总线

    计算机使用总线结构的主要优点是便于实现积木化,缺点是______ A. 地址信息.数据信息和控制信息不能同时出现 B. 地址信息与数据信息不能同时出现 C. 两种信息源的代码在总线中不能同时传送 这里 ...

  9. Spring Cloud(十一)高可用的分布式配置中心 Spring Cloud Bus 消息总线集成(RabbitMQ)

    上一篇文章,留了一个悬念,Config Client 实现配置的实时更新,我们可以使用 /refresh 接口触发,如果所有客户端的配置的更改,都需要手动触发客户端 /refresh ,当服务越来越多 ...

最新文章

  1. c语言程序设教材计 乌云高娃,C语言程序设计教学课件作者第3版乌云高娃演示文稿C语言程序设计教学课件作者第3版乌云高娃演示文稿演示文稿第1章C语言程序设计基础课件.ppt...
  2. linux 网络编程 ping,Linux 网络编程基础(4) -- Ping 的C代码实现
  3. CF802C-Heidi and Library(hard)【费用流】
  4. 【云栖计算之旅】线下沙龙第2期精彩预告:Docker在云平台上的最佳实践
  5. 【JSP】JSP与JavaBean的关系
  6. java项目所需jar包的下载--maven仓库
  7. linux驱动编写(platform总线和网卡驱动)
  8. 使用DIDatepicker
  9. MySQL数据库远程连接开启方法
  10. 十八、x86汇编基础
  11. 求教:.Net Framework 3.5 SP1安装失败
  12. 如何查看linux 版本
  13. java中double类型占几个字节_Java中的单双精度数据类型分别占几个字节?
  14. Pcshare驱动级木马及查杀
  15. IE无法浏览网页的常见原因及解决方法(转)
  16. 阿里云服务器使用-1-可以通过浏览器访问阿里云提供的ip地址
  17. logstash grok mysql_logstash grok
  18. 免费开放可转盲文字库 阿里健康大药房呼吁关注视障群体用药安全
  19. 232串口测试方法介绍
  20. 计算机进去bios方式,两种使用的电脑进入BIOS方法

热门文章

  1. @WebServlet(/)与@WebServlet(/*)
  2. vue 找回密码_资讯项目:找回密码
  3. iIC驱动编写之ap3216c传感器
  4. SQL语句排序、分页、多表查询
  5. Linux基础命令-dd拷贝、转换文件
  6. 鸿蒙税窗是哪个省,“鸿蒙”现世,这些中国风的橱窗让人惊艳!
  7. 六边形 蜂巢样式 svg方式 写法 初见
  8. Flutter仿钉钉打卡
  9. Linux系统下安装ISO文件
  10. java内存溢出和内存泄漏的区别