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

PIC18F2680的CAN总线设计

时间:11-18 来源:互联网 点击:

/* ****************************************************************
** 函 数 名: interruptHI_ISR()
** 功能描述: 高优先级中断子程序:RXB0接收邮箱0接收中断子程序
*************************************************************** */
voidinterrupt HI_ISR()
{
if(RXB0IF==1)// RXB0接收邮箱0接收中断 */
{
CAN_FLAG=1;// 置接收到 CAN 数据 */
RXB0IF=0;/// 清接收中断标志 */
RXB0FUL=0;//bit7=0打开接收缓冲器接收新信息 */
}
}

main()
{
initial();// 系统初始化子程序 */
CAN_Adress_H=0x33;// CAN高地址为33,低地址为3 */
CAN_Adress_L=0xe0;// 接收和发送邮箱标识符:00110011111=0x019F*/
initcan();// CAN设置初始化 */
IPEN=1;// 使能中断高低优先级 */
INTCON=INTCON|0xc0;// 开总中断、开外围接口中断 */
while(1)
{
if(CAN_FLAG==1)CAN_deal();// 接收到CAN信息,处理 */
elseif(CAN_Delay_count>0x2fe)// 间隔一定时间发送CAN数据 */
{
RB7=0;
delay(65535);
TXB0CON=TXB0CON|0x08;// bit3(TXREQ)=1,请求发送 */
while(TXB0REQ) //等待发送完毕退出!!
{
; //等待发送结束
}
CAN_Delay_count=0;// 间隔一定时间发送CAN数据计时器清0 */
}
elseCAN_Delay_count++;// 不到CAN间隔发送时间,继续延时 */
}
}

2.正常通信模式

定义:CANsend.c 接收上位机发送的八个数据后,通过CAN发送到另一个节点,CANslave.c接收CAN数据后进行+1操作后把数据通过CAN发送出去,CANsend.c 接收数据再送到上位机!

CANsend.c

*
 CAN总线程序(包括发送任务和接收任务)
程序: CANsend.c
版本号:V1.0
功能: 能够接收上位机发送的串口数据
    同时把接收的上位机程序通过CAN总线发送出去
发送数据到CAN上后间听总线,准备接收另一个CAN节点发送数据,并把数据返回上位机 
MCU: PIC18F2680
公司: RESUN
编译器:Hi-tech PICC 18 v9.50PL3
*/
#include
unsigned char CAN_TX_Adress_H; //CAN发送高地址寄存器
unsigned char CAN_TX_Adress_L; //CAN发送低地址寄存器
unsigned char CAN_RX_Adress_H; //CAN接收高地址寄存器
unsigned char CAN_RX_Adress_L; //CAN接收低地址寄存器
unsigned char Counter; //计数器
unsigned char UartFlage; //串口数据接收标志
unsigned char CanrecFlage; //CAN数据接收标志

unsigned char Uartdata[8]; //接收数据,PC-MCU
unsigned char Senddata[8]; //发送数据,MCU-PC
//-----------函数定义-------------
void uartint(void);
void picint(void);
void canint(void);
void Work1(void);
void Work2(void);
void Delay(unsigned int asd);

//********************************
//单片机初始化
//********************************
void picint() //PIC初始化!
{
INTCON=0; //禁止总中断
ADCON1=0x07; //AD端口设置为通用IO口
PIE1=0; //禁止外设中断
PIE2=0;
PIE3=0;

TRISB7=0; //RB7输出引脚,用于调试程序
RB7=0; //输出0

UartFlage=0;
CanrecFlage=0;
Counter=0; //计数器清0
}
//********************************
//串口初始化程序(与PC通信)
//********************************
void uartint()
{
SPBRG=25; //设置波特率为9600
TXSTA=0x04; //高速波特率4M晶振
RCSTA=0x80; //USART串口使能
TRISC6=1; //设置UART端口,RC6是数据发送,RC7是数据接收
TRISC7=1;

RCIP=0; //串口接收设置为低优先级中断
RCIE=1; //允许接收中断
TXIE=0; //禁止发送中断
CREN=1; //允许串口接收数据
}
//********************************
//延时函数
//********************************
void Delay(unsigned int asd)
{
unsigned int i;
for(i=0;i {}
}
//********************************
//CAN接口初始化
//********************************
void canint() //CAN接口初始化
{
// ************设置对CAN进行配置***************
TRISB=(TRISB|0X08)&0XFB;//设置CANRX/RB3输入,CANTX/RB2输出
CANCON=0X80;// CANCON,bit7-5:1XX请求配置
while((CANSTAT&0X80)==0)// CA
// ****************************************************************
//** 函 数 名: initcan()
//** 功能描述: CAN初始化子程序,采用标准标识符N状态寄存器。bit7-5:100配置方式
{
;
}// 等待进入CAN配置模式OPMODE=100
// ************设置对CAN进行配置***************

// ***********波特率设置 **************************
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 */
// 设置发送邮箱0标识符 :00110011111=0x019F */
CAN_TX_Adress_H=0x33; //CAN高地址标识符,应与接收方标识符相同
CAN_TX_Adress_L=0xe0; //CAN低地址标识符
CAN_TX_Adress_L=CAN_TX_Adress_L&0xe0;

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

网站地图

Top