打印
[活动专区]

【赛元95F】 + 10、SC95F8617 CAN发送测试

[复制链接]
602|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tlled|  楼主 | 2020-3-25 17:17 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
     测试下使用SPI方式驱动MCP2515来实现CAN通信,这次测试下CAN发送数据功能。

    一、电路

   1.1、使用SPI0端口
   

   1.2、CAN通信电路
   

    二、程序

    2.1、main.c
#include "config.h"

void main(void)
{
        uint i=0;
        uchar js=0;
        uchar can_tx_buf[8];
       
        Init_led();
        Init_uart(32, 9600);
        uart_chl(1);   //usb-ttl
        Init_mcp2515();
        while(1)
        {
                js++;
                can_tx_buf[7]=js;
                CAN_Send(can_tx_buf);
                for(i=0;i<50000;i++);

        }
}


    2.2、mcp2515.c
#include "config.h"

bit SPI0Flag;

void SPI0_Init(void)
{
        OTCON |= 0X10;    //SPI0
        US0CON0 = 0x3F;   
        US0CON1 = 0x01;   
        US0CON0 |= 0x80;  
        IE1 |= 0x01;
        EA = 1;
}

void SpiInt(void) interrupt 7   
{          
        if(US0CON1&0X08)   
        {
                US0CON1 &= ~0X08;
        }
        if(US0CON1&0X80)   
        {
                US0CON1 &= ~0X80;
                SPI0Flag = 1;
        }
}

void SPI0_WRITE(uchar dat)
{
        US0CON2 = dat;
        while(!SPI0Flag);
        SPI0Flag = 0;
}


void MCP2515_Reset(void)
{
        CAN_CS=0;
        SPI0_WRITE(CAN_RESET);
        CAN_CS=1;
}

void MCP2515_BitModity(uchar addr, uchar msk, uchar dat)
{
     CAN_CS=0;     
     SPI0_WRITE(CAN_BIT_MODIFY);      
     SPI0_WRITE(addr);                                                         
     SPI0_WRITE(msk);                                                                 
     SPI0_WRITE(dat);                                                         
     CAN_CS=1;
     return;
}

void SPI0_WriteByte(uchar adr,uchar dat)
{
        CAN_CS=0;
        SPI0_WRITE(CAN_WRITE);
        SPI0_WRITE(adr);
        SPI0_WRITE(dat);
        CAN_CS=1;
}

void CAN_Send(uchar *CAN_TX_Buf)
{
        uint i;
        MCP2515_BitModity(TXB0CTRL,0x08,0x00);   
        SPI0_WriteByte(TXB0SIDH,0x55);
        SPI0_WriteByte(TXB0SIDL,0x08);
        SPI0_WriteByte(TXB0EID8,0x55);
        SPI0_WriteByte(TXB0EID0,0x88);

        SPI0_WriteByte(TXB0DLC,DLC_8);         
        SPI0_WriteByte(TXB0D0,CAN_TX_Buf[0]);          
        SPI0_WriteByte(TXB0D1,CAN_TX_Buf[1]);
        SPI0_WriteByte(TXB0D2,CAN_TX_Buf[2]);
        SPI0_WriteByte(TXB0D3,CAN_TX_Buf[3]);
        SPI0_WriteByte(TXB0D4,CAN_TX_Buf[4]);
        SPI0_WriteByte(TXB0D5,CAN_TX_Buf[5]);
        SPI0_WriteByte(TXB0D6,CAN_TX_Buf[6]);
        SPI0_WriteByte(TXB0D7,CAN_TX_Buf[7]);
        CAN_CS=0;
        SPI0_WRITE(CAN_RTS | 0x01);               
        CAN_CS=1;
}

void Init_mcp2515(void)
{
        uint i;
        P0CON &= ~0x02;   //CANCS
        P0CON |= 0x02;
        P0PH |= 0x02;
       
        SPI0_Init();                   //SPI INIT
       
        MCP2515_Reset();
        for(i=0;i<5000;i++);
       
        MCP2515_BitModity(CANCTRL,0xE0,0x80);
        SPI0_WriteByte(CNF1,0x04);         //100k
        SPI0_WriteByte(CNF2,0x80|PHSEG1_3TQ|PRSEG_1TQ);                 
        SPI0_WriteByte(CNF3,PHSEG2_3TQ);                                                                                
        SPI0_WriteByte(CANINTF,0x00);                                                                       
        SPI0_WriteByte(CANINTE,0x03);       
                                       
        MCP2515_BitModity(CANCTRL,0xE0,0x00);
}
   
    2.3、mcp2515.h
