CAN总线学习笔记四:CAN总线通信

嵌入式技术

1372人已加入

描述

在理解了CAN总线的自通信程序后,再来探讨CAN总线间的相互通信变得容易了许多。对于是自通信还是相互通信,这个肯定是需要对寄存器进行必要的设置 的,分析PIAE的两个程序后不难发现,自通信和互通信需要设置的知识模式寄存器,这个是在SJA1000的初始化时进行设定的

在理解了CAN总线的自通信程序后,再来探讨CAN总线间的相互通信变得容易了许多。对于是自通信还是相互通信,这个肯定是需要对寄存器进行必要的设置 的,分析PIAE的两个程序后不难发现,自通信和互通信需要设置的知识模式寄存器,这个是在SJA1000的初始化时进行设定的。

SJA1000的初始化程序我根据习惯,直接把它独立成一个子程序了。如下,是工作于自通信时的初始化程序。

///////////////////////////////////////////////

//函数:init_sja1000

//说明:独立CAN控制器SJA1000的初始化

//入口:无

//返回:无

///////////////////////////////////////////////

void init_sja1000(void)

{

uchar state;

uchar ACRR[4];

uchar AMRR[4];

// 接收代码寄存器

ACRR[0] = 0xff;

ACRR[1] = 0x22;

ACRR[2] = 0x33;

ACRR[3] = 0x44; 

// 接收屏蔽寄存器,只接收主机发送的信息

AMRR[0] = 0xff;

AMRR[1] = 0Xff;

AMRR[2] = 0xff;

AMRR[3] = 0xff; 

// 使用do--while语句确保进入复位模式

do

{          // 设置MOD.0=1--进入复位模式,以便设置相应的寄存器

MODR  = 0x09;

state = MODR;

}

while( !(state & 0x01) );

// 对SJA1000部分寄存器进行初始化设置

CDR  = 0x88;  // CDR为时钟分频器,CDR.3=1--时钟关闭, //CDR.7=0---basic CAN, CDR.7=1---Peli CAN

BTR0 = 0x31;  // 总线定时寄存器0 ;总线波特率设定

BTR1 = 0x1c;  // 总线定时寄存器1 ;总线波特率设定

IER  = 0x01;  // IER.0=1--接收中断使能;IER.1=0--关闭发送中断使能

OCR  = 0xaa;  // 配置输出控制寄存器

CMR  = 0x04;  // 释放接收缓冲器

// 初始化接收代码寄存器

ACR0 = ACRR[0];

ACR1 = ACRR[1];

ACR2 = ACRR[2];

ACR3 = ACRR[3];

// 初始化接收屏蔽寄存器

AMR0 = AMRR[0];

AMR1 = AMRR[1];

AMR2 = AMRR[2];

AMR3 = AMRR[3];

// 使用do--while语句确保进入自接收模式

do

{         //MOD.2=1--进入自接收模式,MOD.3=0--双滤波器模式

MODR   = 0x04;   

state  = MODR;

}

while( !(state & 0x04) );

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 相关推荐

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分