历史上的今天
返回首页

历史上的今天

今天是:2025年03月15日(星期六)

2020年03月15日 | PIC18F**K80的CAN通讯程序

2020-03-15 来源:eefocus

单片机: PIC18F45K80


关于帧ID的设置

CAN的帧ID分为标志帧和扩展帧,配置寄存器如下(这里仅贴上发送ID的寄存器(TXBnSIDH)配置,接收帧ID寄存器(RXBnSIDH)配置相同):

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

CAN通讯代码实现:


#include //芯片型号

//该程序实现发送缓冲器0向接收缓冲器0发送数据的自测试模式,其中接收采用中断方式

//发送采用查询方式

void GPIO_Init();


int CAN_FLAG; //定义标志寄存器

/*-------------------------------------------------------------------------

//*****************************CAN初始化子程序******************************

-------------------------------------------------------------------------*/


void initcan()

{

TRISB=(TRISB|0X08)&0XFB; //设置CANRX/RB3为输入,CANTX/RB2为输出

//设置CAN的波特率为125K,在Fosc=4M时,Tbit=8us,假设BRP=01h

//则TQ=[2*(1+BRP)]/Fosc=2*(1+1)/4=1us。

//NOMINAL BIT RATE=8TQ,SJW=1,Sync_Seg=1TQ,Prog _Seg=1TQ,Phase_Seg1=3TQ,Phase_Seg2=3TQ

CANCON=0X80; //请求进入CAN配置模式REQOP=100

while(CANSTAT&0X80==0){;} //等待进入CAN配置模式OPMODE=100

BRGCON1=0X01; //设置SJW和BRP,SJW=1TQ,BRP=01H

BRGCON2=0X90; //设置Phase_Seg1=3TQ和Prog _Seg=1TQ

BRGCON3=0X42; //设置Phase_Seg2=3TQ

/*-------------------------------------------------------------------------

//设置发送邮箱0标识符号和发送的数据 (当前扩展帧模式29位发送ID为:0x1fffffff)

-------------------------------------------------------------------------*/

/*标志帧模式发送ID设置如下*/

// TXB0CON=0X03; //发送优先级为最高优先级,TXPRI=11

// TXB0SIDH=0XFF; //设置发送缓冲器0的标准标识符,本程序采用标准识符

// TXB0SIDL=0XE0;


/*扩展帧模式发送ID设置如下*/

TXB0CON=0X03; //发送优先级为最高优先级,TXPRI=11

TXB0SIDH=0XFF;

TXB0SIDL=0XEB;       //配置扩展帧模式EXIDE=1, EID17=1,EID16=1

TXB0EIDH=0XFF;       //EID8-EID15

TXB0EIDL=0XFF;       //EID0-EID7


/*-------------------------------------------------------------------------

can发送数据长度设置,发送缓冲器初始化

-------------------------------------------------------------------------*/

TXB0DLC=0X08; //设置数据长度为8个字节

TXB0D0=0Xff; //写发送缓冲器数据区的数据

TXB0D1=0X88;

TXB0D2=0X02;

TXB0D3=0X03;

TXB0D4=0X04;

TXB0D5=0X05;

TXB0D6=0X06;

TXB0D7=0X07;

/*-------------------------------------------------------------------------

//设置接收邮箱0标识符号和接收的数据 (当前扩展帧模式29位接收ID为:0x1fffffff)

-------------------------------------------------------------------------*/

/*标志帧模式接收ID设置如下*/

// RXB0SIDH=0XFF; //设置发送缓冲器0的标准标识符,本程序采用标准识符

// RXB0SIDL=0XE0;

/*扩展帧模式接收ID设置如下*/

    RXB0SIDH=0XFF;

RXB0SIDL=0XEB;  //设置接收缓冲器0的标识符

    RXB0EIDH=0XFF;

    RXB0EIDL=0XFF;


RXB0CON=0X40; //仅仅接收标准标识符的有效信息,FILHIT0=0表示RXB0采用filter0

RXB0DLC=0X08; //设置接收缓冲器0的数据区长度

RXB0D0=0X00; //初始化接收缓冲器0的数据区数据

RXB0D1=0X00;

RXB0D2=0X00;

RXB0D3=0X00;

RXB0D4=0X00;

RXB0D5=0X00;

RXB0D6=0X00;

RXB0D7=0X00;


//初始化接收滤波器0和接收屏蔽,(扩展帧配置)

    

RXF0SIDH=0XFF;

RXF0SIDL=0XEB;  /*(EXIDEN = 1,使能扩展帧)*/

    RXF0EIDH=0XFF;

    RXF0EIDL=0XFF;


RXM0SIDH=0X00; /*无屏蔽*/

RXM0SIDL=0X00;


//初始化CAN模块的I/O控制寄存器

//CIOCON=0X00;


//使CAN进入某种工作模式模式

CANCON=0X00; //=0X40,进入自测试模式;=0x00,正常操作模式

while(CANSTAT&0XE0!=0){;}

//while(CANSTAT&0X40==0){;}



//初始化CAN的中断

PIR5=0X00; //清所有中断标志

PIE5=0X01; //使能接收缓冲器0的接收中断

}