#ifndef _MCP2515_H_
#define _MCP2515_H_

sbit CAN_CS = P0^1;

#define CANSTAT         0x0E
#define CANCTRL         0x0F
#define BFPCTRL         0x0C
#define TEC             0x1C
#define REC             0x1D
#define CNF3            0x28
#define CNF2            0x29
#define CNF1            0x2A
#define CANINTE         0x2B
#define CANINTF         0x2C
#define E**            0x2D
#define TXRTSCTRL       0x0D

#define RXF0SIDH        0x00
#define RXF0SIDL        0x01
#define RXF0EID8        0x02
#define RXF0EID0        0x03
#define RXF1SIDH        0x04
#define RXF1SIDL        0x05
#define RXF1EID8        0x06
#define RXF1EID0        0x07
#define RXF2SIDH        0x08
#define RXF2SIDL        0x09
#define RXF2EID8        0x0A
#define RXF2EID0        0x0B
#define RXF3SIDH        0x10
#define RXF3SIDL        0x11
#define RXF3EID8        0x12
#define RXF3EID0        0x13
#define RXF4SIDH        0x14
#define RXF4SIDL        0x15
#define RXF4EID8        0x16
#define RXF4EID0        0x17
#define RXF5SIDH        0x18
#define RXF5SIDL        0x19
#define RXF5EID8        0x1A
#define RXF5EID0        0x1B

#define RXM0SIDH        0x20
#define RXM0SIDL        0x21
#define RXM0EID8        0x22
#define RXM0EID0        0x23
#define RXM1SIDH        0x24
#define RXM1SIDL        0x25
#define RXM1EID8        0x26
#define RXM1EID0        0x27

#define TXB0CTRL        0x30
#define TXB0SIDH        0x31
#define TXB0SIDL        0x32
#define TXB0EID8        0x33
#define TXB0EID0        0x34
#define TXB0DLC         0x35
#define TXB0D0          0x36
#define TXB0D1          0x37
#define TXB0D2          0x38
#define TXB0D3          0x39
#define TXB0D4          0x3A
#define TXB0D5          0x3B
#define TXB0D6          0x3C
#define TXB0D7          0x3D
                        
#define TXB1CTRL        0x40
#define TXB1SIDH        0x41
#define TXB1SIDL        0x42
#define TXB1EID8        0x43
#define TXB1EID0        0x44
#define TXB1DLC         0x45
#define TXB1D0          0x46
#define TXB1D1          0x47
#define TXB1D2          0x48
#define TXB1D3          0x49
#define TXB1D4          0x4A
#define TXB1D5          0x4B
#define TXB1D6          0x4C
#define TXB1D7          0x4D

#define TXB2CTRL        0x50
#define TXB2SIDH        0x51
#define TXB2SIDL        0x52
#define TXB2EID8        0x53
#define TXB2EID0        0x54
#define TXB2DLC         0x55
#define TXB2D0          0x56
#define TXB2D1          0x57
#define TXB2D2          0x58
#define TXB2D3          0x59
#define TXB2D4          0x5A
#define TXB2D5          0x5B
#define TXB2D6          0x5C
#define TXB2D7          0x5D
                        
#define RXB0CTRL        0x60
#define RXB0SIDH        0x61
#define RXB0SIDL        0x62
#define RXB0EID8        0x63
#define RXB0EID0        0x64
#define RXB0DLC         0x65
#define RXB0D0          0x66
#define RXB0D1          0x67
#define RXB0D2          0x68
#define RXB0D3          0x69
#define RXB0D4          0x6A
#define RXB0D5          0x6B
#define RXB0D6          0x6C
#define RXB0D7          0x6D
                        
#define RXB1CTRL        0x70
#define RXB1SIDH        0x71
#define RXB1SIDL        0x72
#define RXB1EID8        0x73
#define RXB1EID0        0x74
#define RXB1DLC         0x75
#define RXB1D0          0x76
#define RXB1D1          0x77
#define RXB1D2          0x78
#define RXB1D3          0x79
#define RXB1D4          0x7A
#define RXB1D5          0x7B
#define RXB1D6          0x7C
#define RXB1D7          0x7D
                        
