SJA1000中断处理与CANBus通信

需积分: 26 13 下载量 29 浏览量 更新于2024-09-11 1 收藏 80KB DOC 举报
"这篇代码是关于SJA1000 CAN总线控制器的中断处理和初始化函数。SJA1000是一种广泛使用的CAN(Controller Area Network)接口芯片,用于在嵌入式系统中实现串行通信。代码主要涉及中断服务函数、MCU初始化以及主程序的流程。" SJA1000源代码中展示了如何处理中断事件,特别是接收和发送中断。`SJA_INTR`函数是中断服务例程,它被中断0(INTR0)触发,即当SJA1000芯片产生中断时调用。在中断服务函数中,首先关闭总中断和外部中断,然后读取中断寄存器IR(Interrupt Register)的值来识别中断类型。如果IR的值为0xe2,表示发送中断发生,此时会熄灭LED1,表明有信息已发送。如果IR的值为0xe1,表示接收中断,LED2会被熄灭,并调用`receive_now()`函数处理接收到的数据。对于其他未处理的中断,代码执行`MCU_init()`函数,这可能包含复位SJA1000的操作。 `MCU_init`函数用于初始化MCU的相关配置,如设置SJA1000的片选信号(SJA_CS)和其他中断设置。这个函数中,SJA_CS被拉低以选中SJA1000,外部中断0(EX0)开启,IT0(外部中断0边沿触发)关闭,且总中断打开。 主程序`main`首先调用`MCU_init`和`SJA1000_init`初始化MCU和SJA1000,然后在发送缓冲区初始化成功后进入发送信息的死循环,等待中断发生。一旦中断发生,`SJA_INTR`将被调用来处理相应的事件。 此外,代码中还定义了一些与SJA1000相关的寄存器值,如BTR0和BTR1用于设置CAN总线的比特率,ACR和AMR用于配置验收滤波,OCR和CDR则用于设置输出时钟和时钟分频。这些值通常需要根据实际应用的需求和系统的物理特性进行调整。 这段代码提供了SJA1000在8051微控制器系统中的基本操作框架,包括中断处理、初始化和通信状态的指示。通过理解这些函数和寄存器设置,开发者可以进一步扩展和定制他们的CAN总线通信系统。