PIC18F2680的CAN总线设计
// 设置接收邮箱0标识符 :10011001010=0x04CA */
CAN_RX_Adress_H=0x99; //CAN高地址标识符
CAN_RX_Adress_L=0x55; //CAN低地址标识符,应与发送方标识符相同
CAN_RX_Adress_L=CAN_RX_Adress_L&0xe0;
// ******设置发送邮箱0和初始发送的数据***** */
TXB0CON=0X03;// bit1-0:发送优先级,设置TXB0为最高优先级3 */
TXB0SIDL=CAN_TX_Adress_L&0xe0; // bit3=0标准标识符,bit7-5:标准标识符2-0位*/
TXB0SIDH=CAN_TX_Adress_H; // 标准标识符的10-3位*/
TXB0DLC=0X08;// 设置数据长度为8个字节 */
TXB0D0=0X00;// 写发送缓冲器数据区数据初值 */
TXB0D1=0X01;// 写发送缓冲器数据区数据初值 */
TXB0D2=0X02;
TXB0D3=0X03;
TXB0D4=0X04;
TXB0D5=0X05;
TXB0D6=0X06;
TXB0D7=0X07;
RXB0SIDL=CAN_RX_Adress_L&0xe0; // bit3=0标准标识符,bit7-5:标准标识符2-0位*/
RXB0SIDH=CAN_RX_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_RX_Adress_H;
RXF0SIDL=CAN_RX_Adress_L&0xe0;//高3位为标识符低3位,低5位是配置 */
RXM0SIDH=0Xff;
RXM0SIDL=0Xe0; // 11个1表示接收11位标识符进行滤波,标识符
//不同不接收;若全为0,若正确信息,全部接收*/
// *******设置CAN工作模式**************************** */
CANCON=0X00;//=0X40,进入自测试模式;=0x00,正常操作模式
while((CANSTAT&0XE0)!=0)// 检测CAN配置完成 */
{
;
}
// 初始化CAN的中断,PIR3为CAN的外围中断标志寄存器 */
PIR3=0X00;// 清所有CAN中断标志*/
PIE3=PIE3|0X01;// 使能接收缓冲器0的接收中断 */
IPR3=IPR3|0X01;// 接收缓冲器0的接收中断为最高优先级 */
}
//*********************************
//高优先级中断程序
//*********************************
void interruptHI_ISR()
{
if(RXB0IF==1) //接收缓冲器1接收到新数据
{
RB7=1;
CanrecFlage=1;// 置接收到 CAN 数据 */
RXB0IF=0;// 清接收中断标志 */
RXB0FUL=0;// bit7=0,打开接收缓冲器接收新信息 */
}
}
//*********************************
//低优先级中断程序
//*********************************
void interrupt low_priority LOW_ISR()
{
if(RCIF==1) //判断是不是串口中断
{
Uartdata[Counter]=RCREG;
Counter++;
if(Counter>7)
{
Counter=0;
UartFlage=1; //有串行数据接收
}
}
}
//*********************************
//处理函数1
//*********************************
void Work1()
{
TXB0CON=TXB0CON&0xf7; //bit3:TXREQ=0, 关请求发送
UartFlage=0; //清标志
TXB0D0=Uartdata[0]; //CAN发送数据更新(用串口接收来的数据)
TXB0D1=Uartdata[1];
TXB0D2=Uartdata[2];
TXB0D3=Uartdata[3];
TXB0D4=Uartdata[4];
TXB0D5=Uartdata[5];
TXB0D6=Uartdata[6];
TXB0D7=Uartdata[7];
TXB0CON=TXB0CON|0x08; //请求发送,bit3:TXREQ=1
// RB7=1;
while(TXB0REQ) //等待发送完毕
{
;
}
Delay(10000);
}
//*********************************
//处理函数2
//*********************************
void Work2() //接收数据返回PC机
{
unsigned char i;
Senddata[0]=RXB0D0;
Senddata[1]=RXB0D1;
Senddata[2]=RXB0D2;
Senddata[3]=RXB0D3;
Senddata[4]=RXB0D4;
Senddata[5]=RXB0D5;
Senddata[6]=RXB0D6;
Senddata[7]=RXB0D7;
//RCEN=0; //接收禁止
TXEN=1; //使能串口发送
for(i=0;i<8;i++) //串口数据发送
{
TXREG=Senddata[i];
while(1)
{
if(TXIF==1) break;
}
Delay(100);
}
//RCEN=1; //接收使能
TXEN=0; //禁止数据发送
}
//*********************************
//主程序
//*********************************
void main()
{
SWDTEN=0; //软件关闭看门狗
picint();
canint();
uartint();
IPEN=1; //使能高低中断优先级
INTCON=INTCON|0xc0; //开总中断、开外围接口中断
TXB0REQ=0; //禁止CAN发送
while(1) //主循环
{
if(UartFlage) //接收到串口数据
{
UartFlage=0;
Work1();
//RB7=0;
}
if(CanrecFlage) //接收到CAN总线数据
{
CanrecFlage=0;
Work2();
}
}
}
CANslave.c
/*
CAN总线程序(包括发送任务和接收任务)
程序: CANslave.c
版本号:V1.0
功能:
同时把接收的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 CAN_FLAG;
PIC18F2680CAN总 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)