/* TXBnCTRL */
#define TXREQ           0x08
#define TXP             0x03   

/* RXBnCTRL */
#define RXM             0x60
#define BUKT            0x04

/* CANCTRL */
#define REQOP           0xE0
#define ABAT            0x10
#define        OSM                         0x08
#define CLKEN           0x04
#define CLKPRE          0x03

/* CANSTAT */
#define REQOP           0xE0
#define ICOD            0x0E

/* CANINTE */   
#define RX0IE           0x01
#define RX1IE           0x02
#define TX0IE           0x04
#define TX1IE           0x80
#define TX2IE           0x10
#define ERRIE           0x20
#define WAKIE           0x40
#define MERRE           0x80

/* CANINTF */   
#define RX0IF           0x01
#define RX1IF           0x02
#define TX0IF           0x04
#define TX1IF           0x80
#define TX2IF           0x10
#define ERRIF           0x20
#define WAKIF           0x40
#define MERRF           0x80

/* BFPCTRL */
#define B1BFS           0x20
#define B0BFS           0x10
#define B1BFE           0x08
#define B0BFE           0x04
#define B1BFM           0x02
#define B0BFM           0x01

/* CNF1 Masks */
#define SJW             0xC0
#define BRP             0x3F

/* CNF2 Masks */
#define BTLMODE         0x80
#define SAM             0x40
#define PHSEG1          0x38
#define PRSEG           0x07

/* CNF3 Masks */
#define WAKFIL          0x40
#define PHSEG2          0x07

/* TXRTSCTRL Masks */
#define TXB2RTS         0x04
#define TXB1RTS         0x02
#define TXB0RTS         0x01

/* CNF1 */
#define SJW_1TQ         0x40
#define SJW_2TQ         0x80
#define SJW_3TQ         0x90
#define SJW_4TQ         0xC0

/* CNF2 */
#define BTLMODE_CNF3    0x80
#define BTLMODE_PH1_IPT 0x00

#define SMPL_3X         0x40
#define SMPL_1X         0x00

#define PHSEG1_8TQ      0x38
#define PHSEG1_7TQ      0x30
#define PHSEG1_6TQ      0x28
#define PHSEG1_5TQ      0x20
#define PHSEG1_4TQ      0x18
#define PHSEG1_3TQ      0x10
#define PHSEG1_2TQ      0x08
#define PHSEG1_1TQ      0x00

#define PRSEG_8TQ       0x07
#define PRSEG_7TQ       0x06
#define PRSEG_6TQ       0x05
#define PRSEG_5TQ       0x04
#define PRSEG_4TQ       0x03
#define PRSEG_3TQ       0x02
#define PRSEG_2TQ       0x01
#define PRSEG_1TQ       0x00

/* CNF3 */
#define PHSEG2_8TQ      0x07
#define PHSEG2_7TQ      0x06
#define PHSEG2_6TQ      0x05
#define PHSEG2_5TQ      0x04
#define PHSEG2_4TQ      0x03
#define PHSEG2_3TQ      0x02
#define PHSEG2_2TQ      0x01
#define PHSEG2_1TQ      0x00

#define SOF_ENABLED     0x80
#define WAKFIL_ENABLED  0x40
#define WAKFIL_DISABLED 0x00   

/* CANINTE */
#define RX0IE_ENABLED   0x01
#define RX0IE_DISABLED  0x00
#define RX1IE_ENABLED   0x02
#define RX1IE_DISABLED  0x00
#define G_RXIE_ENABLED  0x03
#define G_RXIE_DISABLED 0x00

#define TX0IE_ENABLED   0x04
#define TX0IE_DISABLED  0x00
#define TX1IE_ENABLED   0x08
#define TX2IE_DISABLED  0x00
#define TX2IE_ENABLED   0x10
#define TX2IE_DISABLED  0x00
#define G_TXIE_ENABLED  0x1C
#define G_TXIE_DISABLED 0x00

#define ERRIE_ENABLED   0x20
#define ERRIE_DISABLED  0x00
#define WAKIE_ENABLED   0x40
#define WAKIE_DISABLED  0x00
#define IVRE_ENABLED    0x80
#define IVRE_DISABLED   0x00