/*-------------------------------------------------------------------------

*********************接收缓冲器0接收中断服务程序************************

-------------------------------------------------------------------------*/

void interrupt low_priority low_isr(void)

{

 if(RXB0IF==1) CAN_FLAG=1;

RXB0IF=0; //清接收中断标志

RXB0CON=RXB0CON&0x7f; //打开接收缓冲器来接收新信息

LATC3=0;

}



/*-------------------------------------------------------------------------

*********************************主程序***********************************

-------------------------------------------------------------------------*/

main(){

GPIO_Init();

INTCON=0x00; //禁止所有中断

initcan();

WDTCON=0; //=1,看门狗使能;=0,禁止看门狗

INTCON=0xc0; //使能中断

while(1){

TXB0CON=TXB0CON|0x08; //请求发送,TXREQ=1

while(TXB0IF!=1){;} //等待发送完成

while(CAN_FLAG==0){;} //等待接收数据  (将接收的数据返回)

  CAN_FLAG=0; //清接收到标志      

TXB0CON=TXB0CON&0xf7; //禁止发送

TXB0D0=RXB0D0; //用接收数据更新发送数据

TXB0D1=RXB0D1;

TXB0D2=RXB0D2;

TXB0D3=RXB0D3;

TXB0D4=RXB0D4;

TXB0D5=RXB0D5;

TXB0D6=RXB0D6;

TXB0D7=RXB0D7;

if(RXB0D0==0xff)  LATC3=0;

else  LATC3=1;

}

}


void GPIO_Init()

{

PORTE=0X00;

LATE=0X00;


PORTA=0X00;

LATA=0X00;


PORTC=0X00;

LATC=0X00;


TRISE=0X00;  //配置RE口全为输出口,RD-RE0,WR-RE1,CS-RE2

TRISA2=0;    //配置RA2口全为输出口,dat-RA2

TRISC3=0;    //配置RC3口全为输出口

LATC3=1;       //RC3置1点亮  V_LED

}

推荐阅读

史海拾趣

Fedco_Batteries公司的发展小趣事

随着公司业务的不断拓展,Fedco_Batteries始终将产品质量放在首位。公司引进了先进的生产设备和检测设备,建立了严格的质量管理体系。每一块电池在出厂前都要经过多道严格的质量检测,确保产品的稳定性和可靠性。这种对品质的坚持,让Fedco_Batteries的电池在市场上赢得了良好的口碑,越来越多的客户选择了他们的产品。

Graseby Infrared公司的发展小趣事
电动机负载过大或负载不平衡也可能导致接触器频繁动作。
Advanced Components Industries Inc公司的发展小趣事

