微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > PIC18F2680的CAN总线设计

PIC18F2680的CAN总线设计

时间:11-18 来源:互联网 点击:
硬件:18F2680,CAN收发芯片MCP2551

1.自测模式

//* ****************************************************************
//** 功能描述: CAN自测试收发编程,CAN发送邮箱0以一定的时间间隔发送数据,接收到数据后,将接收数据加1作为下一次的发送数据
//***************************************************************
#include"pic18.h" //PIC18系列的头文件 */
charCAN_Adress_H,CAN_Adress_L;// CAN标识符高低字节 */
charCAN_Adress_EH,CAN_Adress_EL;// CAN扩展标识符高低字节 */
int CAN_FLAG;// =1接收到CAN 数据,=0未接收到数据 */
unsignedintCAN_Delay_count=0;// 间隔一定时间发送CAN数据 */

// ****************************************************************
//** 函 数 名: initial()
//** 功能描述: 系统初始化子程序,放在程序首部
//*************************************************************** */
voidinitial()
{
SWDTEN=0; //关看门狗
INTCON=0x00;// bit7-bit0:关总中断 */
ADCON1=0X07;// 设置数字输入输出口 */
PIE1=0; // PIE1 的中断不使能 */
PIE2=0;// PIE2 的中断不使能 */
PIE3=0;// PIE3 的中断不使能 */
TRISB7=0; // RB7为输出端口
RB7=0;
}
//********************************************
//延时函数
//********************************************
void delay(unsigned int asd)
{
unsigned int i;
for(i=0;i {}
}

//* ****************************************************************
//** 函 数 名: initcan()
//** 功能描述: CAN初始化子程序,采用标准标识符,自测试模式
//*************************************************************** */
voidinitcan()
{
// ************设置对CAN进行配置*************** */
TRISB=(TRISB|0X08)&0XFB;//设置CANRX/RB3输入,CANTX/RB2输出*/
CANCON=0X80;// CANCON,bit7-5:1XX请求配置 */
while((CANSTAT&0X80)==0)// CAN状态寄存器。bit7-5:100配置方式 */
{
;
}// 等待进入CAN配置模式OPMODE=100 */

// ***********波特率设置 ************************** */
BRGCON1=0X01;// Sync_Seg(bit7-6)=1TQ,BRP(bit5-0)=1,
//则TQ=((2*(BRP+1))/Fosc=4/4M=1us */
BRGCON2=0X90;//bit7=1自由编程,bit6=0总线在采样点采样1
//次;Phase_Seg1(bit5-3)=3TQ;Prog_Seg(bit2-0)=1TQ*/
BRGCON3=0X42;// 设置Phase_Seg2(bit2-0)=3TQ */
// 标称位时间=TQ*(Sync_Seg+ Prop_Seg+ Phase_seg1+ Phase_seg2)
//=(1+1+3+3)TQ=8TQ, 位率=1/(8*1U)=0.125MHz */

// ******设置发送邮标识符号和初始发送的数据***** */
TXB0CON=0X03;// bit1-0:发送优先级,设置TXB0为最高优先级3 */
TXB0SIDL=CAN_Adress_L&0xe0;// bit3=0标准标识符,bit7-5:标准标识符2-0位 */
TXB0SIDH=CAN_Adress_H;// 标准标识符的10-3位 */
TXB0DLC=0X08;// 设置数据长度为8个字节 */
TXB0D0=0X00;// 写发送缓冲器数据区数据初值 */
TXB0D1=0X01;// 写发送缓冲器数据区数据初值 */
TXB0D2=0X02;
TXB0D3=0X03;
TXB0D4=0X04;
TXB0D5=0X05;
TXB0D6=0X06;
TXB0D7=0X07;

// *******设置接收邮箱0的标识符和初始化数据********** */
RXB0SIDL=CAN_Adress_L&0xe0;// bit3=0标准标识符,bit7-5:标准标识符2-0位*/
RXB0SIDH=CAN_Adress_H;// 标准标识符的10-3位 */
RXB0CON=0X20;// bit6-5=01只接收有效的标准标识符信息 */
RXB0DLC=0X08;// 设置接收缓冲器0的数据区长度8个字节 */
RXB0D0=0X02;// 初始化接收缓冲器0的数据区数据 */
RXB0D1=0X03;// 初始化接收缓冲器0的数据区数据 */
RXB0D2=0X04;
RXB0D3=0X05;
RXB0D4=0X00;
RXB0D5=0X00;
RXB0D6=0X00;
RXB0D7=0X00;

// *******初始化接收滤波器0和接收屏蔽**************** */
RXF0SIDH=CAN_Adress_H;
RXF0SIDL=CAN_Adress_L;// 本字节高3位为标识符低3位,低5位是配置 */
RXM0SIDH=0Xff;
RXM0SIDL=0Xe0;// 11个1表示接收11位标识符进行滤波,标识符
//不同不接收;若全为0,若正确信息,全部接收*/

// *******设置CAN工作模式**************************** */
CANCON=0X40;// bit6:=1进入自测试模式;=0,正常操作模式 */
while((CANSTAT&0X40)!=0)// 检测CAN配置完成 */
{
;
}

// 初始化CAN的中断,PIR3为CAN的外围中断标志寄存器 */
PIR3=0X00;// 清所有CAN中断标志 */
PIE3=PIE3|0X01;// 使能接收缓冲器0的接收中断 */
IPR3=IPR3|0X01;// 接收缓冲器0的接收中断为最高优先级 */
}

/* **************************************************************
**函 数 名: CAN_deal()
**功 能:CAN接收数据后处理子程序:接收数据加1为下次发送的数据
****************************************************************** */
voidCAN_deal()
{
RB7=1;
delay(1000);
CAN_FLAG=0;// 清接收到标志 */
TXB0CON=TXB0CON&0xf7;// TXB0REQ=0,禁止发送请求 */
TXB0D0=RXB0D0+1;// 用接收数据加1来更新发送数据 */
TXB0D1=RXB0D1+1;
TXB0D2=RXB0D2+1;
TXB0D3=RXB0D3+1;
TXB0D4=RXB0D4+1;
TXB0D5=RXB0D5+1;
TXB0D6=RXB0D6+1;
TXB0D7=RXB0D7+1;
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top