/* CANINTF */
#define RX0IF_SET       0x01
#define RX0IF_RESET     0x00
#define RX1IF_SET       0x02
#define RX1IF_RESET     0x00
#define TX0IF_SET       0x04
#define TX0IF_RESET     0x00
#define TX1IF_SET       0x08
#define TX2IF_RESET     0x00
#define TX2IF_SET       0x10
#define TX2IF_RESET     0x00
#define ERRIF_SET       0x20
#define ERRIF_RESET     0x00
#define WAKIF_SET       0x40
#define WAKIF_RESET     0x00
#define IVRF_SET        0x80
#define IVRF_RESET      0x00

/* CANCTRL */
#define REQOP_CONFIG    0x80
#define REQOP_LISTEN    0x60
#define REQOP_LOOPBACK  0x40
#define REQOP_SLEEP     0x20
#define REQOP_NORMAL    0x00

#define ABORT           0x10

#define OSM_ENABLED     0x08
#define CLKOUT_ENABLED  0x04
#define CLKOUT_DISABLED 0x00
#define CLKOUT_PRE_8    0x03
#define CLKOUT_PRE_4    0x02
#define CLKOUT_PRE_2    0x01
#define CLKOUT_PRE_1    0x00
/* CANSTAT */
#define OPMODE_CONFIG   0x80
#define OPMODE_LISTEN   0x60
#define OPMODE_LOOPBACK 0x40
#define OPMODE_SLEEP    0x20
#define OPMODE_NORMAL   0x00
/* RXBnCTRL */
#define RXM_RCV_ALL     0x60
#define RXM_VALID_EXT   0x40
#define RXM_VALID_STD   0x20
#define RXM_VALID_ALL   0x00

#define RXRTR_REMOTE    0x08
#define RXRTR_NO_REMOTE 0x00

#define BUKT_ROLLOVER    0x04
#define BUKT_NO_ROLLOVER 0x00

#define FILHIT0_FLTR_1  0x01
#define FILHIT0_FLTR_0  0x00

#define FILHIT1_FLTR_5  0x05
#define FILHIT1_FLTR_4  0x04
#define FILHIT1_FLTR_3  0x03
#define FILHIT1_FLTR_2  0x02
#define FILHIT1_FLTR_1  0x01
#define FILHIT1_FLTR_0  0x00

/* TXBnCTRL */
#define TXREQ_SET       0x08
#define TXREQ_CLEAR     0x00

#define TXP_HIGHEST     0x03
#define TXP_INTER_HIGH  0x02
#define TXP_INTER_LOW   0x01
#define TXP_LOWEST      0x00
  
#define DLC_0          0x00
#define DLC_1          0x01
#define DLC_2          0x02
#define DLC_3          0x03
#define DLC_4          0x04
#define DLC_5          0x05
#define DLC_6          0x06
#define DLC_7          0x07   
#define DLC_8          0x08

#define CAN_RESET       0xC0                  //????
#define CAN_READ        0x03
#define CAN_WRITE       0x02
#define CAN_RTS         0x80                //??????
#define CAN_RTS_TXB0    0x81
#define CAN_RTS_TXB1    0x82
#define CAN_RTS_TXB2    0x84
#define CAN_RD_STATUS   0xA0
#define CAN_BIT_MODIFY  0x05  
#define CAN_RX_STATUS   0xB0
#define CAN_RD_RX_BUFF  0x90
#define CAN_LOAD_TX     0X40  

#define DUMMY_BYTE      0x00
#define TXB0            0x31
#define TXB1            0x41
#define TXB2            0x51
#define RXB0            0x61
#define RXB1            0x71
#define EXIDE_SET       0x08
#define EXIDE_RESET     0x00

//#define ABTF                6
//#define MLOA                5
//#define TXERR                4
//#define TXREQ                3
#define TXP1                1
#define TXP0                0
#define        EXIDE                3

#define FILHIT2                2
#define FILHIT1                1

#define        SRR                        4
#define        IDE                        3

#define        RTR                        6
#define        DLC3                3
#define        DLC2                2
#define        DLC1                1
#define DLC0                0

void Init_mcp2515(void);
void CAN_Send(uchar *CAN_TX_Buf);
       
#endif


    三、测试结果

    通过CAN卡查看接收的数据。
   


使用特权

评论回复

相关帖子

沙发
21ic小喇叭| | 2020-3-26 09:46 | 只看该作者
感谢分享,奖励您100家园币,家园币可以兑换礼品或抽奖,欢迎体验~

使用特权

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

本版积分规则

125

主题

691

帖子

6

粉丝