在快速发展的过程中,ACI始终注重品质管理。公司建立了严格的质量检测体系,确保每一件产品都符合高标准的质量要求。同时,ACI还积极推行持续改进的理念,不断优化生产流程,提高生产效率。

这些努力使得ACI的产品在市场上赢得了良好的口碑。客户对公司的产品和服务给予了高度评价,纷纷表示愿意与ACI建立长期合作关系。这些正面的反馈进一步推动了ACI的发展。

Allianc公司的发展小趣事

在电子行业竞争日益激烈的背景下,Allianc公司深知只有不断创新才能保持竞争力。因此,公司加大了对研发创新的投入力度,建立了完善的研发体系和激励机制。通过持续的创新和优化,公司不断推出新产品和新技术,满足了市场的不断变化和消费者的多样化需求。这些创新举措不仅提升了公司的竞争力,也为公司的长期发展注入了新的动力。

Hexawave公司的发展小趣事

为了进一步扩大市场份额和提升品牌影响力,Allianc公司开始实施国际化战略。公司积极开拓海外市场,与多家国际知名企业建立了合作关系。同时,公司还加强了对海外市场的调研和分析,针对不同地区的消费者需求推出了定制化产品。这些举措使得Allianc公司在国际市场上的份额不断攀升,品牌影响力也逐渐增强。

DC Components公司的发展小趣事

为了进一步扩大市场份额,DC Components公司积极开拓国际市场。公司通过与全球客户的合作,将产品出口到多个国家和地区,实现了全球化布局。这种市场拓展策略不仅提升了公司的品牌影响力,还为公司的未来发展打开了更广阔的空间。

问答坊 | AI 解惑

CH375的U盘模块的升级/配置/演示工具

CH375的U盘模块的升级/配置/演示工具…

查看全部问答>

Protel 元件库文件和PCB库文件!

这是我整理编辑的Protel 元件库文件和PCB库文件。增加了很多新的元器件和新的封装元件,压缩包中一共有5个库存文件。      原系统所代的TTL和COMS库文件中元件的边框和小圆的线条比较细,是 Smallest ,这样打印出来的原理图 ...…

查看全部问答>

s3c2440中stepldr如何更改

请问各位如何修改s3c2440上的stepldr.nb1,用ads建立工程还是直接在PLATFORM里直接修改源码用PB编译生成?…

查看全部问答>

急求c51计数器实用编程

#include #define uchar unsigned char; #define uint unsigned int; uchar a[]={0xc0,0xf9,0xa4,0xb0,0x99, 0x92,0x82,0xf8,0x80,0x90}; uchar e,d,t; void chushihua(); uint x,y,b; main() {           ...…

查看全部问答>

求助GE PLC 系列6 与DC300故障原因

请较哪一位高手对GE PLC 系列6与DC 300驱动器控制系统熟悉一点的,小弟最近碰到一个难题,还没有得到彻底解决。故障现象:各机构的每个驱动器都显示FLA7,]而且系统控制复位无法合上。根据说明书,该故障由于通信出错引起的,但更换 ...…

查看全部问答>

MSP430G2开发板学习(五):IO端口学习

MSP430G2231的基本外设IO端口学习 #include   /*********************************************************************************** * Software Toggle P1.0 * P1DIR:端口输出输入方向设置寄存器 * P1OUT:端口数值寄存器&nbs ...…

查看全部问答>

STM32如何驱动3.5寸液晶屏?

大家帮着出出主意,看看有没有什么好的方法来用STM32单片机驱动3.5寸的液晶屏。 一般3.5寸的液晶屏自身都没有控制器,STM32上的哪些资源可以利用呢?怎样能使屏的刷新率又比较高呢?…

查看全部问答>

【设计工具】Xilinx CORDIC算法讲义

Xilinx公司的精品资料:Xilinx CORDIC算法讲义。 …

查看全部问答>