历史上的今天
今天是: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 }
史海拾趣
|
这是我整理编辑的Protel 元件库文件和PCB库文件。增加了很多新的元器件和新的封装元件,压缩包中一共有5个库存文件。 原系统所代的TTL和COMS库文件中元件的边框和小圆的线条比较细,是 Smallest ,这样打印出来的原理图 ...… 查看全部问答> |
|
#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与DC 300驱动器控制系统熟悉一点的,小弟最近碰到一个难题,还没有得到彻底解决。故障现象:各机构的每个驱动器都显示FLA7,]而且系统控制复位无法合上。根据说明书,该故障由于通信出错引起的,但更换 ...… 查看全部问答> |
|
MSP430G2231的基本外设IO端口学习 #include /*********************************************************************************** * Software Toggle P1.0 * P1DIR:端口输出输入方向设置寄存器 * P1OUT:端口数值寄存器&nbs ...… 查看全部问答> |
|
大家帮着出出主意,看看有没有什么好的方法来用STM32单片机驱动3.5寸的液晶屏。 一般3.5寸的液晶屏自身都没有控制器,STM32上的哪些资源可以利用呢?怎样能使屏的刷新率又比较高呢?… 查看全部问答> |




