打印
[PIC®/AVR®/dsPIC®产品]

PIC18lf458 CAN配置进入工作模式后就一直不停的往外发数据

[复制链接]
1411|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
CAN配置进入工作模式后为就一直不停的往外发数据,我main函数并没有发送数据,上位机接收显示只有一位数据,而且ID还不对,求大神帮忙看看

使用特权

评论回复
沙发
梦幻的帅帅|  楼主 | 2021-4-28 22:11 | 只看该作者
void InitCan(void)
{                                   
        TRISB=(TRISB|0x08)&0xFB;                // 数据方向寄存器   设置CANRX/RB3为输入,CANTX/RB2为输出   高电平输入,低电平输出

        CANCON = 0x80;                                    // CAN控制寄存器CANCON   请求配置模式  REQOP=100
        while(CANSTAT&0x80==0){;}                // 等待进入CAN配置模式OPMODE=100
                                    // 波特率寄存器BRGCONx(x=1,2, 3)决定了CAN 控制器的波特率、采样次数、同步跳转宽度和重同步方式
                                    // 500Kbps@16M     TBit=1*TQ+8*TQ+1*TQ+6*TQ=16*TQ=16*2/16=2      1/2 M=500 K              
//  BRGCON1 = 0x00;                  // 0000 0000       Sync_Seg=1*TQ     TQ = (2 x 1)/FOSC
//   BRGCON2 = 0xb8;                 // 1011 1000       Phase_Seg1=8*TQ  Prop_Seg=1*TQ
//   BRGCON3 = 0x05;                 // 0000 0101       Phase_Seg2=6*TQ
   
      BRGCON1 = 0xc0;                 // 1100 0000       Sync_Seg=4*TQ     TQ = (2 x 1)/20
      BRGCON2 = 0xb8;                 // 1011 1000       Phase_Seg1=8*TQ   Prop_Seg=1*TQ
      BRGCON3 = 0x06;                 // 0000 0110       Phase_Seg2=7*TQ
   

//  设置发送邮箱0标识符号和发送的数据
        TXB0CON=0x03;                                // TXB0发送优先级为最高优先级,TXPRI=11        00:最低优先级
        TXB0SIDH=0xFF;                                // 设置发送缓冲器0为标准标识符,ID = 0x7FF
        TXB0SIDL=0xE0;
        TXB0DLC=0x08;                                // 设置数据长度为8个字节

        TXB0D0=0X01;                                        // 写发送缓冲器数据区数据初值  TXBnDm:0 ≤ n < 3 and 0 < m < 8
        TXB0D1=0X02;                                       
        TXB0D2=0X03;                                          
        TXB0D3=0X04;       
        TXB0D4=0X05;       
        TXB0D5=0X06;       
        TXB0D6=0X07;       
        TXB0D7=0X08;       
//  设置接收邮箱0的标识符和初始化数据
        RXB0SIDH=0XFF;                                // 设置接收缓冲器0的标识符        ID = 0x3FF
        RXB0SIDL=0XE0;                      // SID2-SID0:111
        RXB0SIDH=0X00;                                // 设置接收缓冲器0的标识符        ID = 0x3FF
        RXB0SIDL=0X00;                      // SID2-SID0:111
   
        RXB0CON=0X20;                                        // 仅仅接收标准标识符,FILHIT0=0表示RXB0采用filter0
        RXB0DLC=0X08;                                        // 设置接收缓冲器0的数据区长度8个字节
       
        RXB0D0=0X00;                        // 初始化接收缓冲器0的数据区数据
    RXB0D1=0X00;
    RXB0D2=0X00;
    RXB0D3=0X00;
    RXB0D4=0X00;
    RXB0D5=0X00;
    RXB0D6=0X00;
    RXB0D7=0X00;

//  初始化接收滤波器0,Id = 0x26D = 0b 010 0110 1101
        RXF0SIDH=0b01001101;
        RXF0SIDL=0b10100000;

//  所有ID 都接受,不进行滤波
    RXM0SIDH=0X00;
        RXM0SIDL=0X00;

//        CIOCON=0X00;                    // 初始化CAN模块的I/O控制寄存器
        CANCON=0x00;                            //=0X40,进入自测试模式;=0x00,正常操作模式
        while(CANSTAT&0XE0!=0){;}   //1110 0000  等待进入正常操作模式

//初始化CAN的中断   PIC18F458
    PIR3=0X00;   //清所有中断标志
    PIE3=0X01;   //使能接收缓冲器0的接收中断  RXB0IE=1
    IPR3=0X01;   //接收缓冲器0的接收中断为最高优先级
}

使用特权

评论回复
板凳
梦幻的帅帅|  楼主 | 2021-4-28 22:12 | 只看该作者
void main(void)
{
    InitPORT();      //IO口初始化
    Timer1_Init();   //定时器初始化
    InitCan();       //CAN初始化
    Sys_GetAddr();   //读取地址
    while(1)
    {
       GetSensor();  //读取传感器值
   
    }
}

使用特权

评论回复
地板
梦幻的帅帅|  楼主 | 2021-4-28 22:13 | 只看该作者
main函数都还没开始写呢,都没发送数据,上位机却一直收到数据

使用特权

评论回复
5
梦幻的帅帅|  楼主 | 2021-4-28 22:14 | 只看该作者

7275860896d8b3dcf3.png (359.83 KB )

7275860896d8b3dcf3.png

使用特权

评论回复
6
梦幻的帅帅|  楼主 | 2021-4-28 22:34 | 只看该作者
上位机用的是CAN-USB的调试工具

使用特权

评论回复
7
systemchip| | 2021-4-28 23:30 | 只看该作者
你该看一看CANTX引脚波形

使用特权

评论回复
8
shhludb| | 2021-4-29 20:21 | 只看该作者
PIC30F和33F都调试过没有问题,只是设置波特率寄存器手册弄反了,调试几天,才摸索对,后来看到勘误表里说到这点了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

37

帖子

0

粉丝